@roxyapi/ui 0.15.0 → 0.15.1

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
@@ -79,7 +79,7 @@ var bo=Object.defineProperty;var Lo=Object.getOwnPropertyDescriptor;var p=(n,a,e
79
79
  `}function $i(n){let a=n.lagnaSign.toLowerCase();return re`
80
80
  ${Li(n.divisionLabel)}
81
81
  ${le.map(e=>vi(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,ao(e,n.lagnaSign)))}
82
- `}function Ct(n,a){switch(a){case"north":return xi(n);case"east":return $i(n);default:return mi(n)}}function At(n,a){return ve({items:si,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}import{css as wi}from"lit";var Pt=wi`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var Or=class extends g{constructor(){super(...arguments);this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Rt(this.data.chart.meta,r)}renderEmpty(){return pa`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let{division:t,vargottama:s}=e;return pa`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?pa`<span class="division-meta">· ${t.sanskritName}</span>`:Qt}</h2>${t.significance?pa`<p class="significance">${t.significance}</p>`:Qt}</div>${At(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${Ct(r,this.chartStyle)}</svg> ${s&&s.length>0?pa`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>pa`<span class="vargottama-pill" role="listitem">${v[o]??""} ${o}</span>`)}</div>`:Qt}</div>`}};Or.styles=[y,Pt,pe,ki`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],p([Ri({type:String,reflect:!0,attribute:"chart-style"})],Or.prototype,"chartStyle",2),Or=p([Si("roxy-divisional-chart")],Or);import{css as Ci,html as Ee,nothing as jr}from"lit";import{customElement as Ai,property as Pi}from"lit/decorators.js";var Di={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Ir=class extends g{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return Ee`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=Di[this.type]??this.type,s=(e.severity??"").toLowerCase(),o=s==="severe"?3:s==="moderate"?2:s==="mild"?1:0,i=o*33,l=o===3?"var(--roxy-danger)":o>=1?"var(--roxy-warning)":"transparent";return Ee`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${"type"in e&&e.type?Ee`<p class="subtype"><span class="subtype-label">${this.type==="sadhesati"?"Current phase":"Type"}</span>${e.type}</p>`:jr} ${e.severity?Ee`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${o}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:jr} ${e.description?Ee`<p class="description">${e.description}</p>`:jr} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?Ee`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>Ee`<li>${c}</li>`)}</ul></div>`:jr} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?Ee`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>Ee`<li>${c}</li>`)}</ul></div>`:jr}</article>`}renderEffects(e){if(!e.effects)return jr;let r=[];for(let[t,s]of Object.entries(e.effects))if(typeof s=="string"&&s.length>0)r.push(Ee`<div><h3>${t}</h3><p>${s}</p></div>`);else if(s&&typeof s=="object")for(let[o,i]of Object.entries(s))typeof i=="string"&&i.length>0&&r.push(Ee`<div><h3>${o}</h3><p>${i}</p></div>`);return r.length===0?jr:Ee`<div class="effects">${r}</div>`}};Ir.styles=[y,Ci`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.subtype{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.subtype .subtype-label{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-size:var(--roxy-text-xs,.75rem);margin-right:.4rem}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],p([Pi({type:String,reflect:!0})],Ir.prototype,"type",2),Ir=p([Ai("roxy-dosha-card")],Ir);import{css as zi,html as Xa,nothing as es}from"lit";import{customElement as Ti}from"lit/decorators.js";var ma=class extends g{renderData(a){return Xa`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?Xa`<span class="letter" aria-hidden="true">${a.letter}</span>`:es}<div><p class="label">Dream symbol</p>${a.name?Xa`<h2 class="name">${a.name}</h2>`:es}</div></header>${a.meaning?Xa`<p class="meaning">${a.meaning}</p>`:es}</article>`}renderEmpty(){return Xa`<div class="roxy-empty" role="status">No dream symbol</div>`}};ma.styles=[y,zi`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:2.5rem;height:2.5rem;color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-variant-numeric:tabular-nums;flex:none;justify-content:center;align-items:center;display:inline-flex}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}`],ma=p([Ti("roxy-dream-card")],ma);import{css as Mi,html as Dt,nothing as Ei}from"lit";import{customElement as Ni}from"lit/decorators.js";var ga=class extends g{renderEmpty(){return Dt`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(a){let e=a.symbols??[];if(e.length===0)return this.renderEmpty();let r=typeof a.total=="number"?a.total:e.length;return Dt`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${r} match${r===1?"":"es"}</span></header><ul class="grid">${e.map(t=>Dt`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?Dt`<span class="letter" aria-hidden="true">${t.letter}</span>`:Ei} <span class="name">${t.name}</span></button></li>`)}</ul></section>`}select(a){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:a.id,name:a.name,letter:a.letter},bubbles:!0,composed:!0}))}};ga.styles=[y,Mi`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.result{align-items:center;gap:var(--roxy-space-sm,.5rem);text-align:left;width:100%;font:inherit;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;background:0 0;transition:border-color .12s,background .12s;display:flex}.result:hover,.result:focus-visible{border-color:var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);outline:none}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:1.6rem;height:1.6rem;color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;flex:none;place-items:center;display:grid}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:500}`],ga=p([Ni("roxy-dream-search")],ga);import{css as Gi,html as Ne,LitElement as Hi,nothing as zt}from"lit";import{customElement as Oi,property as Qa,state as Tt}from"lit/decorators.js";var rs=new Map;async function ji(n){let a=rs.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw rs.delete(n),e}),rs.set(n,a)),a}var fe=class extends Hi{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(s=>s.required).filter(s=>this.values[s.key]===void 0||this.values[s.key]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.key)},bubbles:!0,composed:!0}));return}let t={};for(let s of this.fields){let o=this.values[s.key];if(!(o===void 0||o===""))if(s.group){let i=t[s.group]??{};i[s.name]=o,t[s.group]=i}else t[s.name]=o}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:t,queryKeys:this.fields.filter(s=>s.inQuery).map(s=>s.name)},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await ji(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let s=e.components?.schemas??{},o=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,s)}if(i?.properties){let c=new Set(i.required??[]);for(let[d,m]of Object.entries(i.properties)){let u=this.resolve(m,s)??{};if(u.type==="object"&&u.properties){let b=new Set(u.required??[]);for(let[$,S]of Object.entries(u.properties)){let U=this.resolve(S,s)??{};o.push({key:`${d}.${$}`,name:$,group:d,type:this.fieldType(U),required:c.has(d)&&b.has($),description:U.description,enum:U.enum,min:U.minimum,max:U.maximum,default:U.default})}}else o.push({key:d,name:d,type:this.fieldType(u),required:c.has(d),description:u.description,enum:u.enum,min:u.minimum,max:u.maximum,default:u.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let d=this.resolve(c.schema,s)??{};o.push({key:c.name,name:c.name,inQuery:c.in==="query",type:this.fieldType(d),required:!!c.required,description:d.description,enum:d.enum,default:d.default})}this.fields=o;let l={};for(let c of o){c.default!==void 0&&(l[c.key]=c.default);let d=c.group?this.initialValues?.[c.group]?.[c.name]:this.initialValues?.[c.name];d!==void 0&&(l[c.key]=d)}this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}groupHasLocation(e){let r=this.fields.filter(t=>t.group===e);return["latitude","longitude","timezone"].every(t=>r.some(s=>s.name===t))}onLocationFor(e){let r=e?`${e}.`:"";return t=>{let s=t.detail;s&&(this.values={...this.values,[`${r}latitude`]:s.latitude,[`${r}longitude`]:s.longitude,[`${r}timezone`]:s.timezone??s.utcOffset})}}render(){if(!this.loaded)return Ne`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return Ne`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return zt;let i=`roxy-form-${o.key}`;return Ne`<div class="field"><label for="${i}">${P(o.name)}${o.required?Ne`<span class="req" aria-hidden="true">*</span>`:zt}</label> ${o.enum?Ne`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>Ne`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:Ne`<input id="${i}" type="${this.htmlType(o.type)}" ?required="${o.required}" min="${o.min??""}" max="${o.max??""}" step="${o.type==="number"?"any":""}" .value="${this.values[o.key]??""}" @input="${l=>this.setValue(o.key,this.coerce(o.type,l.target.value))}">`} ${o.description?Ne`<small class="help">${o.description}</small>`:zt}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?Ne`<div class="location-block"><label>${o?`${P(o)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(o)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:zt,s=o=>Ne`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return Ne`<form @submit="${this.onSubmit}"><h2 class="title">${P(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):Ne`<fieldset class="person-group"><legend>${P(o)}</legend>${s(o)}</fieldset>`)} <button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};fe.styles=[y,Gi`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.person-group{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);margin:0 0 var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);min-inline-size:0;display:grid}.person-group legend{padding:0 var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],p([Qa({type:String,attribute:"data-endpoint"})],fe.prototype,"endpoint",2),p([Qa({type:String})],fe.prototype,"method",2),p([Qa({type:String,attribute:"spec-url"})],fe.prototype,"specUrl",2),p([Qa({type:String,attribute:"submit-label"})],fe.prototype,"submitLabel",2),p([Qa({attribute:!1})],fe.prototype,"initialValues",2),p([Tt()],fe.prototype,"fields",2),p([Tt()],fe.prototype,"values",2),p([Tt()],fe.prototype,"loaded",2),p([Tt()],fe.prototype,"specError",2),fe=p([Oi("roxy-endpoint-form")],fe);import{css as Ii,html as Ge,nothing as et}from"lit";import{customElement as Bi}from"lit/decorators.js";var ya=class extends g{renderEmpty(){return Ge`<div class="roxy-empty" role="status">No fixed star data</div>`}renderData(a){let e=a.conjunctions??[],r=a.stars??[];return Ge`<div class="wrap"><header><h2 class="title">Fixed stars</h2>${typeof a.orb=="number"?Ge`<span class="badge"><b>Orb</b> ${f(a.orb,1)}°</span>`:et}</header>${a.summary?Ge`<p class="summary">${a.summary}</p>`:et} ${e.length?Ge`<section><p class="subhead">Conjunctions to the chart</p>${e.map((t,s)=>Ge`<details class="interp-card" name="fixed-star-contacts" ?open="${s===0}"><summary><span class="interp-lead"><span class="point">${t.point}</span> conjunct ${t.star}</span> ${_()} <span class="interp-aside"><small>orb ${f(t.orb,2)}°</small></span></summary>${t.interpretation?Ge`<div class="interp-body"><p>${t.interpretation}</p></div>`:et}</details>`)}</section>`:Ge`<p class="empty-note">No star sits within the orb of a natal point.</p>`} ${r.length?this.renderCatalog(r):et}</div>`}renderCatalog(a){return Ge`<details class="catalog"><summary>${_()} Star catalog (${a.length})</summary><div class="scroll"><table><caption class="subhead">Precessed positions for the chart date</caption><thead><tr><th scope="col">Star</th><th scope="col">Position</th><th scope="col" class="num">Mag</th><th scope="col">Nature</th><th scope="col">Keywords</th></tr></thead><tbody>${a.map(e=>{let r=K[h(e.sign)];return Ge`<tr><td>${e.name}</td><td>${r?Ge`<span class="sg">${r}</span>`:et}${Ja(e.degree)} ${e.sign}</td><td class="num">${f(e.magnitude,1)}</td><td>${e.nature}</td><td><div class="kw">${(e.keywords??[]).map(t=>Ge`<span>${t}</span>`)}</div></td></tr>`})}</tbody></table></div></details>`}};ya.styles=[y,R,C,Ii`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);grid-template-columns:minmax(0,1fr);display:grid}header{align-items:baseline;gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);padding:2px 8px}.badge b{color:var(--roxy-accent-ink,#b45309);font-weight:600}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.empty-note{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.subhead{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-lead .point{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.interp-aside small{font-variant-numeric:tabular-nums}.catalog summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);align-items:center;gap:.5rem;font-weight:600;display:flex}.scroll{min-width:0;margin-top:var(--roxy-space-sm,.5rem);overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap;vertical-align:top;padding:6px 10px}th{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.04em;font-weight:600;font-size:var(--roxy-text-xs,.75rem)}td.num{text-align:right;font-variant-numeric:tabular-nums}.sg{color:var(--roxy-secondary,#475569);margin-right:.3rem}.kw{white-space:normal;flex-wrap:wrap;gap:.2rem;max-width:18rem;display:flex}.kw span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a);padding:0 6px}`],ya=p([Bi("roxy-fixed-stars")],ya);import{css as _i,html as nr,nothing as to}from"lit";import{customElement as Ki}from"lit/decorators.js";var ua=class extends g{renderEmpty(){return nr`<div class="roxy-empty" role="status">No digest data</div>`}renderData(a){let e=a.windows??[];if(e.length===0)return this.renderEmpty();let r=[T(a.startDate),T(a.endDate)].filter(Boolean).join(" \u2013 ");return nr`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?nr`<p class="subtitle">${r}</p>`:to}</div>${e.map(t=>this.renderWindow(t))}</div>`}windowLabel(a){return a===1?"Next 24 hours":typeof a=="number"?`Next ${a} days`:"Window"}renderWindow(a){let e=a.top??[],r=a.byDomain??{},t=Object.entries(r);return nr`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(a.days)}</span> <span class="window-count">${a.count??0} event${a.count===1?"":"s"}</span></div>${t.length>0?nr`<div class="domains">${t.map(([s,o])=>nr`<span class="domain-chip"><span class="swatch sw-${s}"></span>${P(s)} ${o}</span>`)}</div>`:to} ${e.length>0?nr`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:nr`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return nr`<div class="event" role="listitem"><span class="event-date">${T(a.date)}</span> <span class="event-desc">${a.description??P(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${f(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};ua.styles=[y,_i`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.window{gap:var(--roxy-space-sm,.5rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);display:grid}.window:first-of-type{border-top:none;padding-top:0}.window-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.window-label{font-weight:var(--roxy-weight-bold,600)}.window-count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.domains{flex-wrap:wrap;gap:.4rem;display:flex}.domain-chip{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:.35rem;display:inline-flex}.swatch{border-radius:2px;width:.65rem;height:.65rem;display:inline-block}.sw-western{background:var(--roxy-accent,#f59e0b)}.sw-vedic{background:var(--roxy-info,#2563eb)}.sw-biorhythm{background:var(--roxy-success,#16a34a)}.event{grid-template-columns:auto 1fr;align-items:baseline;gap:.25rem .6rem;display:grid}.event-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;white-space:nowrap}.event-desc{font-size:var(--roxy-text-sm,.875rem);line-height:1.4}.sig{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:2px;grid-column:2;height:4px;overflow:hidden}.sig-fill{border-radius:2px;height:100%;display:block}.sig-fill.western{background:var(--roxy-accent,#f59e0b)}.sig-fill.vedic{background:var(--roxy-info,#2563eb)}.sig-fill.biorhythm{background:var(--roxy-success,#16a34a)}.quiet{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}`],ua=p([Ki("roxy-forecast-digest")],ua);import{css as Yi,html as $e,nothing as rt}from"lit";import{customElement as Fi}from"lit/decorators.js";var qi={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Zi=["western","vedic","biorhythm"],ha=class extends g{renderEmpty(){return $e`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=Zi.filter(s=>e.some(o=>o.domain===s));return $e`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?$e`<div class="range">${T(a.startDate)} - ${T(a.endDate)} · ${a.count??e.length} events</div>`:rt}</header>${t.length?$e`<div class="legend">${t.map(s=>$e`<span><span class="swatch swatch-${s}"></span>${qi[s]}</span>`)}</div>`:rt} ${r.length?$e`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:$e`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(a){let e=new Map;for(let r of a){let t=r.date??"",s=e.get(t)??[];s.push(r),e.set(t,s)}return[...e.entries()]}renderDay(a,e){return $e`<div class="day" role="listitem"><div class="day-date">${T(a)}</div><div class="events">${e.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0,r=Math.max(0,Math.min(100,e));return $e`<div class="event"><span class="dot dot-${a.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(a)}</div>${a.description?$e`<p class="event-desc">${a.description}</p>`:rt}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${a.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(a){let e=a.body?h(a.body):"",r=a.target?h(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=Sr[t]??"",o=t?Za[t]??t:"",i=typeof a.orb=="number"?f(a.orb,1):"",l=this.typeQualifier(a);return t&&r?$e`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?$e`<span class="kind">orb ${i}°</span>`:rt}`:$e`<strong>${e||P(a.type??"")}</strong>${l?$e`<span class="kind">${l}</span>`:rt}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${h(a.target)}`:a.type==="retrograde-station"&&a.station?a.station:a.type==="eclipse"?[a.kind,"eclipse"].filter(Boolean).join(" "):a.type==="critical-day"?"critical day":a.type==="dasha-change"&&a.target?`dasha ${h(a.target)}`:P(a.type??"")}};ha.styles=[y,Yi`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],ha=p([Fi("roxy-forecast-timeline")],ha);import{css as Vi,html as Fe,nothing as xa}from"lit";import{customElement as Ui}from"lit/decorators.js";var Wi={varna:1,vashya:2,tara:3,yoni:4,"graha maitri":5,gana:6,bhakoot:7,nadi:8},fa=class extends g{renderEmpty(){return Fe`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(a){let e=(a.breakdown??[]).filter(d=>d?.category!==void 0),r=a.total??0,t=a.maxScore??36,s=r/t*100,o="color-mix(in srgb, var(--roxy-border) 50%, transparent)",i=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",l=s*2.827,c=(100-s)*2.827;return Fe`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${f(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?Fe`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Ds(a.percentage,1)}</small>`:xa}</div><div class="verdict-wrap">${typeof a.isCompatible=="boolean"?Fe`<span class="verdict ${a.isCompatible?"yes":"no"}">${a.isCompatible?"Compatible":"Not compatible"}</span>`:xa} ${a.recommendation?Fe`<span class="recommendation">${a.recommendation}</span>`:xa}</div></div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${o}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8" stroke-dasharray="${l},${c}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${e.length>0?Fe`<table><caption class="roxy-sr-only">Guna Milan breakdown: each koota with the classification of person 1 and person 2, and the score it earned out of its maximum.</caption><thead><tr><th scope="col">Koota</th><th scope="col">Person 1</th><th scope="col">Person 2</th><th scope="col" class="bar-col">Progress</th><th scope="col" class="score">Score</th></tr></thead><tbody>${e.map(d=>{let m=d.score??0,u=d.maxScore??Ji(d.category),b=u?m/u*100:0;return Fe`<tr><td>${d.category} ${d.description?Fe`<small>${d.description}</small>`:xa}</td><td class="classification">${d.person1??""}</td><td class="classification">${d.person2??""}</td><td class="bar-cell bar-col"><div class="mini-bar"><span style="width:${b}%"></span></div></td><td class="score">${f(m,1)} / ${u}</td></tr>`})}</tbody></table>`:xa} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?Fe`<div class="tags">${a.doshas?.map(d=>Fe`<span class="dosha">${d}</span>`)} ${a.doshaCancellations?.map(d=>Fe`<span class="cancel" title="${d.reason}">${d.dosha} cancelled</span>`)}</div>`:xa}</article>`}};fa.styles=[y,Vi`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.verdict-wrap{justify-items:end;gap:var(--roxy-space-xs,.25rem);text-align:right;display:grid}.verdict{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 10px}.verdict.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.verdict.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td small{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin-top:2px;line-height:1.5;display:block}td.classification{color:var(--roxy-secondary,#475569);white-space:nowrap}th.score{text-align:right}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:22%}@container (width<=32rem){.bar-col{display:none}}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],fa=p([Ui("roxy-guna-milan")],fa);function Ji(n){return n&&Wi[n.toLowerCase()]||1}import{css as Xi,html as fr,nothing as at}from"lit";import{customElement as Qi}from"lit/decorators.js";var ba=class extends g{renderData(a){let e=a.channels??[],r=a.centers??[],t=r.filter(s=>s.defined).length;return fr`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?fr`<span class="count">${a.totalChannels} channels</span>`:at}</header>${sr([{label:"Channels",value:a.totalChannels?.toString()},{label:"Combined definition",value:a.combinedDefinition?P(String(a.combinedDefinition)):void 0},{label:"Centers defined",value:r.length>0?`${t} of ${r.length}`:void 0}])}<p class="lead">A connection chart reads the two charts as one bodygraph. Wherever the two of them together hold both gates of a channel, that channel is defined between them, and the centers it joins are defined in the connection whether or not either person defines them alone.</p>${this.renderDynamics(a.summary)} ${this.renderCenters(r)} ${this.renderChannels(e,r)}</div>`}renderDynamics(a){if(!a)return at;let e=[{label:"Electromagnetic",aside:Mt(a.electromagnetic),body:"Each person holds one of the two gates, so the channel completes only when they are together. The classic point of attraction."},{label:"Dominance",aside:Mt(a.dominance),body:"One person holds both gates and the other holds neither, so the conditioning runs one way, from the person who carries the channel to the person who does not."},{label:"Compromise",aside:Mt(a.compromise),body:"One person holds both gates and the other holds a single hanging gate of the same channel, so the channel is complete for one of them and half open for the other."},{label:"Companionship",aside:Mt(a.companionship),body:"Both people independently hold both gates, so neither needs the other to complete it. A shared and familiar frequency rather than an attraction."}];return z(e,"hd-connection-dynamic","Dynamics")}renderCenters(a){return a.length===0?at:fr`<section class="block"><h3>Centers</h3><p class="note">Defined is the state of the combined chart. Beside it is who already defines that center in their own chart. A center defined only together is what the connection itself creates: it is there when the two are together and gone when they are apart. The combined definition counts how the defined centers hang together, so Single is one connected piece and a split is more than one.</p>${a.map(e=>{let r=e.definedBy??[],t=r.includes("A"),s=r.includes("B"),o=!!e.defined&&!t&&!s;return fr`<div class="row"><span class="cname">${e.name??P(String(e.id??""))}</span> <span class="badge ${e.defined?o?"together":"defined":"open"}">${e.defined?o?"Only together":"Defined":"Open"} </span><span class="who">${el(!!e.defined,t,s)}</span></div>`})}</section>`}renderChannels(a,e){if(a.length===0)return at;let r=new Map(e.map(s=>[String(s.id??""),s.name??""])),t=s=>r.get(s)||P(s);return fr`<section class="block"><h3>Channels</h3><div class="scroll" tabindex="0" role="region" aria-label="Connection channels"><table role="table"><caption class="roxy-sr-only">Connection channels: each channel with its gates, the centers it links, its circuit and dynamic, and the gates person A and person B each hold.</caption><thead><tr><th scope="col">Channel</th><th scope="col">Gates</th><th scope="col">Centers</th><th scope="col">Circuit</th><th scope="col">Dynamic</th><th scope="col">Person A holds</th><th scope="col">Person B holds</th></tr></thead><tbody>${a.map(s=>fr`<tr><td>${s.name??""}</td><td class="gates">${s.gateA}-${s.gateB}</td><td>${(s.centers??[]).map(t).join(" to ")}</td><td>${s.circuit??""}</td><td>${s.dynamic?fr`<span class="dyn">${s.dynamic}</span>`:at}</td><td class="held">${so(s.personAGates)}</td><td class="held">${so(s.personBGates)}</td></tr>`)}</tbody></table></div></section>`}renderEmpty(){return fr`<div class="roxy-empty" role="status">No connection data</div>`}};ba.styles=[y,R,C,hr,Xi`.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);grid-template-columns:minmax(0,1fr);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums}.note{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:1.6}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;display:flex}.row:last-child{border-bottom:none}.cname{flex:1;min-width:8rem}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 8px;display:inline-flex}.badge.defined{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.open{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.together{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a)}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr:last-child td{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.dyn{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);padding:1px 8px;display:inline-block}.held{font-variant-numeric:tabular-nums}.scroll{min-width:0;overflow-x:auto}`],ba=p([Qi("roxy-hd-connection")],ba);function Mt(n){if(typeof n=="number")return n===0?"None":n===1?"1 channel":`${n} channels`}function so(n){let a=n??[];return a.length>0?a.join(", "):"Neither"}function el(n,a,e){return a&&e?"Defined in both charts":a?"Defined by A":e?"Defined by B":n?"Defined by neither alone, only by the connection":"Open in both charts"}import{css as rl,html as we,nothing as br}from"lit";import{customElement as al}from"lit/decorators.js";var La=class extends g{renderData(a){let e=a.channels??[],r=a.gates??[],t=a.summary,s=t?.gapGates??[],o=e.some(i=>i.isCore);return we`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?we`<span class="count">${a.memberCount} members</span>`:br}</header>${sr([{label:"Members",value:a.memberCount?.toString()},{label:"Defined channels",value:typeof t?.definedChannels=="number"&&e.length>0?`${t.definedChannels} of ${e.length}`:void 0},{label:"Filled gates",value:typeof t?.filledGates=="number"&&r.length>0?`${t.filledGates} of ${r.length}`:void 0},{label:"Core",value:typeof t?.coreDefined=="boolean"?t.coreDefined?"Defined":"Open":void 0},{label:"Gap gates",value:s.length>0?s.join(", "):void 0}])}<p class="lead">A penta is the field three to five people form when they work as a group. It is read from the twelve penta gates the members bring between them: a channel with both of its gates held somewhere in the group is a defined Strength, and a gate no member holds is a gap the group has to compensate for.</p>${this.renderGroup("Upper (direction)",e.filter(i=>i.position==="upper"),"Upper channels run from the G Center to the Throat. They carry the leadership of the group and how it presents itself.")} ${this.renderGroup("Lower (execution)",e.filter(i=>i.position==="lower"),"Lower channels run from the G Center to the Sacral. They carry the managed, generative, resource work.")} ${this.renderGroup("Channels",e.filter(i=>i.position!=="upper"&&i.position!=="lower"))} ${o?we`<p class="footnote">Core is the 2/14 Channel of the Beat, the material core of the penta: gate 2 sets the direction for resources, gate 14 is the resources themselves.</p>`:br} ${this.renderGates(r)} ${e.length>0||r.length>0?we`<p class="footnote">Members are lettered in the order they were sent, so A is the first member of the group.</p>`:br}</div>`}renderGroup(a,e,r){return e.length===0?br:we`<div class="section"><h3>${a}</h3>${r?we`<p class="note">${r}</p>`:br} ${e.map(t=>we`<div class="row"><span class="gates">${t.gateA}-${t.gateB}</span> <span class="cname">${t.name??""} ${t.circuit?we`<span class="circuit">${t.circuit} circuit</span>`:br} </span><span class="badge ${t.defined?"defined":"open"}">${t.defined?"Defined":"Open"}</span> ${t.isCore?we`<span class="badge core">Core</span>`:br} <span class="held">Gate ${t.gateA} held by ${as(t.gateAHeldBy)}. Gate ${t.gateB} held by ${as(t.gateBHeldBy)}.</span></div>`)}</div>`}renderGates(a){if(a.length===0)return br;let e=a.filter(r=>r.filled).length;return we`<div class="section"><h3>Gates (${e} of ${a.length} filled)</h3><p class="note">The role each gate brings to the group, and who carries it. A gap is a role no member holds, so the group compensates for it.</p>${a.map(r=>we`<div class="row"><span class="gate-id">${r.gate}</span> <span class="cname">${r.gateName??""}</span> ${r.filled?we`<span class="who">Held by ${as(r.heldBy)}</span>`:we`<span class="badge gap">Gap</span>`}</div>`)}</div>`}renderEmpty(){return we`<div class="roxy-empty" role="status">No penta data</div>`}};La.styles=[y,hr,rl`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem)}.section h3{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.note{margin:var(--roxy-space-xs,.25rem) 0 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:1.6}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;display:flex}.row:last-child{border-bottom:none}.gates,.gate-id{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600);min-width:3.5rem}.cname{flex:1;min-width:8rem}.circuit{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);display:block}.held{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);flex-basis:100%;line-height:1.6}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 8px;display:inline-flex}.badge.defined{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.open{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.core{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.gap{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.footnote{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0;line-height:1.6}`],La=p([al("roxy-hd-penta")],La);var tl="ABCDE";function as(n){let a=(n??[]).map(e=>tl[e]??String(e+1));return a.length>0?a.join(", "):"nobody"}import{css as sl,html as va,nothing as ts}from"lit";import{customElement as ol}from"lit/decorators.js";var $a=class extends g{renderEmpty(){return va`<div class="roxy-empty" role="status">No Human Design data</div>`}renderData(a){return nl(a)?this.renderType(a):this.renderProfile(a)}renderType(a){return va`<div class="wrap"><header class="head"><h2 class="title">Type</h2>${a.type||a.profile?va`<div class="type-line">${[a.type,a.profile?`Profile ${a.profile}`:""].filter(Boolean).join(" \xB7 ")}</div>`:ts}</header>${sr([{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile}])} ${a.typeDescription?va`<p class="lead">${a.typeDescription}</p>`:ts} ${Lt(a.signature,a.notSelf)} ${vt([{label:"Strategy",aside:a.strategy,body:a.strategyDescription},{label:"Authority",aside:a.authority,body:a.authorityDescription},{label:"Aura",body:a.aura}],"hd-type-reading")}</div>`}renderProfile(a){return va`<div class="wrap"><header class="head"><h2 class="title">Profile</h2>${a.profile?va`<div class="type-line">${a.profile}</div>`:ts}</header>${sr([{label:"Profile",value:a.profile},{label:"Personality line",value:a.personalityLine?.toString()},{label:"Design line",value:a.designLine?.toString()}])}<section class="block"><h3>Lines</h3>${$t({personality:a.personalityKeynote,personalityLine:a.personalityLine,design:a.designKeynote,designLine:a.designLine})}</section></div>`}};$a.styles=[y,R,C,hr,sl`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.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)}`],$a=p([ol("roxy-hd-type-card")],$a);function nl(n){return typeof n.type=="string"}import{css as il,html as ce,nothing as He}from"lit";import{customElement as ll}from"lit/decorators.js";var wa=class extends g{renderData(a){let e=[...a.arrows??[]].sort((r,t)=>oo(r.position)-oo(t.position));return ce`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(r=>this.renderArrow(r))}</div>${a.confident===!1?ce`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof a.confidenceMarginDeg=="number"?` (within ${a.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:He} ${this.renderReading(e,a.baseDescription)}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return ce`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?ce`<span class="layer">${a.layer}</span>`:He} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?ce`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}${a.baseName?`, ${a.baseName}`:""}</span>`:He} ${a.activation?.planet?ce`<span class="ctb">${[a.activation.planet,h(a.activation.side??"")].filter(Boolean).join(" \xB7 ")}</span>`:He} ${a.confident===!1?ce`<span class="note" role="note">Knife-edge: could flip with a more precise birth time.</span>`:He}</div>`}renderReading(a,e){let r=a.filter(o=>o.description||o.colorMeaning);if(r.length===0)return He;let t=new Map;for(let o of r){let i=o.layer??"",l=t.get(i);l?l.push(o):t.set(i,[o])}let s=0;return ce`<section class="block"><h3>Reading</h3>${[...t].map(([o,i])=>ce`<div class="group">${o?ce`<p class="group-head">${o}</p>`:He} ${i[0]?.layerDescription?ce`<p class="group-note">${i[0].layerDescription}</p>`:He} ${i.map(l=>this.renderArrowReading(l,s++===0))}</div>`)} ${e?ce`<p class="footnote">Base. ${e}</p>`:He}</section>`}renderArrowReading(a,e){let r=a.cognition,t=[{label:"Color",body:a.colorMeaning},{label:"Tone",body:a.toneMeaning},{label:"Direction",body:a.directionMeaning},{label:r?.label?`Cognition \xB7 ${r.label}`:"Cognition",body:r?.description}].filter(s=>!!s.body);return ce`<details class="interp-card" name="hd-variable" ?open="${e}"><summary><span class="interp-lead">${a.name??""}</span> ${_()} ${a.position?ce`<span class="interp-aside"><small>${a.position}</small></span>`:He}</summary><div class="interp-body">${a.description?ce`<p>${a.description}</p>`:He} ${t.length>0?ce`<dl class="facets">${t.map(s=>ce`<dt>${s.label}</dt><dd>${s.body}</dd>`)}</dl>`:He}</div></details>`}renderEmpty(){return ce`<div class="roxy-empty" role="status">No variables data</div>`}};wa.styles=[y,R,C,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}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.arrow{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-xs,.25rem);align-content:start;display:grid}.arrow-head{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:1.75rem;line-height:1}.name{font-weight:var(--roxy-weight-bold,600)}.layer{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.labels{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.ctb{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.note{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-warning-fg,#9a3412)}@container (width<=28rem){.grid{grid-template-columns:minmax(0,1fr)}}.group{margin-bottom:var(--roxy-space-md,1rem)}.group:last-of-type{margin-bottom:0}.group-head{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.group-note{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:1.6}.facets{gap:var(--roxy-space-xs,.25rem);margin:0;display:grid}.facets dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.facets dd{margin:0}.footnote{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0;line-height:1.6}`],wa=p([ll("roxy-hd-variables")],wa);function oo(n){switch(n){case"Top left":return 0;case"Top right":return 1;case"Bottom left":return 2;case"Bottom right":return 3;default:return 99}}import{css as dl,html as be,nothing as ke,svg as no}from"lit";import{customElement as cl,property as pl}from"lit/decorators.js";var Br=class extends g{constructor(){super(...arguments);this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}renderEmpty(){return be`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:r,lines:t,changingLinePositions:s,dailyMessage:o,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(s??[]);return be`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?be`<div class="symbol">${r.symbol}</div>`:ke}<div class="lines" aria-hidden="true">${l.slice().reverse().map((d,m)=>{let u=l.length-1-m+1,b=c.has(u),$=d===6||d===8;return be`<div class="line ${`${$?"broken":"solid"}${b?" changing":""}`}">${$?no`<span class="seg"></span><span class="seg"></span>`:no`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${[r.number!=null?`${r.number}.`:"",r.english??r.chinese??"Hexagram"].filter(Boolean).join(" ")}</h2><p class="subtitle">${r.chinese?be`${r.chinese}`:ke} ${r.pinyin?be`· ${r.pinyin}`:ke}</p><div class="trigrams">${r.upperTrigram?be`<div>Upper <span class="tri-glyph">${Kt[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:ke} ${r.lowerTrigram?be`<div>Lower <span class="tri-glyph">${Kt[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:ke}</div>${r.judgment?be`<p class="judgment">${r.judgment}</p>`:ke} ${r.image?be`<p class="image">${r.image}</p>`:ke} ${o?be`<p class="message">${o}</p>`:ke} ${r.interpretation?.general?be`<p>${r.interpretation.general}</p>`:ke} ${c.size>0?be`<div class="changing">Changing lines: ${Array.from(c).sort((d,m)=>d-m).join(", ")}. ${i?.english?be`Becomes hexagram ${i.number} ${i.english}.`:ke}</div>`:ke} ${this.renderLines(r,c)}</div></article>`}renderLines(e,r){let t=e.changingLines??[];if(t.length===0)return ke;let s=r.size>0,o=s?t.filter(l=>r.has(l.position)):t;if(o.length===0)return ke;let i=o.map(l=>({label:`Line ${l.position}`,body:l.text??"",extra:l.meaning?be`<p class="line-meaning">${l.meaning}</p>`:ke}));return z(i,"hexagram-lines",s?"Changing lines":"Lines")}derivedLines(e){let r=e.binary??"";return/^[01]{6}$/.test(r)?Array.from(r,t=>t==="1"?7:8):Array.from({length:6},()=>7)}};Br.styles=[y,R,C,dl`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);align-content:start;align-self:start;justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.line-meaning{padding-left:var(--roxy-space-sm,.5rem);border-left:2px solid var(--roxy-border,#e4e4e7);color:var(--roxy-muted,#71717a);margin:0}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],p([pl({type:String,reflect:!0})],Br.prototype,"mode",2),Br=p([cl("roxy-hexagram")],Br);import{css as ml,html as ka,nothing as ss}from"lit";import{customElement as gl}from"lit/decorators.js";var Sa=class extends g{renderEmpty(){return ka`<div class="roxy-empty" role="status">No hora data</div>`}renderData(a){let e=a.dayHoras??[],r=a.nightHoras??[];return e.length===0&&r.length===0?this.renderEmpty():ka`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?ka`<p class="subtitle">${a.date}</p>`:ss}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?ss:ka`<div class="col"><p class="section-label">${a}</p>${e.map(r=>ka`<div class="row"><span class="glyph" aria-hidden="true">${v[h(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${gr(r)}</span> ${typeof r.number=="number"?ka`<span class="num">${r.number}</span>`:ss}</div>`)}</div>`}};Sa.styles=[y,ml`.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);grid-template-columns:minmax(0,1fr);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.cols{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-xs,.25rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);display:flex}.row:last-child{border-bottom:none}.glyph{color:var(--roxy-accent-ink,#b45309);text-align:center;width:1.25em;font-size:1.15em;line-height:1}.planet{flex:1;font-weight:500}.time{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;white-space:nowrap}.num{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right;width:1.5em}@container (width<=30rem){.cols{grid-template-columns:1fr}}`],Sa=p([gl("roxy-hora-table")],Sa);import{css as yl,html as E,nothing as X}from"lit";import{customElement as ul,property as hl}from"lit/decorators.js";var _r=class extends g{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return E`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?K[h(r)]??"":"",s="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,o="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return E`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${o?E`<div class="date">${o}</div>`:X}</div>${s!==null?E`<span class="energy" aria-label="${`Energy ${s} of 10`}">Energy ${s}/10 <span class="energy-bar"><span style="width:${s/10*100}%"></span></span></span>`:X}</header>${e.overview?E`<p class="overview">${e.overview}</p>`:X} ${this.renderSky(e)}<div class="sections">${e.love?E`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:X} ${e.career?E`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:X} ${e.health?E`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:X} ${e.finance?E`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:X} ${"advice"in e&&e.advice?E`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:X}</div>${this.renderMonth(e)} ${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],d="luckyDays"in e&&e.luckyDays?e.luckyDays:[],m=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&d.length===0&&m.length===0?X:E`<div class="lucky">${i!==void 0?E`<span>Lucky number <strong>${i}</strong></span>`:X} ${l?E`<span>Lucky color <strong>${l}</strong></span>`:X} ${c.length?E`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:X} ${d.length?E`<span>Lucky days <strong>${d.join(", ")}</strong></span>`:X} ${m.length?E`<span class="compat-wrap">Best with <span class="compat">${m.map(u=>E`<span>${u}</span>`)}</span></span>`:X}</div>`})()}</article>`}renderSky(e){let r="moonSign"in e?e.moonSign:"",t="moonPhase"in e?e.moonPhase:"",s=("activeTransits"in e?e.activeTransits:[])??[];if(!r&&!t&&s.length===0)return X;let o=r?K[h(r)]??"":"";return E`<div class="sky">${r||t?E`<div class="moon-line">${r?E`<span><span class="lbl">Moon</span> <span aria-hidden="true">${o}</span> <b>${r}</b></span>`:X} ${t?E`<span><span class="lbl">Phase</span> <b>${t}</b></span>`:X}</div>`:X} ${s.length?E`<ul class="transits" aria-label="Active transits">${s.map(i=>E`<li>${i}</li>`)}</ul>`:X}</div>`}renderMonth(e){let r=("weekByWeek"in e?e.weekByWeek:[])??[],t=("keyDates"in e?e.keyDates:[])??[];return r.length===0&&t.length===0?X:E`${r.length?E`<section><h3 class="block-title">Week by week</h3><div class="weeks">${r.map(s=>E`<div class="week"><span class="week-no">Week ${s.week}</span><div><div class="week-focus">${s.focus}</div>${s.advice?E`<p class="week-advice">${s.advice}</p>`:X}</div></div>`)}</div></section>`:X} ${t.length?E`<section><h3 class="block-title">Key dates</h3><dl class="dates">${t.map(s=>E`<div class="date-row"><dt>${T(s.date)||s.date}</dt><dd>${s.event}</dd></div>`)}</dl></section>`:X}`}};_r.styles=[y,yl`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}.sky{gap:var(--roxy-space-sm,.5rem);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);display:grid}.moon-line{align-items:baseline;gap:.35rem var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;display:flex}.moon-line b{font-weight:var(--roxy-weight-bold,600)}.moon-line .lbl{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin-right:.35rem}.transits{gap:.25rem;margin:0;padding:0;list-style:none;display:grid}.transits li{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);padding-left:.9rem;position:relative}.transits li:before{content:"";background:var(--roxy-accent,#f59e0b);border-radius:50%;width:5px;height:5px;position:absolute;top:.5em;left:0}.block-title{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.weeks{gap:var(--roxy-space-sm,.5rem);display:grid}.week{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);grid-template-columns:3.5rem 1fr;align-items:baseline;display:grid}.week:first-child{border-top:0;padding-top:0}.week-no{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)}.week-focus{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem)}.week-advice{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:.15rem 0 0}.dates{gap:.3rem var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:max-content 1fr;margin:0;display:grid}.date-row{display:contents}.date-row dt{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600);white-space:nowrap}.date-row dd{color:var(--roxy-fg,#0a0a0a);margin:0}`],p([hl({type:String,reflect:!0})],_r.prototype,"period",2),_r=p([ul("roxy-horoscope-card")],_r);import{css as xl,html as I,nothing as Je}from"lit";import{customElement as fl,state as bl}from"lit/decorators.js";var Ll=[{id:"planets",label:"Planets"},{id:"cusps",label:"Cusps"},{id:"significators",label:"Significators"}],Et=[1,2,3,4];function os(n,a){return n?typeof a=="number"?`${n} ${a}`:n:""}function io(n){return[...new Set(n.map(String))].join(" > ")}var Kr=class extends g{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(s=>({name:s.planet,longitude:s.longitude,house:s.house,nakshatra:s.nakshatra,pada:s.pada,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,kpNumber:s.kpNumber,retrograde:s.retrograde})),t=e.nodes;for(let[s,o]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])o&&r.push({name:s,longitude:o.longitude,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,retrograde:!0});return r}renderEmpty(){return I`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return I`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?I`<div class="asc">Ascendant: <strong>${typeof r.longitude=="number"?Me(r.longitude):r.sign??""} </strong>${r.nakshatra?I`· ${os(r.nakshatra,r.pada)}`:Je} ${r.subLord?I`· sub lord ${r.subLord}`:Je} ${typeof r.kpNumber=="number"?I`· KP ${r.kpNumber}`:Je}</div>`:Je} ${typeof e.meta?.ayanamsa=="number"?I`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${f(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?I`· ${e.meta.houseSystem} houses`:Je}</div>`:Je}</header>${ve({items:Ll,active:this.activeTab,onSelect:t=>{this.activeTab=t},label:"KP chart views",idPrefix:"kp",controls:!0})}<div id="kp-panel-${this.activeTab}" role="tabpanel" aria-labelledby="kp-tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.activeTab==="cusps"?this.renderCusps():this.renderSignificators()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?I`<table role="table"><caption class="roxy-sr-only">KP planets and nodes: each body with its position, house, nakshatra and pada, star lord, sub lord, sub sub lord and KP number.</caption><thead><tr><th scope="col">Body</th><th scope="col">Position</th><th scope="col">House</th><th scope="col">Nakshatra, pada</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>I`<tr><td class="body">${r.name}${r.retrograde?I`<span class="retro">R</span>`:Je}</td><td class="num">${typeof r.longitude=="number"?Me(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${os(r.nakshatra,r.pada)}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:I`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?I`<table role="table"><caption class="roxy-sr-only">KP Placidus cusps: each house cusp with its position, sign lord, nakshatra and pada, star lord, sub lord, sub sub lord and KP number.</caption><thead><tr><th scope="col">House</th><th scope="col">Position</th><th scope="col">Sign lord</th><th scope="col">Nakshatra, pada</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>I`<tr><td class="body num">${r.house}</td><td class="num">${typeof r.longitude=="number"?Me(r.longitude):r.sign??""}</td><td>${r.signLord??""}</td><td>${os(r.nakshatra,r.pada)}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:I`<p class="roxy-empty" role="status">No cusps</p>`}renderSignificators(){let e=this.data?.significators,r=e?.houseWise??[],t=e?.planetWise??[];return!r.length&&!t.length?I`<p class="roxy-empty" role="status">No significators</p>`:I`${this.renderLevelLegend(r)} ${r.length?I`<div class="sig-head"><h3 class="sig-title">House-wise significators</h3><p class="sig-note">Planets that signify each house, strongest level first.</p></div><table role="table"><caption class="roxy-sr-only">KP house-wise significators: each house, the planets that signify it at levels 1 to 4, and the full strength order.</caption><thead><tr><th scope="col">House</th>${Et.map(s=>I`<th scope="col">L${s}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${r.map(s=>I`<tr><td class="body num">${s.house}</td>${Et.map(o=>this.renderCell(this.planetsAtLevel(s,o).join(", ")))}<td class="chain">${io(s.all??[])}</td></tr>`)}</tbody></table>`:Je} ${t.length?I`<div class="sig-head"><h3 class="sig-title">Planet-wise significators</h3><p class="sig-note">Houses each planet signifies, strongest level first.</p></div><table role="table"><caption class="roxy-sr-only">KP planet-wise significators: each planet, the houses it signifies at levels 1 to 4, and the full strength order.</caption><thead><tr><th scope="col">Planet</th>${Et.map(s=>I`<th scope="col">L${s}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${t.map(s=>I`<tr><td class="body">${s.planet}</td>${Et.map(o=>this.renderCell(this.housesAtLevel(s,o).join(", ")))}<td class="chain">${io(s.allHouses??[])}</td></tr>`)}</tbody></table>`:Je}`}renderCell(e){return e?I`<td>${e}</td>`:I`<td class="empty-cell">none</td>`}planetsAtLevel(e,r){return(e.significators??[]).filter(t=>t.level===r).flatMap(t=>t.planets??[])}housesAtLevel(e,r){return(e.signifies??[]).filter(t=>t.level===r).flatMap(t=>t.houses??[])}renderLevelLegend(e){let r=new Map;for(let t of e)for(let s of t.significators??[])s.description&&!r.has(s.level)&&r.set(s.level,s.description);return r.size===0?Je:I`<ul class="legend" aria-label="Significator levels">${[...r.entries()].sort((t,s)=>t[0]-s[0]).map(([t,s])=>I`<li><b>L${t}</b>${s}</li>`)}</ul>`}};Kr.styles=[y,pe,xl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);width:100%;overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.roxy-tablist{padding:0 var(--roxy-space-md,1rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}.sig-head{padding:var(--roxy-space-md,1rem) var(--roxy-space-md,1rem) 0;gap:var(--roxy-space-xs,.25rem);display:grid}.sig-title{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.sig-note{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:0}.legend{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);padding:var(--roxy-space-md,1rem) var(--roxy-space-md,1rem) 0;color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);flex-wrap:wrap;margin:0;list-style:none;display:flex}.legend b{color:var(--roxy-accent-ink,#b45309);margin-right:4px}.chain,.empty-cell{color:var(--roxy-muted,#71717a)}`],p([bl()],Kr.prototype,"activeTab",2),Kr=p([fl("roxy-kp-chart")],Kr);import{css as vl,html as tt,nothing as lo}from"lit";import{customElement as $l}from"lit/decorators.js";var Ra=class extends g{renderEmpty(){return tt`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return tt`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?tt`<span class="ayanamsa">Ayanamsa: ${f(a.ayanamsa,2)}°</span>`:lo}</header><table role="table"><caption class="roxy-sr-only">KP planets: each planet with its sign, sign lord, nakshatra, star lord, sub lord, sub sub lord and KP number.</caption><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>tt`<tr><td class="planet">${r.planet} ${r.retrograde?tt`<span class="retro">R</span>`:lo}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Ra.styles=[y,vl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],Ra=p([$l("roxy-kp-planets-table")],Ra);import{css as wl,html as Yr,nothing as ns}from"lit";import{customElement as kl}from"lit/decorators.js";var Ca=class extends g{renderEmpty(){return Yr`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return Yr`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?Yr`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:ns}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${a.moonSignLord??""}</dd><dt>Star lord</dt><dd>${a.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${a.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${a.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${a.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${a.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.lagnaSubSublord??""}</dd></dl></div></div>${a.rulingPlanets?.length?Yr`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>Yr`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:ns} ${e.length?Yr`<table><caption class="roxy-sr-only">House significators: each ruling planet and the houses it signifies.</caption><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${e.map(r=>Yr`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:ns}</div>`}};Ca.styles=[y,wl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],Ca=p([kl("roxy-kp-ruling-planets")],Ca);import{css as Sl,html as Lr,nothing as Nt,svg as Gt}from"lit";import{customElement as Rl}from"lit/decorators.js";var is=320,Oe=is/2,ir=128,Cl=118,Al=140,Pl=150;function lr(n,a){let e=n*Math.PI/180;return{x:Oe+a*Math.sin(e),y:Oe-a*Math.cos(e)}}var Dl=[{az:0,label:"N"},{az:45,label:"NE"},{az:90,label:"E"},{az:135,label:"SE"},{az:180,label:"S"},{az:225,label:"SW"},{az:270,label:"W"},{az:315,label:"NW"}],Aa=class extends g{renderEmpty(){return Lr`<div class="roxy-empty" role="status">No local space data</div>`}renderData(a){let e=a.bodies??[],r=a.birthDetails;return Lr`<div class="wrap"><header><h2 class="title">Local space</h2>${r?Lr`<div class="meta">${[r.date,r.time].filter(Boolean).join(" \xB7 ")}</div>`:Nt}</header>${this.renderDial(e)} ${a.summary?Lr`<p class="summary">${a.summary}</p>`:Nt} ${this.renderList(e)}</div>`}renderDial(a){return Lr`<svg viewBox="0 0 ${is} ${is}" role="img" aria-label="Local space compass of planetary directions from the birthplace"><title>Local space compass</title><desc>A compass centered on the birthplace. Each body is a line pointing to its azimuth, clockwise from north. Bodies below the horizon are dimmed.</desc><circle class="dial-fill" cx="${Oe}" cy="${Oe}" r="${ir}"/><circle class="dial" cx="${Oe}" cy="${Oe}" r="${ir*.66}" stroke-width="0.5"/><circle class="dial" cx="${Oe}" cy="${Oe}" r="${ir*.33}" stroke-width="0.5"/>${this.renderCompassRing()} ${this.renderSpokes(a)}<circle class="center-dot" cx="${Oe}" cy="${Oe}" r="2.5"/></svg>`}renderCompassRing(){let a=[];for(let i=0;i<360;i+=22.5){let l=lr(i,ir),c=lr(i,ir-(i%45===0?8:4));a.push(Gt`<line class="tick" x1=${c.x} y1=${c.y} x2=${l.x} y2=${l.y} />`)}let e=lr(0,ir),r=lr(180,ir),t=lr(90,ir),s=lr(270,ir),o=Dl.map(({az:i,label:l})=>{let c=lr(i,Pl),d=i%90===0;return Gt`<text class=${`compass-label${d?" cardinal":""}`} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${l}</text>`});return Gt`
82
+ `}function Ct(n,a){switch(a){case"north":return xi(n);case"east":return $i(n);default:return mi(n)}}function At(n,a){return ve({items:si,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}import{css as wi}from"lit";var Pt=wi`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var Or=class extends g{constructor(){super(...arguments);this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Rt(this.data.chart.meta,r)}renderEmpty(){return pa`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let{division:t,vargottama:s}=e;return pa`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?pa`<span class="division-meta">· ${t.sanskritName}</span>`:Qt}</h2>${t.significance?pa`<p class="significance">${t.significance}</p>`:Qt}</div>${At(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${Ct(r,this.chartStyle)}</svg> ${s&&s.length>0?pa`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>pa`<span class="vargottama-pill" role="listitem">${v[o]??""} ${o}</span>`)}</div>`:Qt}</div>`}};Or.styles=[y,Pt,pe,ki`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],p([Ri({type:String,reflect:!0,attribute:"chart-style"})],Or.prototype,"chartStyle",2),Or=p([Si("roxy-divisional-chart")],Or);import{css as Ci,html as Ee,nothing as jr}from"lit";import{customElement as Ai,property as Pi}from"lit/decorators.js";var Di={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Ir=class extends g{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return Ee`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=Di[this.type]??this.type,s=(e.severity??"").toLowerCase(),o=s==="severe"?3:s==="moderate"?2:s==="mild"?1:0,i=o*33,l=o===3?"var(--roxy-danger)":o>=1?"var(--roxy-warning)":"transparent";return Ee`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${"type"in e&&e.type?Ee`<p class="subtype"><span class="subtype-label">${this.type==="sadhesati"?"Current phase":"Type"}</span>${e.type}</p>`:jr} ${e.severity?Ee`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${o}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:jr} ${e.description?Ee`<p class="description">${e.description}</p>`:jr} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?Ee`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>Ee`<li>${c}</li>`)}</ul></div>`:jr} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?Ee`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>Ee`<li>${c}</li>`)}</ul></div>`:jr}</article>`}renderEffects(e){if(!e.effects)return jr;let r=[];for(let[t,s]of Object.entries(e.effects))if(typeof s=="string"&&s.length>0)r.push(Ee`<div><h3>${t}</h3><p>${s}</p></div>`);else if(s&&typeof s=="object")for(let[o,i]of Object.entries(s))typeof i=="string"&&i.length>0&&r.push(Ee`<div><h3>${o}</h3><p>${i}</p></div>`);return r.length===0?jr:Ee`<div class="effects">${r}</div>`}};Ir.styles=[y,Ci`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.subtype{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.subtype .subtype-label{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-size:var(--roxy-text-xs,.75rem);margin-right:.4rem}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],p([Pi({type:String,reflect:!0})],Ir.prototype,"type",2),Ir=p([Ai("roxy-dosha-card")],Ir);import{css as zi,html as Xa,nothing as es}from"lit";import{customElement as Ti}from"lit/decorators.js";var ma=class extends g{renderData(a){return Xa`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?Xa`<span class="letter" aria-hidden="true">${a.letter}</span>`:es}<div><p class="label">Dream symbol</p>${a.name?Xa`<h2 class="name">${a.name}</h2>`:es}</div></header>${a.meaning?Xa`<p class="meaning">${a.meaning}</p>`:es}</article>`}renderEmpty(){return Xa`<div class="roxy-empty" role="status">No dream symbol</div>`}};ma.styles=[y,zi`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:2.5rem;height:2.5rem;color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-variant-numeric:tabular-nums;flex:none;justify-content:center;align-items:center;display:inline-flex}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}`],ma=p([Ti("roxy-dream-card")],ma);import{css as Mi,html as Dt,nothing as Ei}from"lit";import{customElement as Ni}from"lit/decorators.js";var ga=class extends g{renderEmpty(){return Dt`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(a){let e=a.symbols??[];if(e.length===0)return this.renderEmpty();let r=typeof a.total=="number"?a.total:e.length;return Dt`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${r} match${r===1?"":"es"}</span></header><ul class="grid">${e.map(t=>Dt`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?Dt`<span class="letter" aria-hidden="true">${t.letter}</span>`:Ei} <span class="name">${t.name}</span></button></li>`)}</ul></section>`}select(a){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:a.id,name:a.name,letter:a.letter},bubbles:!0,composed:!0}))}};ga.styles=[y,Mi`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.result{align-items:center;gap:var(--roxy-space-sm,.5rem);text-align:left;width:100%;font:inherit;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;background:0 0;transition:border-color .12s,background .12s;display:flex}.result:hover,.result:focus-visible{border-color:var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);outline:none}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:1.6rem;height:1.6rem;color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;flex:none;place-items:center;display:grid}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:500}`],ga=p([Ni("roxy-dream-search")],ga);import{css as Gi,html as Ne,LitElement as Hi,nothing as zt}from"lit";import{customElement as Oi,property as Qa,state as Tt}from"lit/decorators.js";var rs=new Map;async function ji(n){let a=rs.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw rs.delete(n),e}),rs.set(n,a)),a}var fe=class extends Hi{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(s=>s.required).filter(s=>this.values[s.key]===void 0||this.values[s.key]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.key)},bubbles:!0,composed:!0}));return}let t={};for(let s of this.fields){let o=this.values[s.key];if(!(o===void 0||o===""))if(s.group){let i=t[s.group]??{};i[s.name]=o,t[s.group]=i}else t[s.name]=o}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:t,queryKeys:this.fields.filter(s=>s.inQuery).map(s=>s.name)},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await ji(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let s=e.components?.schemas??{},o=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,s)}if(i?.properties){let c=new Set(i.required??[]);for(let[d,m]of Object.entries(i.properties)){let u=this.resolve(m,s)??{};if(u.type==="object"&&u.properties){let b=new Set(u.required??[]);for(let[$,S]of Object.entries(u.properties)){let U=this.resolve(S,s)??{};o.push({key:`${d}.${$}`,name:$,group:d,type:this.fieldType(U),required:c.has(d)&&b.has($),description:U.description,enum:U.enum,min:U.minimum,max:U.maximum,default:U.default})}}else o.push({key:d,name:d,type:this.fieldType(u),required:c.has(d),description:u.description,enum:u.enum,min:u.minimum,max:u.maximum,default:u.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let d=this.resolve(c.schema,s)??{};o.push({key:c.name,name:c.name,inQuery:c.in==="query",type:this.fieldType(d),required:!!c.required,description:d.description,enum:d.enum,default:d.default})}this.fields=o;let l={};for(let c of o){c.default!==void 0&&(l[c.key]=c.default);let d=c.group?this.initialValues?.[c.group]?.[c.name]:this.initialValues?.[c.name];d!==void 0&&(l[c.key]=d)}this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}groupHasLocation(e){let r=this.fields.filter(t=>t.group===e);return["latitude","longitude","timezone"].every(t=>r.some(s=>s.name===t))}onLocationFor(e){let r=e?`${e}.`:"";return t=>{let s=t.detail;s&&(this.values={...this.values,[`${r}latitude`]:s.latitude,[`${r}longitude`]:s.longitude,[`${r}timezone`]:s.timezone??s.utcOffset})}}render(){if(!this.loaded)return Ne`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return Ne`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return zt;let i=`roxy-form-${o.key}`;return Ne`<div class="field"><label for="${i}">${P(o.name)}${o.required?Ne`<span class="req" aria-hidden="true">*</span>`:zt}</label> ${o.enum?Ne`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>Ne`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:Ne`<input id="${i}" type="${this.htmlType(o.type)}" ?required="${o.required}" min="${o.min??""}" max="${o.max??""}" step="${o.type==="number"?"any":""}" .value="${this.values[o.key]??""}" @input="${l=>this.setValue(o.key,this.coerce(o.type,l.target.value))}">`} ${o.description?Ne`<small class="help">${o.description}</small>`:zt}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?Ne`<div class="location-block"><label>${o?`${P(o)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(o)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:zt,s=o=>Ne`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return Ne`<form @submit="${this.onSubmit}"><h2 class="title">${P(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):Ne`<fieldset class="person-group"><legend>${P(o)}</legend>${s(o)}</fieldset>`)} <button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};fe.styles=[y,Gi`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.person-group{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);margin:0 0 var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);min-inline-size:0;display:grid}.person-group legend{padding:0 var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],p([Qa({type:String,attribute:"data-endpoint"})],fe.prototype,"endpoint",2),p([Qa({type:String})],fe.prototype,"method",2),p([Qa({type:String,attribute:"spec-url"})],fe.prototype,"specUrl",2),p([Qa({type:String,attribute:"submit-label"})],fe.prototype,"submitLabel",2),p([Qa({attribute:!1})],fe.prototype,"initialValues",2),p([Tt()],fe.prototype,"fields",2),p([Tt()],fe.prototype,"values",2),p([Tt()],fe.prototype,"loaded",2),p([Tt()],fe.prototype,"specError",2),fe=p([Oi("roxy-endpoint-form")],fe);import{css as Ii,html as Ge,nothing as et}from"lit";import{customElement as Bi}from"lit/decorators.js";var ya=class extends g{renderEmpty(){return Ge`<div class="roxy-empty" role="status">No fixed star data</div>`}renderData(a){let e=a.conjunctions??[],r=a.stars??[];return Ge`<div class="wrap"><header><h2 class="title">Fixed stars</h2>${typeof a.orb=="number"?Ge`<span class="badge"><b>Orb</b> ${f(a.orb,1)}°</span>`:et}</header>${a.summary?Ge`<p class="summary">${a.summary}</p>`:et} ${e.length?Ge`<section><p class="subhead">Conjunctions to the chart</p>${e.map((t,s)=>Ge`<details class="interp-card" name="fixed-star-contacts" ?open="${s===0}"><summary><span class="interp-lead"><span class="point">${t.point}</span> conjunct ${t.star}</span> ${_()} <span class="interp-aside"><small>orb ${f(t.orb,2)}°</small></span></summary>${t.interpretation?Ge`<div class="interp-body"><p>${t.interpretation}</p></div>`:et}</details>`)}</section>`:Ge`<p class="empty-note">No star sits within the orb of a natal point.</p>`} ${r.length?this.renderCatalog(r):et}</div>`}renderCatalog(a){return Ge`<details class="catalog"><summary>${_()} Star catalog (${a.length})</summary><div class="scroll"><table><caption class="subhead">Precessed positions for the chart date</caption><thead><tr><th scope="col">Star</th><th scope="col">Position</th><th scope="col" class="num">Mag</th><th scope="col">Nature</th><th scope="col">Keywords</th></tr></thead><tbody>${a.map(e=>{let r=K[h(e.sign)];return Ge`<tr><td>${e.name}</td><td>${r?Ge`<span class="sg">${r}</span>`:et}${Ja(e.degree)} ${e.sign}</td><td class="num">${f(e.magnitude,1)}</td><td>${e.nature}</td><td><div class="kw">${(e.keywords??[]).map(t=>Ge`<span>${t}</span>`)}</div></td></tr>`})}</tbody></table></div></details>`}};ya.styles=[y,R,C,Ii`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);grid-template-columns:minmax(0,1fr);display:grid}header{align-items:baseline;gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);padding:2px 8px}.badge b{color:var(--roxy-accent-ink,#b45309);font-weight:600}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.empty-note{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.subhead{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-lead .point{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.interp-aside small{font-variant-numeric:tabular-nums}.catalog summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);align-items:center;gap:.5rem;font-weight:600;display:flex}.scroll{min-width:0;margin-top:var(--roxy-space-sm,.5rem);overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap;vertical-align:top;padding:6px 10px}th{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.04em;font-weight:600;font-size:var(--roxy-text-xs,.75rem)}td.num{text-align:right;font-variant-numeric:tabular-nums}.sg{color:var(--roxy-secondary,#475569);margin-right:.3rem}.kw{white-space:normal;flex-wrap:wrap;gap:.2rem;max-width:18rem;display:flex}.kw span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a);padding:0 6px}`],ya=p([Bi("roxy-fixed-stars")],ya);import{css as _i,html as nr,nothing as to}from"lit";import{customElement as Ki}from"lit/decorators.js";var ua=class extends g{renderEmpty(){return nr`<div class="roxy-empty" role="status">No digest data</div>`}renderData(a){let e=a.windows??[];if(e.length===0)return this.renderEmpty();let r=[T(a.startDate),T(a.endDate)].filter(Boolean).join(" \u2013 ");return nr`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?nr`<p class="subtitle">${r}</p>`:to}</div>${e.map(t=>this.renderWindow(t))}</div>`}windowLabel(a){return a===1?"Next 24 hours":typeof a=="number"?`Next ${a} days`:"Window"}renderWindow(a){let e=a.top??[],r=a.byDomain??{},t=Object.entries(r);return nr`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(a.days)}</span> <span class="window-count">${a.count??0} event${a.count===1?"":"s"}</span></div>${t.length>0?nr`<div class="domains">${t.map(([s,o])=>nr`<span class="domain-chip"><span class="swatch sw-${s}"></span>${P(s)} ${o}</span>`)}</div>`:to} ${e.length>0?nr`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:nr`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return nr`<div class="event" role="listitem"><span class="event-date">${T(a.date)}</span> <span class="event-desc">${a.description??P(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${f(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};ua.styles=[y,_i`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.window{gap:var(--roxy-space-sm,.5rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);display:grid}.window:first-of-type{border-top:none;padding-top:0}.window-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.window-label{font-weight:var(--roxy-weight-bold,600)}.window-count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.domains{flex-wrap:wrap;gap:.4rem;display:flex}.domain-chip{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:.35rem;display:inline-flex}.swatch{border-radius:2px;width:.65rem;height:.65rem;display:inline-block}.sw-western{background:var(--roxy-accent,#f59e0b)}.sw-vedic{background:var(--roxy-info,#2563eb)}.sw-biorhythm{background:var(--roxy-success,#16a34a)}.event{grid-template-columns:auto 1fr;align-items:baseline;gap:.25rem .6rem;display:grid}.event-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;white-space:nowrap}.event-desc{font-size:var(--roxy-text-sm,.875rem);line-height:1.4}.sig{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:2px;grid-column:2;height:4px;overflow:hidden}.sig-fill{border-radius:2px;height:100%;display:block}.sig-fill.western{background:var(--roxy-accent,#f59e0b)}.sig-fill.vedic{background:var(--roxy-info,#2563eb)}.sig-fill.biorhythm{background:var(--roxy-success,#16a34a)}.quiet{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}`],ua=p([Ki("roxy-forecast-digest")],ua);import{css as Yi,html as $e,nothing as rt}from"lit";import{customElement as Fi}from"lit/decorators.js";var qi={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Zi=["western","vedic","biorhythm"],ha=class extends g{renderEmpty(){return $e`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=Zi.filter(s=>e.some(o=>o.domain===s));return $e`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?$e`<div class="range">${T(a.startDate)} - ${T(a.endDate)} · ${a.count??e.length} events</div>`:rt}</header>${t.length?$e`<div class="legend">${t.map(s=>$e`<span><span class="swatch swatch-${s}"></span>${qi[s]}</span>`)}</div>`:rt} ${r.length?$e`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:$e`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(a){let e=new Map;for(let r of a){let t=r.date??"",s=e.get(t)??[];s.push(r),e.set(t,s)}return[...e.entries()]}renderDay(a,e){return $e`<div class="day" role="listitem"><div class="day-date">${T(a)}</div><div class="events">${e.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0,r=Math.max(0,Math.min(100,e));return $e`<div class="event"><span class="dot dot-${a.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(a)}</div>${a.description?$e`<p class="event-desc">${a.description}</p>`:rt}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${a.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(a){let e=a.body?h(a.body):"",r=a.target?h(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=Sr[t]??"",o=t?Za[t]??t:"",i=typeof a.orb=="number"?f(a.orb,1):"",l=this.typeQualifier(a);return t&&r?$e`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?$e`<span class="kind">orb ${i}°</span>`:rt}`:$e`<strong>${e||P(a.type??"")}</strong>${l?$e`<span class="kind">${l}</span>`:rt}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${h(a.target)}`:a.type==="retrograde-station"&&a.station?a.station:a.type==="eclipse"?[a.kind,"eclipse"].filter(Boolean).join(" "):a.type==="critical-day"?"critical day":a.type==="dasha-change"&&a.target?`dasha ${h(a.target)}`:P(a.type??"")}};ha.styles=[y,Yi`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],ha=p([Fi("roxy-forecast-timeline")],ha);import{css as Vi,html as Fe,nothing as xa}from"lit";import{customElement as Ui}from"lit/decorators.js";var Wi={varna:1,vashya:2,tara:3,yoni:4,"graha maitri":5,gana:6,bhakoot:7,nadi:8},fa=class extends g{renderEmpty(){return Fe`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(a){let e=(a.breakdown??[]).filter(d=>d?.category!==void 0),r=a.total??0,t=a.maxScore??36,s=r/t*100,o="color-mix(in srgb, var(--roxy-border) 50%, transparent)",i=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",l=s*2.827,c=(100-s)*2.827;return Fe`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${f(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?Fe`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Ds(a.percentage,1)}</small>`:xa}</div><div class="verdict-wrap">${typeof a.isCompatible=="boolean"?Fe`<span class="verdict ${a.isCompatible?"yes":"no"}">${a.isCompatible?"Compatible":"Not compatible"}</span>`:xa} ${a.recommendation?Fe`<span class="recommendation">${a.recommendation}</span>`:xa}</div></div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${o}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8" stroke-dasharray="${l},${c}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${e.length>0?Fe`<table><caption class="roxy-sr-only">Guna Milan breakdown: each koota with the classification of person 1 and person 2, and the score it earned out of its maximum.</caption><thead><tr><th scope="col">Koota</th><th scope="col">Person 1</th><th scope="col">Person 2</th><th scope="col" class="bar-col">Progress</th><th scope="col" class="score">Score</th></tr></thead><tbody>${e.map(d=>{let m=d.score??0,u=d.maxScore??Ji(d.category),b=u?m/u*100:0;return Fe`<tr><td>${d.category} ${d.description?Fe`<small>${d.description}</small>`:xa}</td><td class="classification">${d.person1??""}</td><td class="classification">${d.person2??""}</td><td class="bar-cell bar-col"><div class="mini-bar"><span style="width:${b}%"></span></div></td><td class="score">${f(m,1)} / ${u}</td></tr>`})}</tbody></table>`:xa} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?Fe`<div class="tags">${a.doshas?.map(d=>Fe`<span class="dosha">${d}</span>`)} ${a.doshaCancellations?.map(d=>Fe`<span class="cancel" title="${d.reason}">${d.dosha} cancelled</span>`)}</div>`:xa}</article>`}};fa.styles=[y,Vi`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.verdict-wrap{justify-items:end;gap:var(--roxy-space-xs,.25rem);text-align:right;display:grid}.verdict{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 10px}.verdict.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.verdict.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td small{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin-top:2px;line-height:1.5;display:block}td.classification{color:var(--roxy-secondary,#475569);white-space:nowrap}th.score{text-align:right}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:22%}@container (width<=32rem){.bar-col{display:none}}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],fa=p([Ui("roxy-guna-milan")],fa);function Ji(n){return n&&Wi[n.toLowerCase()]||1}import{css as Xi,html as fr,nothing as at}from"lit";import{customElement as Qi}from"lit/decorators.js";var ba=class extends g{renderData(a){let e=a.channels??[],r=a.centers??[],t=r.filter(s=>s.defined).length;return fr`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?fr`<span class="count">${a.totalChannels} channels</span>`:at}</header>${sr([{label:"Channels",value:a.totalChannels?.toString()},{label:"Combined definition",value:a.combinedDefinition?P(String(a.combinedDefinition)):void 0},{label:"Centers defined",value:r.length>0?`${t} of ${r.length}`:void 0}])}<p class="lead">A connection chart reads the two charts as one bodygraph. Wherever the two of them together hold both gates of a channel, that channel is defined between them, and the centers it joins are defined in the connection whether or not either person defines them alone.</p>${this.renderDynamics(a.summary)} ${this.renderCenters(r)} ${this.renderChannels(e,r)}</div>`}renderDynamics(a){if(!a)return at;let e=[{label:"Electromagnetic",aside:Mt(a.electromagnetic),body:"Each person holds one of the two gates, so the channel completes only when they are together. The classic point of attraction."},{label:"Dominance",aside:Mt(a.dominance),body:"One person holds both gates and the other holds neither, so the conditioning runs one way, from the person who carries the channel to the person who does not."},{label:"Compromise",aside:Mt(a.compromise),body:"One person holds both gates and the other holds a single hanging gate of the same channel, so the channel is complete for one of them and half open for the other."},{label:"Companionship",aside:Mt(a.companionship),body:"Both people independently hold both gates, so neither needs the other to complete it. A shared and familiar frequency rather than an attraction."}];return z(e,"hd-connection-dynamic","Dynamics")}renderCenters(a){return a.length===0?at:fr`<section class="block"><h3>Centers</h3><p class="note">Defined is the state of the combined chart. Beside it is who already defines that center in their own chart. A center defined only together is what the connection itself creates: it is there when the two are together and gone when they are apart. The combined definition counts how the defined centers hang together, so Single is one connected piece and a split is more than one.</p>${a.map(e=>{let r=e.definedBy??[],t=r.includes("A"),s=r.includes("B"),o=!!e.defined&&!t&&!s;return fr`<div class="row"><span class="cname">${e.name??P(String(e.id??""))}</span> <span class="badge ${e.defined?o?"together":"defined":"open"}">${e.defined?o?"Only together":"Defined":"Open"} </span><span class="who">${el(!!e.defined,t,s)}</span></div>`})}</section>`}renderChannels(a,e){if(a.length===0)return at;let r=new Map(e.map(s=>[String(s.id??""),s.name??""])),t=s=>r.get(s)||P(s);return fr`<section class="block"><h3>Channels</h3><div class="scroll" tabindex="0" role="region" aria-label="Connection channels"><table role="table"><caption class="roxy-sr-only">Connection channels: each channel with its gates, the centers it links, its circuit and dynamic, and the gates person A and person B each hold.</caption><thead><tr><th scope="col">Channel</th><th scope="col">Gates</th><th scope="col">Centers</th><th scope="col">Circuit</th><th scope="col">Dynamic</th><th scope="col">Person A holds</th><th scope="col">Person B holds</th></tr></thead><tbody>${a.map(s=>fr`<tr><td>${s.name??""}</td><td class="gates">${s.gateA}-${s.gateB}</td><td>${(s.centers??[]).map(t).join(" to ")}</td><td>${s.circuit??""}</td><td>${s.dynamic?fr`<span class="dyn">${s.dynamic}</span>`:at}</td><td class="held">${so(s.personAGates)}</td><td class="held">${so(s.personBGates)}</td></tr>`)}</tbody></table></div></section>`}renderEmpty(){return fr`<div class="roxy-empty" role="status">No connection data</div>`}};ba.styles=[y,R,C,hr,Xi`.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);grid-template-columns:minmax(0,1fr);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums}.note{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:1.6}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;display:flex}.row:last-child{border-bottom:none}.cname{flex:1;min-width:8rem}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 8px;display:inline-flex}.badge.defined{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.open{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.together{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a)}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr:last-child td{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.dyn{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);padding:1px 8px;display:inline-block}.held{font-variant-numeric:tabular-nums}.scroll{min-width:0;overflow-x:auto}`],ba=p([Qi("roxy-hd-connection")],ba);function Mt(n){if(typeof n=="number")return n===0?"None":n===1?"1 channel":`${n} channels`}function so(n){let a=n??[];return a.length>0?a.join(", "):"Neither"}function el(n,a,e){return a&&e?"Defined in both charts":a?"Defined by A":e?"Defined by B":n?"Defined by neither alone, only by the connection":"Open in both charts"}import{css as rl,html as we,nothing as br}from"lit";import{customElement as al}from"lit/decorators.js";var La=class extends g{renderData(a){let e=a.channels??[],r=a.gates??[],t=a.summary,s=t?.gapGates??[],o=e.some(i=>i.isCore);return we`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?we`<span class="count">${a.memberCount} members</span>`:br}</header>${sr([{label:"Members",value:a.memberCount?.toString()},{label:"Defined channels",value:typeof t?.definedChannels=="number"&&e.length>0?`${t.definedChannels} of ${e.length}`:void 0},{label:"Filled gates",value:typeof t?.filledGates=="number"&&r.length>0?`${t.filledGates} of ${r.length}`:void 0},{label:"Core",value:typeof t?.coreDefined=="boolean"?t.coreDefined?"Defined":"Open":void 0},{label:"Gap gates",value:s.length>0?s.join(", "):void 0}])}<p class="lead">A penta is the field three to five people form when they work as a group. It is read from the twelve penta gates the members bring between them: a channel with both of its gates held somewhere in the group is a defined Strength, and a gate no member holds is a gap the group has to compensate for.</p>${this.renderGroup("Upper (direction)",e.filter(i=>i.position==="upper"),"Upper channels run from the G Center to the Throat. They carry the leadership of the group and how it presents itself.")} ${this.renderGroup("Lower (execution)",e.filter(i=>i.position==="lower"),"Lower channels run from the G Center to the Sacral. They carry the managed, generative, resource work.")} ${this.renderGroup("Channels",e.filter(i=>i.position!=="upper"&&i.position!=="lower"))} ${o?we`<p class="footnote">Core is the 2/14 Channel of the Beat, the material core of the penta: gate 2 sets the direction for resources, gate 14 is the resources themselves.</p>`:br} ${this.renderGates(r)} ${e.length>0||r.length>0?we`<p class="footnote">Members are lettered in the order they were sent, so A is the first member of the group.</p>`:br}</div>`}renderGroup(a,e,r){return e.length===0?br:we`<div class="section"><h3>${a}</h3>${r?we`<p class="note">${r}</p>`:br} ${e.map(t=>we`<div class="row"><span class="gates">${t.gateA}-${t.gateB}</span> <span class="cname">${t.name??""} ${t.circuit?we`<span class="circuit">${t.circuit} circuit</span>`:br} </span><span class="badge ${t.defined?"defined":"open"}">${t.defined?"Defined":"Open"}</span> ${t.isCore?we`<span class="badge core">Core</span>`:br} <span class="held">Gate ${t.gateA} held by ${as(t.gateAHeldBy)}. Gate ${t.gateB} held by ${as(t.gateBHeldBy)}.</span></div>`)}</div>`}renderGates(a){if(a.length===0)return br;let e=a.filter(r=>r.filled).length;return we`<div class="section"><h3>Gates (${e} of ${a.length} filled)</h3><p class="note">The role each gate brings to the group, and who carries it. A gap is a role no member holds, so the group compensates for it.</p>${a.map(r=>we`<div class="row"><span class="gate-id">${r.gate}</span> <span class="cname">${r.gateName??""}</span> ${r.filled?we`<span class="who">Held by ${as(r.heldBy)}</span>`:we`<span class="badge gap">Gap</span>`}</div>`)}</div>`}renderEmpty(){return we`<div class="roxy-empty" role="status">No penta data</div>`}};La.styles=[y,hr,rl`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem)}.section h3{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.note{margin:var(--roxy-space-xs,.25rem) 0 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:1.6}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;display:flex}.row:last-child{border-bottom:none}.gates,.gate-id{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600);min-width:3.5rem}.cname{flex:1;min-width:8rem}.circuit{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);display:block}.held{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);flex-basis:100%;line-height:1.6}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 8px;display:inline-flex}.badge.defined{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.open{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.core{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.gap{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.footnote{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0;line-height:1.6}`],La=p([al("roxy-hd-penta")],La);var tl="ABCDE";function as(n){let a=(n??[]).map(e=>tl[e]??String(e+1));return a.length>0?a.join(", "):"nobody"}import{css as sl,html as va,nothing as ts}from"lit";import{customElement as ol}from"lit/decorators.js";var $a=class extends g{renderEmpty(){return va`<div class="roxy-empty" role="status">No Human Design data</div>`}renderData(a){return nl(a)?this.renderType(a):this.renderProfile(a)}renderType(a){return va`<div class="wrap"><header class="head"><h2 class="title">Type</h2>${a.type||a.profile?va`<div class="type-line">${[a.type,a.profile?`Profile ${a.profile}`:""].filter(Boolean).join(" \xB7 ")}</div>`:ts}</header>${sr([{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile}])} ${a.typeDescription?va`<p class="lead">${a.typeDescription}</p>`:ts} ${Lt(a.signature,a.notSelf)} ${vt([{label:"Strategy",aside:a.strategy,body:a.strategyDescription},{label:"Authority",aside:a.authority,body:a.authorityDescription},{label:"Aura",body:a.aura}],"hd-type-reading")}</div>`}renderProfile(a){return va`<div class="wrap"><header class="head"><h2 class="title">Profile</h2>${a.profile?va`<div class="type-line">${a.profile}</div>`:ts}</header>${sr([{label:"Profile",value:a.profile},{label:"Personality line",value:a.personalityLine?.toString()},{label:"Design line",value:a.designLine?.toString()}])}<section class="block"><h3>Lines</h3>${$t({personality:a.personalityKeynote,personalityLine:a.personalityLine,design:a.designKeynote,designLine:a.designLine})}</section></div>`}};$a.styles=[y,R,C,hr,sl`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.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)}`],$a=p([ol("roxy-hd-type-card")],$a);function nl(n){return typeof n.type=="string"}import{css as il,html as ce,nothing as He}from"lit";import{customElement as ll}from"lit/decorators.js";var wa=class extends g{renderData(a){let e=[...a.arrows??[]].sort((r,t)=>oo(r.position)-oo(t.position));return ce`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(r=>this.renderArrow(r))}</div>${a.confident===!1?ce`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof a.confidenceMarginDeg=="number"?` (within ${a.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:He} ${this.renderReading(e,a.baseDescription)}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return ce`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?ce`<span class="layer">${a.layer}</span>`:He} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?ce`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}${a.baseName?`, ${a.baseName}`:""}</span>`:He} ${a.activation?.planet?ce`<span class="ctb">${[a.activation.planet,h(a.activation.side??"")].filter(Boolean).join(" \xB7 ")}</span>`:He} ${a.confident===!1?ce`<span class="note" role="note">Knife-edge: could flip with a more precise birth time.</span>`:He}</div>`}renderReading(a,e){let r=a.filter(o=>o.description||o.colorMeaning);if(r.length===0)return He;let t=new Map;for(let o of r){let i=o.layer??"",l=t.get(i);l?l.push(o):t.set(i,[o])}let s=0;return ce`<section class="block"><h3>Reading</h3>${[...t].map(([o,i])=>ce`<div class="group">${o?ce`<p class="group-head">${o}</p>`:He} ${i[0]?.layerDescription?ce`<p class="group-note">${i[0].layerDescription}</p>`:He} ${i.map(l=>this.renderArrowReading(l,s++===0))}</div>`)} ${e?ce`<p class="footnote">Base. ${e}</p>`:He}</section>`}renderArrowReading(a,e){let r=a.cognition,t=[{label:"Color",body:a.colorMeaning},{label:"Tone",body:a.toneMeaning},{label:"Direction",body:a.directionMeaning},{label:r?.label?`Cognition \xB7 ${r.label}`:"Cognition",body:r?.description}].filter(s=>!!s.body);return ce`<details class="interp-card" name="hd-variable" ?open="${e}"><summary><span class="interp-lead">${a.name??""}</span> ${_()} ${a.position?ce`<span class="interp-aside"><small>${a.position}</small></span>`:He}</summary><div class="interp-body">${a.description?ce`<p>${a.description}</p>`:He} ${t.length>0?ce`<dl class="facets">${t.map(s=>ce`<dt>${s.label}</dt><dd>${s.body}</dd>`)}</dl>`:He}</div></details>`}renderEmpty(){return ce`<div class="roxy-empty" role="status">No variables data</div>`}};wa.styles=[y,R,C,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}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.arrow{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-xs,.25rem);align-content:start;display:grid}.arrow-head{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:1.75rem;line-height:1}.name{font-weight:var(--roxy-weight-bold,600)}.layer{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.labels{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.ctb{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.note{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-warning-fg,#9a3412)}@container (width<=28rem){.grid{grid-template-columns:minmax(0,1fr)}}.group{margin-bottom:var(--roxy-space-md,1rem)}.group:last-of-type{margin-bottom:0}.group-head{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.group-note{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:1.6}.facets{gap:var(--roxy-space-xs,.25rem);margin:0;display:grid}.facets dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.facets dd{margin:0}.footnote{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0;line-height:1.6}`],wa=p([ll("roxy-hd-variables")],wa);function oo(n){switch(n){case"Top left":return 0;case"Top right":return 1;case"Bottom left":return 2;case"Bottom right":return 3;default:return 99}}import{css as dl,html as be,nothing as ke,svg as no}from"lit";import{customElement as cl,property as pl}from"lit/decorators.js";var Br=class extends g{constructor(){super(...arguments);this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}renderEmpty(){return be`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:r,lines:t,changingLinePositions:s,dailyMessage:o,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(s??[]);return be`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?be`<div class="symbol">${r.symbol}</div>`:ke}<div class="lines" aria-hidden="true">${l.slice().reverse().map((d,m)=>{let u=l.length-1-m+1,b=c.has(u),$=d===6||d===8;return be`<div class="line ${`${$?"broken":"solid"}${b?" changing":""}`}">${$?no`<span class="seg"></span><span class="seg"></span>`:no`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${[r.number!=null?`${r.number}.`:"",r.english??r.chinese??"Hexagram"].filter(Boolean).join(" ")}</h2><p class="subtitle">${r.chinese?be`${r.chinese}`:ke} ${r.pinyin?be`· ${r.pinyin}`:ke}</p><div class="trigrams">${r.upperTrigram?be`<div>Upper <span class="tri-glyph">${Kt[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:ke} ${r.lowerTrigram?be`<div>Lower <span class="tri-glyph">${Kt[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:ke}</div>${r.judgment?be`<p class="judgment">${r.judgment}</p>`:ke} ${r.image?be`<p class="image">${r.image}</p>`:ke} ${o?be`<p class="message">${o}</p>`:ke} ${r.interpretation?.general?be`<p>${r.interpretation.general}</p>`:ke} ${c.size>0?be`<div class="changing">Changing lines: ${Array.from(c).sort((d,m)=>d-m).join(", ")}. ${i?.english?be`Becomes hexagram ${i.number} ${i.english}.`:ke}</div>`:ke} ${this.renderLines(r,c)}</div></article>`}renderLines(e,r){let t=e.changingLines??[];if(t.length===0)return ke;let s=r.size>0,o=s?t.filter(l=>r.has(l.position)):t;if(o.length===0)return ke;let i=o.map(l=>({label:`Line ${l.position}`,body:l.text??"",extra:l.meaning?be`<p class="line-meaning">${l.meaning}</p>`:ke}));return z(i,"hexagram-lines",s?"Changing lines":"Lines")}derivedLines(e){let r=e.binary??"";return/^[01]{6}$/.test(r)?Array.from(r,t=>t==="1"?7:8):Array.from({length:6},()=>7)}};Br.styles=[y,R,C,dl`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);align-content:start;align-self:start;justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.line-meaning{padding-left:var(--roxy-space-sm,.5rem);border-left:2px solid var(--roxy-border,#e4e4e7);color:var(--roxy-muted,#71717a);margin:0}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],p([pl({type:String,reflect:!0})],Br.prototype,"mode",2),Br=p([cl("roxy-hexagram")],Br);import{css as ml,html as ka,nothing as ss}from"lit";import{customElement as gl}from"lit/decorators.js";var Sa=class extends g{renderEmpty(){return ka`<div class="roxy-empty" role="status">No hora data</div>`}renderData(a){let e=a.dayHoras??[],r=a.nightHoras??[];return e.length===0&&r.length===0?this.renderEmpty():ka`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?ka`<p class="subtitle">${a.date}</p>`:ss}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?ss:ka`<div class="col"><p class="section-label">${a}</p>${e.map(r=>ka`<div class="row"><span class="glyph" aria-hidden="true">${v[h(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${gr(r)}</span> ${typeof r.number=="number"?ka`<span class="num">${r.number}</span>`:ss}</div>`)}</div>`}};Sa.styles=[y,ml`.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);grid-template-columns:minmax(0,1fr);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.cols{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-xs,.25rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);display:flex}.row:last-child{border-bottom:none}.glyph{color:var(--roxy-accent-ink,#b45309);text-align:center;width:1.25em;font-size:1.15em;line-height:1}.planet{flex:1;font-weight:500}.time{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;white-space:nowrap}.num{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right;width:1.5em}@container (width<=30rem){.cols{grid-template-columns:1fr}}`],Sa=p([gl("roxy-hora-table")],Sa);import{css as yl,html as E,nothing as X}from"lit";import{customElement as ul,property as hl}from"lit/decorators.js";var _r=class extends g{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return E`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?K[h(r)]??"":"",s="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,o="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return E`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${o?E`<div class="date">${o}</div>`:X}</div>${s!==null?E`<span class="energy" aria-label="${`Energy ${s} of 10`}">Energy ${s}/10 <span class="energy-bar"><span style="width:${s/10*100}%"></span></span></span>`:X}</header>${e.overview?E`<p class="overview">${e.overview}</p>`:X} ${this.renderSky(e)}<div class="sections">${e.love?E`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:X} ${e.career?E`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:X} ${e.health?E`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:X} ${e.finance?E`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:X} ${"advice"in e&&e.advice?E`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:X}</div>${this.renderMonth(e)} ${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],d="luckyDays"in e&&e.luckyDays?e.luckyDays:[],m=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&d.length===0&&m.length===0?X:E`<div class="lucky">${i!==void 0?E`<span>Lucky number <strong>${i}</strong></span>`:X} ${l?E`<span>Lucky color <strong>${l}</strong></span>`:X} ${c.length?E`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:X} ${d.length?E`<span>Lucky days <strong>${d.join(", ")}</strong></span>`:X} ${m.length?E`<span class="compat-wrap">Best with <span class="compat">${m.map(u=>E`<span>${u}</span>`)}</span></span>`:X}</div>`})()}</article>`}renderSky(e){let r="moonSign"in e?e.moonSign:"",t="moonPhase"in e?e.moonPhase:"",s=("activeTransits"in e?e.activeTransits:[])??[];if(!r&&!t&&s.length===0)return X;let o=r?K[h(r)]??"":"";return E`<div class="sky">${r||t?E`<div class="moon-line">${r?E`<span><span class="lbl">Moon</span> <span aria-hidden="true">${o}</span> <b>${r}</b></span>`:X} ${t?E`<span><span class="lbl">Phase</span> <b>${t}</b></span>`:X}</div>`:X} ${s.length?E`<ul class="transits" aria-label="Active transits">${s.map(i=>E`<li>${i}</li>`)}</ul>`:X}</div>`}renderMonth(e){let r=("weekByWeek"in e?e.weekByWeek:[])??[],t=("keyDates"in e?e.keyDates:[])??[];return r.length===0&&t.length===0?X:E`${r.length?E`<section><h3 class="block-title">Week by week</h3><div class="weeks">${r.map(s=>E`<div class="week"><span class="week-no">Week ${s.week}</span><div><div class="week-focus">${s.focus}</div>${s.advice?E`<p class="week-advice">${s.advice}</p>`:X}</div></div>`)}</div></section>`:X} ${t.length?E`<section><h3 class="block-title">Key dates</h3><dl class="dates">${t.map(s=>E`<div class="date-row"><dt>${T(s.date)||s.date}</dt><dd>${s.event}</dd></div>`)}</dl></section>`:X}`}};_r.styles=[y,yl`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}.sky{gap:var(--roxy-space-sm,.5rem);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);display:grid}.moon-line{align-items:baseline;gap:.35rem var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;display:flex}.moon-line b{font-weight:var(--roxy-weight-bold,600)}.moon-line .lbl{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin-right:.35rem}.transits{gap:.25rem;margin:0;padding:0;list-style:none;display:grid}.transits li{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);padding-left:.9rem;position:relative}.transits li:before{content:"";background:var(--roxy-accent,#f59e0b);border-radius:50%;width:5px;height:5px;position:absolute;top:.5em;left:0}.block-title{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.weeks{gap:var(--roxy-space-sm,.5rem);display:grid}.week{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);grid-template-columns:3.5rem 1fr;align-items:baseline;display:grid}.week:first-child{border-top:0;padding-top:0}.week-no{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)}.week-focus{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem)}.week-advice{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:.15rem 0 0}.dates{gap:.3rem var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:max-content 1fr;margin:0;display:grid}.date-row{display:contents}.date-row dt{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600);white-space:nowrap}.date-row dd{color:var(--roxy-fg,#0a0a0a);margin:0}`],p([hl({type:String,reflect:!0})],_r.prototype,"period",2),_r=p([ul("roxy-horoscope-card")],_r);import{css as xl,html as I,nothing as Je}from"lit";import{customElement as fl,state as bl}from"lit/decorators.js";var Ll=[{id:"planets",label:"Planets"},{id:"cusps",label:"Cusps"},{id:"significators",label:"Significators"}],Et=[1,2,3,4];function os(n,a){return n?typeof a=="number"?`${n} ${a}`:n:""}function io(n){return[...new Set(n.map(String))].join(" > ")}var Kr=class extends g{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(s=>({name:s.planet,longitude:s.longitude,house:s.house,nakshatra:s.nakshatra,pada:s.pada,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,kpNumber:s.kpNumber,retrograde:s.retrograde})),t=e.nodes;for(let[s,o]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])o&&r.push({name:s,longitude:o.longitude,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,kpNumber:o.kpNumber,retrograde:!0});return r}renderEmpty(){return I`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return I`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?I`<div class="asc">Ascendant: <strong>${typeof r.longitude=="number"?Me(r.longitude):r.sign??""} </strong>${r.nakshatra?I`· ${os(r.nakshatra,r.pada)}`:Je} ${r.subLord?I`· sub lord ${r.subLord}`:Je} ${typeof r.kpNumber=="number"?I`· KP ${r.kpNumber}`:Je}</div>`:Je} ${typeof e.meta?.ayanamsa=="number"?I`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${f(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?I`· ${e.meta.houseSystem} houses`:Je}</div>`:Je}</header>${ve({items:Ll,active:this.activeTab,onSelect:t=>{this.activeTab=t},label:"KP chart views",idPrefix:"kp",controls:!0})}<div id="kp-panel-${this.activeTab}" role="tabpanel" aria-labelledby="kp-tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.activeTab==="cusps"?this.renderCusps():this.renderSignificators()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?I`<table role="table"><caption class="roxy-sr-only">KP planets and nodes: each body with its position, house, nakshatra and pada, star lord, sub lord, sub sub lord and KP number.</caption><thead><tr><th scope="col">Body</th><th scope="col">Position</th><th scope="col">House</th><th scope="col">Nakshatra, pada</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>I`<tr><td class="body">${r.name}${r.retrograde?I`<span class="retro">R</span>`:Je}</td><td class="num">${typeof r.longitude=="number"?Me(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${os(r.nakshatra,r.pada)}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:I`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?I`<table role="table"><caption class="roxy-sr-only">KP Placidus cusps: each house cusp with its position, sign lord, nakshatra and pada, star lord, sub lord, sub sub lord and KP number.</caption><thead><tr><th scope="col">House</th><th scope="col">Position</th><th scope="col">Sign lord</th><th scope="col">Nakshatra, pada</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>I`<tr><td class="body num">${r.house}</td><td class="num">${typeof r.longitude=="number"?Me(r.longitude):r.sign??""}</td><td>${r.signLord??""}</td><td>${os(r.nakshatra,r.pada)}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:I`<p class="roxy-empty" role="status">No cusps</p>`}renderSignificators(){let e=this.data?.significators,r=e?.houseWise??[],t=e?.planetWise??[];return!r.length&&!t.length?I`<p class="roxy-empty" role="status">No significators</p>`:I`${this.renderLevelLegend(r)} ${r.length?I`<div class="sig-head"><h3 class="sig-title">House-wise significators</h3><p class="sig-note">Planets that signify each house, strongest level first.</p></div><table role="table"><caption class="roxy-sr-only">KP house-wise significators: each house, the planets that signify it at levels 1 to 4, and the full strength order.</caption><thead><tr><th scope="col">House</th>${Et.map(s=>I`<th scope="col">L${s}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${r.map(s=>I`<tr><td class="body num">${s.house}</td>${Et.map(o=>this.renderCell(this.planetsAtLevel(s,o).join(", ")))}<td class="chain">${io(s.all??[])}</td></tr>`)}</tbody></table>`:Je} ${t.length?I`<div class="sig-head"><h3 class="sig-title">Planet-wise significators</h3><p class="sig-note">Houses each planet signifies, strongest level first.</p></div><table role="table"><caption class="roxy-sr-only">KP planet-wise significators: each planet, the houses it signifies at levels 1 to 4, and the full strength order.</caption><thead><tr><th scope="col">Planet</th>${Et.map(s=>I`<th scope="col">L${s}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${t.map(s=>I`<tr><td class="body">${s.planet}</td>${Et.map(o=>this.renderCell(this.housesAtLevel(s,o).join(", ")))}<td class="chain">${io(s.allHouses??[])}</td></tr>`)}</tbody></table>`:Je}`}renderCell(e){return e?I`<td>${e}</td>`:I`<td class="empty-cell">none</td>`}planetsAtLevel(e,r){return(e.significators??[]).filter(t=>t.level===r).flatMap(t=>t.planets??[])}housesAtLevel(e,r){return(e.signifies??[]).filter(t=>t.level===r).flatMap(t=>t.houses??[])}renderLevelLegend(e){let r=new Map;for(let t of e)for(let s of t.significators??[])s.description&&!r.has(s.level)&&r.set(s.level,s.description);return r.size===0?Je:I`<ul class="legend" aria-label="Significator levels">${[...r.entries()].sort((t,s)=>t[0]-s[0]).map(([t,s])=>I`<li><b>L${t}</b>${s}</li>`)}</ul>`}};Kr.styles=[y,pe,xl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);width:100%;overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.roxy-tablist{padding:0 var(--roxy-space-md,1rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}.sig-head{padding:var(--roxy-space-md,1rem) var(--roxy-space-md,1rem) 0;gap:var(--roxy-space-xs,.25rem);display:grid}.sig-title{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.sig-note{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:0}.legend{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);padding:var(--roxy-space-md,1rem) var(--roxy-space-md,1rem) 0;color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);flex-wrap:wrap;margin:0;list-style:none;display:flex}.legend b{color:var(--roxy-accent-ink,#b45309);margin-right:4px}.chain,.empty-cell{color:var(--roxy-muted,#71717a)}`],p([bl()],Kr.prototype,"activeTab",2),Kr=p([fl("roxy-kp-chart")],Kr);import{css as vl,html as tt,nothing as lo}from"lit";import{customElement as $l}from"lit/decorators.js";var Ra=class extends g{renderEmpty(){return tt`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return tt`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?tt`<span class="ayanamsa">Ayanamsa: ${f(a.ayanamsa,2)}°</span>`:lo}</header><table role="table"><caption class="roxy-sr-only">KP planets: each planet with its sign, sign lord, nakshatra, star lord, sub lord, sub sub lord and KP number.</caption><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>tt`<tr><td class="planet">${r.planet} ${r.retrograde?tt`<span class="retro">R</span>`:lo}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Ra.styles=[y,vl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],Ra=p([$l("roxy-kp-planets-table")],Ra);import{css as wl,html as Yr,nothing as ns}from"lit";import{customElement as kl}from"lit/decorators.js";var Ca=class extends g{renderEmpty(){return Yr`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return Yr`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?Yr`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:ns}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${a.moonSignLord??""}</dd><dt>Star lord</dt><dd>${a.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${a.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${a.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${a.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${a.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.lagnaSubSublord??""}</dd></dl></div></div>${a.rulingPlanets?.length?Yr`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>Yr`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:ns} ${e.length?Yr`<table><caption class="roxy-sr-only">House significators: each ruling planet and the houses it signifies.</caption><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${e.map(r=>Yr`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:ns}</div>`}};Ca.styles=[y,wl`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],Ca=p([kl("roxy-kp-ruling-planets")],Ca);import{css as Sl,html as Lr,nothing as Nt,svg as Gt}from"lit";import{customElement as Rl}from"lit/decorators.js";var is=320,Oe=is/2,ir=128,Cl=118,Al=140,Pl=150;function lr(n,a){let e=n*Math.PI/180;return{x:Oe+a*Math.sin(e),y:Oe-a*Math.cos(e)}}var Dl=[{az:0,label:"N"},{az:45,label:"NE"},{az:90,label:"E"},{az:135,label:"SE"},{az:180,label:"S"},{az:225,label:"SW"},{az:270,label:"W"},{az:315,label:"NW"}],Aa=class extends g{renderEmpty(){return Lr`<div class="roxy-empty" role="status">No local space data</div>`}renderData(a){let e=a.bodies??[],r=a.birthDetails;return Lr`<div class="wrap"><header><h2 class="title">Local space</h2>${r?Lr`<div class="meta">${[r.date,r.time].filter(Boolean).join(" \xB7 ")}</div>`:Nt}</header>${this.renderDial(e)} ${a.summary?Lr`<p class="summary">${a.summary}</p>`:Nt} ${this.renderList(e)}</div>`}renderDial(a){return Lr`<svg viewBox="0 0 ${is} ${is}" role="img" aria-label="Local space compass of planetary directions from the birthplace"><title>Local space compass</title><desc>A compass centered on the birthplace. Each body is a line pointing to its azimuth, clockwise from north. Bodies below the horizon are dimmed.</desc><circle class="dial-fill" cx="${Oe}" cy="${Oe}" r="${ir}"/><circle class="dial" cx="${Oe}" cy="${Oe}" r="${ir*.66}" stroke-width="0.5"/><circle class="dial" cx="${Oe}" cy="${Oe}" r="${ir*.33}" stroke-width="0.5"/>${this.renderCompassRing()} ${this.renderSpokes(a)}<circle class="center-dot" cx="${Oe}" cy="${Oe}" r="2.5"/></svg>`}renderCompassRing(){let a=[];for(let i=0;i<360;i+=22.5){let l=lr(i,ir),c=lr(i,ir-(i%45===0?8:4));a.push(Gt`<line class="tick" x1=${c.x} y1=${c.y} x2=${l.x} y2=${l.y} />`)}let e=lr(0,ir),r=lr(180,ir),t=lr(90,ir),s=lr(270,ir),o=Dl.map(({az:i,label:l})=>{let c=lr(i,Pl),d=i%90===0;return Gt`<text class=${`compass-label${d?" cardinal":""}`} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${l}</text>`});return Gt`
83
83
  <line class="cardinal-axis" x1=${e.x} y1=${e.y} x2=${r.x} y2=${r.y} />
84
84
  <line class="cardinal-axis" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} />
85
85
  ${a}${o}`}renderSpokes(a){return a.map((e,r)=>{let t=Rr(e.planet,r),s=e.aboveHorizon===!1,o=lr(e.azimuth,Cl),i=lr(e.azimuth,Al),l=e.symbol||e.planet.slice(0,2),c=`${e.altitude>0?"+":""}${Math.round(e.altitude)}\xB0`;return Gt`<g>
@@ -100,5 +100,5 @@ var bo=Object.defineProperty;var Lo=Object.getOwnPropertyDescriptor;var p=(n,a,e
100
100
  </g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=le.findIndex(u=>u.toLowerCase()===t.sign.toLowerCase());if(o===-1)return;let i=o*30+t.degree,l=this.toAngle(i),c=s===1?xs+14:ja+14,d=H(V,V,c,l),m=H(V,V,hs+14,l);e.push(Oa`<g>
101
101
  <line class="asc-tick" x1=${d.x} y1=${d.y} x2=${m.x} y2=${m.y} />
102
102
  <text class="asc-label" x=${m.x} y=${m.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=h(o);for(let l of s)if(h(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return oe;let l=H(V,V,xs-12,this.toAngle(o)),c=H(V,V,ja+8,this.toAngle(i)),d=ar(s),m=Sr[d]??"aspect-other",u=f(s.orb,1);return Oa`<line class=${`aspect ${m}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${d} ${s.planet2}${u?` (orb ${u}\xB0)`:""}</title></line>`})}renderAspects(a){return N`<table><caption class="roxy-sr-only">Inter-chart aspects: the planet from chart 1, the planet from chart 2, the aspect between them, the orb in degrees and the strength.</caption><thead><tr><th scope="col">Planet 1</th><th scope="col">Planet 2</th><th scope="col">Aspect</th><th scope="col">Orb</th><th scope="col">Strength</th></tr></thead><tbody>${a.map(e=>N`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${ar(e)||""}</td><td class="orb">${f(e.orb,1)}</td><td>${f(e.strength,0)}</td></tr>`)}</tbody></table>`}};Ia.styles=[y,R,C,ud`.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);grid-template-columns:minmax(0,1fr);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}.people{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.person{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);gap:.3rem;display:grid}.person-name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);align-items:center;gap:.4rem;display:flex}.person-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.person-dot.p1{background:var(--roxy-accent,#f59e0b)}.person-dot.p2{background:var(--roxy-info,#0284c7)}.big-three{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;gap:.25rem .75rem;display:flex}.big-three span{align-items:baseline;gap:.25rem;display:inline-flex}.big-three .lbl{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.summary-pills{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.glyph{font-size:1.1em;line-height:1}.static-head{align-items:center;gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;font-weight:500;display:flex}.asp-name{font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.asp-name.harmonious{color:var(--roxy-success-fg,#166534)}.asp-name.challenging{color:var(--roxy-danger-fg,#991b1b)}.interp-keywords{flex-wrap:wrap;gap:.25rem;display:flex}.interp-keywords .kw{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);padding:1px 8px}.context{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600)}.catalog>summary{cursor:pointer;font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);align-items:center;gap:.5rem;display:flex}.scroll{min-width:0;margin-top:var(--roxy-space-sm,.5rem);overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{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}`],Ia=p([hd("roxy-synastry-chart")],Ia);import{css as bd,html as Be,nothing as Ba}from"lit";import{customElement as Ld,state as vd}from"lit/decorators.js";var $d=[["love","Love"],["career","Career"],["finances","Finances"],["health","Health"],["spirituality","Spirituality"]],Wr=class extends g{constructor(){super(...arguments);this.orientation="upright"}renderEmpty(){return Be`<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=!!r.reversed,s=r.keywords??[],o=[r.arcana?`${r.arcana} arcana`:"",r.suit??""].filter(Boolean).join(" \xB7 ");return Be`<article class="card" aria-label="${r.name??"Tarot card"}">${this.renderImage(r.imageUrl,r.name,t)}<div><div class="meta">${o?`${o} \xB7 `:""}<span class="drawn">${t?"drawn reversed":"drawn upright"}</span></div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?Be`<p class="message">${e.dailyMessage}</p>`:Ba} ${r.meaning?Be`<p class="reading">${r.meaning}</p>`:Ba} ${s.length>0?Be`<div class="chips">${s.map(i=>Be`<span>${i}</span>`)}</div>`:Ba} ${this.renderGuidance(r,"tarot-daily-guidance")}</div></article>`}renderFullCard(e){let r=this.orientation==="reversed",t=r?e.reversed:e.upright,s=(r?e.keywords?.reversed:e.keywords?.upright)??t?.keywords??[];return Be`<article class="card" aria-label="${e.name??"Tarot card"}">${this.renderImage(e.imageUrl,e.name,r)}<div><div class="meta">${[e.arcana?`${e.arcana} arcana`:"",e.suit??"",e.number!==void 0&&e.number!==null?`no. ${e.number}`:""].filter(Boolean).join(" \xB7 ")}</div><h2 class="title">${e.name??"Tarot card"}</h2>${ve({items:[{id:"upright",label:"Upright"},{id:"reversed",label:"Reversed"}],active:this.orientation,onSelect:o=>{this.orientation=o},label:"Card orientation",idPrefix:"tarot"})} ${t?.description?Be`<p class="reading">${t.description}</p>`:Ba} ${s.length>0?Be`<div class="chips">${s.map(o=>Be`<span>${o}</span>`)}</div>`:Ba} ${this.renderGuidance(t,`tarot-${this.orientation}-guidance`)}</div></article>`}renderImage(e,r,t){let s=`image ${t?"reversed":""}`;return e?Be`<img class="${s}" src="${e}" alt="${r??"Tarot card"}">`:Be`<div class="${s}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r??"?"}</div>`}renderGuidance(e,r){if(!e)return Ba;let t=$d.map(([s,o])=>({label:o,body:e[s]??""}));return z(t,r,"Guidance")}};Wr.styles=[y,R,C,pe,bd`.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{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));display:block}.image.reversed{transform:rotate(180deg)}.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)}.drawn{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.reading{margin:0 0 var(--roxy-space-md,1rem);white-space:pre-line}.roxy-tablist{margin:var(--roxy-space-sm,.5rem) 0}.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);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}`],p([vd()],Wr.prototype,"orientation",2),Wr=p([Ld("roxy-tarot-card")],Wr);import{css as wd,html as it}from"lit";import{customElement as kd,property as Sd}from"lit/decorators.js";var Jr=class extends g{constructor(){super(...arguments);this.heading=""}renderEmpty(){return it`<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 it`<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=>it`<li class="tile">${o.imageUrl?it`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:it`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${Rd(o)}</p></li>`)}</ul></section>`}};Jr.styles=[y,wd`.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}`],p([Sd({type:String,reflect:!0})],Jr.prototype,"heading",2),Jr=p([kd("roxy-tarot-catalog")],Jr);function Rd(n){return n.suit?`${h(n.arcana)} \xB7 ${h(n.suit)}`:`${h(n.arcana)} Arcana`}import{css as Cd,html as F,nothing as Se}from"lit";import{customElement as Ad,property as Pd}from"lit/decorators.js";var Xr=class extends g{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return F`<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=r?e.card:void 0,d="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,u="summary"in e?e.summary:void 0,b=r?e.interpretation:void 0,$=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return F`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${d}</h2>${m?F`<span class="question">"${m}"</span>`:Se}</header>${r?F`<div class="verdict"><div class="card"><div class="image">${c?.imageUrl?F`<img src="${c.imageUrl}" alt="${c.name??"tarot card"}" class="${c.reversed?"reversed":""}">`:F`${c?.name??"?"}`}</div><p class="name">${c?.name??""} ${c?.reversed?F`<small>(reversed)</small>`:Se}</p>${c?.arcana?F`<p class="arcana">${c.arcana} arcana</p>`:Se}</div><div class="meta"><div><span class="${`answer ${$}`}">${i}</span> ${l?F`<small>· ${l}</small>`:Se}</div>${c?.keywords&&c.keywords.length>0?F`<div class="chips">${c.keywords.map(S=>F`<span>${S}</span>`)}</div>`:Se}</div></div>`:Se} ${s.length>0?F`<div class="grid">${s.map(S=>F`<div class="card"><p class="label">${S.name??""}</p><div class="image">${S.card?.imageUrl?F`<img src="${S.card.imageUrl}" alt="${S.card.name??"tarot card"}" class="${S.card.reversed?"reversed":""}">`:F`${S.card?.name??"?"}`}</div><p class="name">${S.card?.name??""} ${S.card?.reversed?F`<small>(reversed)</small>`:Se}</p>${S.interpretation?F`<p class="interp">${S.interpretation}</p>`:Se}</div>`)}</div>`:Se} ${o.length>0?F`<div class="grid">${o.map(S=>F`<div class="card"><div class="image">${S.imageUrl?F`<img src="${S.imageUrl}" alt="${S.name??"tarot card"}" class="${S.reversed?"reversed":""}">`:F`${S.name??"?"}`}</div><p class="name">${S.name??""} ${S.reversed?F`<small>(reversed)</small>`:Se}</p>${S.meaning?F`<p class="interp">${S.meaning}</p>`:Se}</div>`)}</div>`:Se} ${u?F`<p class="reading">${u}</p>`:Se} ${b?F`<p class="reading">${b}</p>`:Se}</article>`}};Xr.styles=[y,Cd`.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)}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.verdict{gap:var(--roxy-space-md,1rem);grid-template-columns:minmax(0,8rem) 1fr;align-items:start;display:grid}@container (width<=26rem){.verdict{grid-template-columns:1fr}}.verdict .meta{gap:var(--roxy-space-sm,.5rem);justify-items:start;display:grid}.arcana{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.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}`],p([Pd({type:String,reflect:!0})],Xr.prototype,"spread",2),Xr=p([Ad("roxy-tarot-spread")],Xr);import{css as Dd,html as ie,nothing as wr}from"lit";import{customElement as zd,state as Td}from"lit/decorators.js";var Qr=class extends g{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return ie`<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=[T(r),ue(t)].filter(Boolean).join(" "),c=o?.length??0,d=this.tab;return ie`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?ie`<p class="subtitle">${l}</p>`:wr}</div>${c>0?ie`${ve({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:d,onSelect:m=>{this.tab=m},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${d}" role="tabpanel" aria-labelledby="transits-tab-${d}">${d==="positions"?ie`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:ie`${i?this.renderSummaryPills(i):wr}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:ie`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return ie`<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 ie`<table class="planets-table"><caption class="roxy-sr-only">Transiting planets: each planet with its current sign, degree and daily speed.</caption><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[h(r.name)]??"",s=K[h(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return ie`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?ie`<span class="retro-badge" aria-label="retrograde">R</span>`:wr}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${f(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${f(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return ie`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=v[h(r.transitPlanet)]??"",o=v[h(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),d=r.isApplying?"Applying":"Separating";return ie`<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">${d} · orb ${f(r.orb,2)}° · strength ${f(r.strength,1)} </span>${_()}</summary><div class="interp-body">${l?.summary?ie`<p>${l.summary}</p>`:wr} ${l?.impact?ie`<p><strong>Impact:</strong> ${l.impact}</p>`:wr} ${l?.timing?ie`<p><strong>Timing:</strong> ${l.timing}</p>`:wr} ${l?.guidance?ie`<p><strong>Guidance:</strong> ${l.guidance}</p>`:wr} ${l?.keywords?.length?ie`<div class="interp-keywords">${l.keywords.map(m=>ie`<span class="kw">${m}</span>`)}</div>`:wr}</div></details>`})}</div>`}};Qr.styles=[y,pe,R,Dd`.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);grid-template-columns:minmax(0,1fr);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;min-width:0;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)}`],p([Td()],Qr.prototype,"tab",2),Qr=p([zd("roxy-transits-table")],Qr);import{css as Md,html as Ze,nothing as _a}from"lit";import{customElement as Ed}from"lit/decorators.js";var Ka=class extends g{renderEmpty(){return Ze`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[],t=a.planets??[];if(e.length===0&&r.length===0)return this.renderEmpty();let s=a.datetime?`${T(a.datetime)}, ${ue(a.datetime)}`:"";return Ze`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${s?Ze`<p class="subtitle">Chart time ${s}</p>`:_a}</div>${t.length>0?Ze`<div><p class="section-label">Sidereal positions</p><div class="mutual">${t.map(o=>Ze`<span class="position"><strong>${o.name}</strong> ${typeof o.longitude=="number"?Me(o.longitude):o.sign??""}</span>`)}</div></div>`:_a} ${r.length>0?Ze`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(o=>Ze`<span class="mutual-pill">${o.planet1} ⟷ ${o.planet2} ${o.aspectType?Ze`<span class="rel">${o.aspectType}</span>`:_a}</span>`)}</div></div>`:_a} ${e.length>0?Ze`<div class="overflow-scroll"><table><caption class="roxy-sr-only">Vedic planetary aspects: aspecting planet, aspect type, aspected planet, strength and orb.</caption><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(o=>Ze`<tr><td>${o.aspectingPlanet}</td><td><span class="kind">${o.aspectType}</span></td><td>${o.aspectedPlanet}</td><td>${typeof o.strength=="number"?Ze`<span class="bar" style="width:${Math.max(4,Math.min(100,o.strength)*.4)}px"></span><span class="num">${f(o.strength,0)}</span>`:_a}</td><td class="num">${typeof o.orb=="number"?`${f(o.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:_a}</div>`}};Ka.styles=[y,Md`.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);grid-template-columns:minmax(0,1fr);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}.position{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);color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums;align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.position strong{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem)}.overflow-scroll{-webkit-overflow-scrolling:touch;min-width:0;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}`],Ka=p([Ed("roxy-vedic-aspects")],Ka);import{html as fo}from"lit";import{customElement as Nd,property as bs}from"lit/decorators.js";var cr=class extends g{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?Rt(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return fo`<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 fo`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${At(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>${Ct(r,this.chartStyle)}</svg></div>`}};cr.styles=[y,Pt,pe],p([bs({type:String,reflect:!0,attribute:"chart-style"})],cr.prototype,"chartStyle",2),p([bs({type:String,reflect:!0,attribute:"chart-reference"})],cr.prototype,"chartReference",2),p([bs({type:String,reflect:!0,attribute:"lagna-override"})],cr.prototype,"lagnaOverride",2),cr=p([Nd("roxy-vedic-kundli")],cr);import{css as Gd,html as ae,nothing as De}from"lit";import{customElement as Hd}from"lit/decorators.js";var Od=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Ya=class extends g{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of Od){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 ae`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return ae`<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"><caption class="roxy-sr-only">Vedic planetary positions: each graha with its rashi, degree, nakshatra, pada, nakshatra lord, house, avastha and retrograde state.</caption><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[h(t.graha??r)]??"",i=K[h(t.rashi??"")]??"";return ae`<tr class="${s?"lagna":""}"><td class="graha">${o?ae`<span class="glyph">${o}</span>`:De}${t.graha??r}</td><td>${i?ae`<span class="glyph">${i}</span>`:De}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Me(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?ae`<span class="retro">R</span>`:De}</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?De:ae`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${_()}</summary><div class="panel-body">${a.map(e=>{let r=v[h(e.planet)]??"",t=f(e.distanceFromSun,2),s=f(e.orb,1);return ae`<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?De:ae`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${_()}</summary><div class="panel-body">${a.map(e=>{let r=f(e.distance,2);return ae`<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?De:ae`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${_()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=v[h(r)]??"";return ae`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?ae`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:De} ${t.nakshatra?ae`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:De}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?De:ae`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${_()}</summary><div class="panel-body">${a.map(e=>ae`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?ae`<p class="desc">${e.description}</p>`:De}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?De:ae`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${_()}</summary><div class="panel-body">${a.map(e=>ae`<div class="bhava"><span class="name">${e.name} ${e.quality?ae`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:De}</span> ${e.result?ae`<p class="desc">${e.result}</p>`:De}</div>`)}</div></details>`}};Ya.styles=[y,R,Gd`.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{min-width:0;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);grid-template-columns:minmax(0,1fr);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)}`],Ya=p([Hd("roxy-vedic-planets-table")],Ya);import{css as jd,html as ea,nothing as It}from"lit";import{customElement as Id}from"lit/decorators.js";var Fa=class extends g{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 ea`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return ea`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><caption class="roxy-sr-only">Western planetary positions: each body with its sign, degree, house and motion.</caption><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[h(r.name)]??"",s=K[h(r.sign??"")]??"",o=typeof r.speed=="number"?f(r.speed,3):"";return ea`<tr class="${r.isPoint?"point":""}"><td class="body">${t?ea`<span class="glyph">${t}</span>`:It}${r.name}</td><td>${s?ea`<span class="glyph">${s}</span>`:It}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Me(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?ea`${o}°/day`:It} ${r.isRetrograde?ea`<span class="retro">℞</span>`:It}</td></tr>`})}</tbody></table></div>`}};Fa.styles=[y,jd`.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}`],Fa=p([Id("roxy-western-planets-table")],Fa);import{css as Bd,html as ne,nothing as pr}from"lit";import{customElement as _d,state as Kd}from"lit/decorators.js";var ra=class extends g{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return ne`<span class="${r}">${e}</span>`}renderDetailCard(e){return ne`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):pr}</p>${e.description?ne`<p class="description">${e.description}</p>`:pr} ${e.result?ne`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:pr}</div>`}renderDetectCard(e){return ne`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):pr} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?ne`<p class="description">${e.description}</p>`:pr} ${e.present&&e.result?ne`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:pr} ${e.evidence?ne`<p class="evidence">${e.evidence}</p>`:pr}</div>`}renderEmpty(){return ne`<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 ne`<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,d=r?c.filter(b=>b.name.toLowerCase().includes(r)):c,m=[...d.filter(b=>b.present),...d.filter(b=>!b.present)],u=e.total??c.filter(b=>b.present).length;return ne`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${u} 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">${m.length>0?m.map(b=>this.renderDetectCard(b)):ne`<p class="no-results">No yogas match your search.</p>`}</div></div>`}if(t.length>0&&"description"in t[0]){let c=t,d=r?c.filter(u=>u.name.toLowerCase().includes(r)):c,m=e.total;return ne`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${m!==void 0?ne`<span class="count">${m} total</span>`:pr}</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">${d.length>0?d.map(u=>this.renderDetailCard(u)):ne`<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 ne`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?ne`<span class="count">${l} total</span>`:pr}</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=>ne`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):ne`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return ne`<div class="roxy-empty" role="status">No yoga data</div>`}};ra.styles=[y,Bd`.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}`],p([Kd()],ra.prototype,"filter",2),ra=p([_d("roxy-yoga-list")],ra);var Ls=[{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,navamsa}",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, POST /vedic-astrology/yoga/detect",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 the full reading: type, strategy, authority, profile, definition, incarnation cross, and a gate and line meaning for every activation",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, and gates, plus the type, strategy, authority, profile, and definition readings, the channels by circuit, the centers, and every activation with its gate and line meaning",topic:"Human Design"},{pascal:"RoxyHdTypeCard",tag:"roxy-hd-type-card",slug:"hd-type-card",heading:"HD type",description:"Human Design type reading without the chart: type, strategy, authority, and profile, with the aura mechanic, the signature and not-self themes, and the interpretation behind each label. Also renders the profile response with its two line keynotes",docsLabel:"Human Design",endpointLabel:"POST /human-design/type, /human-design/profile",docsSummary:"Type, strategy, authority, and profile tiles with the aura, signature, and not-self themes, plus the reading behind each label and the profile line keynotes",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, color, tone, and base, plus the reading for each arrow and the cognition",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction, color, tone, and base, plus a reading per arrow grouped by layer and the cognition",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,significant-dates,transits}",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 drawn line by line with trigram glyphs, judgment, image, and a reading for every line: the oracle statement and what it asks of the querent. A cast highlights the moving lines and shows only their readings, plus the hexagram it transforms into",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram figure with trigrams, judgment, image, and a reading per line (statement plus meaning); a cast highlights the moving lines and the resulting hexagram",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 Yd="0.15.0";var Lf=Ls.map(n=>n.slug);export{Ls as ROXY_COMPONENTS,Lf as ROXY_UI_COMPONENTS,Yd as ROXY_UI_VERSION,aa as RoxyAngelNumberCard,ta as RoxyAngelNumberLookup,kr as RoxyAshtakavargaGrid,sa as RoxyAspectsTable,ia as RoxyAstrocartographyMap,Cr as RoxyBiorhythmChart,Dr as RoxyBodygraph,la as RoxyChoghadiyaGrid,zr as RoxyCompatibilityCard,da as RoxyCrystalCard,Mr as RoxyCrystalGrid,Er as RoxyDashaTimeline,Gr as RoxyData,Or as RoxyDivisionalChart,Ir as RoxyDoshaCard,ma as RoxyDreamCard,ga as RoxyDreamSearch,fe as RoxyEndpointForm,ya as RoxyFixedStars,ua as RoxyForecastDigest,ha as RoxyForecastTimeline,fa as RoxyGunaMilan,ba as RoxyHdConnection,La as RoxyHdPenta,$a as RoxyHdTypeCard,wa as RoxyHdVariables,Br as RoxyHexagram,Sa as RoxyHoraTable,_r as RoxyHoroscopeCard,Kr as RoxyKpChart,Ra as RoxyKpPlanetsTable,Ca as RoxyKpRulingPlanets,Aa as RoxyLocalSpaceCompass,ge as RoxyLocationSearch,Fr as RoxyMoonPhase,Da as RoxyNakshatraCard,dr as RoxyNatalChart,qr as RoxyNumerologyCard,Zr as RoxyPanchangTable,Vr as RoxyPositionsTable,Ea as RoxyProfectionCard,Na as RoxyReferenceCard,Ga as RoxyRelocationWheel,Ha as RoxyShadbalaTable,Ia as RoxySynastryChart,Wr as RoxyTarotCard,Jr as RoxyTarotCatalog,Xr as RoxyTarotSpread,Qr as RoxyTransitsTable,Ka as RoxyVedicAspects,cr as RoxyVedicKundli,Ya as RoxyVedicPlanetsTable,Fa as RoxyWesternPlanetsTable,ra as RoxyYogaList,ko as roxyDataScript,ws 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=h(o);for(let l of s)if(h(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return oe;let l=H(V,V,xs-12,this.toAngle(o)),c=H(V,V,ja+8,this.toAngle(i)),d=ar(s),m=Sr[d]??"aspect-other",u=f(s.orb,1);return Oa`<line class=${`aspect ${m}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${d} ${s.planet2}${u?` (orb ${u}\xB0)`:""}</title></line>`})}renderAspects(a){return N`<table><caption class="roxy-sr-only">Inter-chart aspects: the planet from chart 1, the planet from chart 2, the aspect between them, the orb in degrees and the strength.</caption><thead><tr><th scope="col">Planet 1</th><th scope="col">Planet 2</th><th scope="col">Aspect</th><th scope="col">Orb</th><th scope="col">Strength</th></tr></thead><tbody>${a.map(e=>N`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${ar(e)||""}</td><td class="orb">${f(e.orb,1)}</td><td>${f(e.strength,0)}</td></tr>`)}</tbody></table>`}};Ia.styles=[y,R,C,ud`.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);grid-template-columns:minmax(0,1fr);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}.people{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.person{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);gap:.3rem;display:grid}.person-name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);align-items:center;gap:.4rem;display:flex}.person-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.person-dot.p1{background:var(--roxy-accent,#f59e0b)}.person-dot.p2{background:var(--roxy-info,#0284c7)}.big-three{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;gap:.25rem .75rem;display:flex}.big-three span{align-items:baseline;gap:.25rem;display:inline-flex}.big-three .lbl{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.summary-pills{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.glyph{font-size:1.1em;line-height:1}.static-head{align-items:center;gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;font-weight:500;display:flex}.asp-name{font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.asp-name.harmonious{color:var(--roxy-success-fg,#166534)}.asp-name.challenging{color:var(--roxy-danger-fg,#991b1b)}.interp-keywords{flex-wrap:wrap;gap:.25rem;display:flex}.interp-keywords .kw{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);padding:1px 8px}.context{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600)}.catalog>summary{cursor:pointer;font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);align-items:center;gap:.5rem;display:flex}.scroll{min-width:0;margin-top:var(--roxy-space-sm,.5rem);overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{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}`],Ia=p([hd("roxy-synastry-chart")],Ia);import{css as bd,html as Be,nothing as Ba}from"lit";import{customElement as Ld,state as vd}from"lit/decorators.js";var $d=[["love","Love"],["career","Career"],["finances","Finances"],["health","Health"],["spirituality","Spirituality"]],Wr=class extends g{constructor(){super(...arguments);this.orientation="upright"}renderEmpty(){return Be`<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=!!r.reversed,s=r.keywords??[],o=[r.arcana?`${r.arcana} arcana`:"",r.suit??""].filter(Boolean).join(" \xB7 ");return Be`<article class="card" aria-label="${r.name??"Tarot card"}">${this.renderImage(r.imageUrl,r.name,t)}<div><div class="meta">${o?`${o} \xB7 `:""}<span class="drawn">${t?"drawn reversed":"drawn upright"}</span></div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?Be`<p class="message">${e.dailyMessage}</p>`:Ba} ${r.meaning?Be`<p class="reading">${r.meaning}</p>`:Ba} ${s.length>0?Be`<div class="chips">${s.map(i=>Be`<span>${i}</span>`)}</div>`:Ba} ${this.renderGuidance(r,"tarot-daily-guidance")}</div></article>`}renderFullCard(e){let r=this.orientation==="reversed",t=r?e.reversed:e.upright,s=(r?e.keywords?.reversed:e.keywords?.upright)??t?.keywords??[];return Be`<article class="card" aria-label="${e.name??"Tarot card"}">${this.renderImage(e.imageUrl,e.name,r)}<div><div class="meta">${[e.arcana?`${e.arcana} arcana`:"",e.suit??"",e.number!==void 0&&e.number!==null?`no. ${e.number}`:""].filter(Boolean).join(" \xB7 ")}</div><h2 class="title">${e.name??"Tarot card"}</h2>${ve({items:[{id:"upright",label:"Upright"},{id:"reversed",label:"Reversed"}],active:this.orientation,onSelect:o=>{this.orientation=o},label:"Card orientation",idPrefix:"tarot"})} ${t?.description?Be`<p class="reading">${t.description}</p>`:Ba} ${s.length>0?Be`<div class="chips">${s.map(o=>Be`<span>${o}</span>`)}</div>`:Ba} ${this.renderGuidance(t,`tarot-${this.orientation}-guidance`)}</div></article>`}renderImage(e,r,t){let s=`image ${t?"reversed":""}`;return e?Be`<img class="${s}" src="${e}" alt="${r??"Tarot card"}">`:Be`<div class="${s}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r??"?"}</div>`}renderGuidance(e,r){if(!e)return Ba;let t=$d.map(([s,o])=>({label:o,body:e[s]??""}));return z(t,r,"Guidance")}};Wr.styles=[y,R,C,pe,bd`.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{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));display:block}.image.reversed{transform:rotate(180deg)}.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)}.drawn{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.reading{margin:0 0 var(--roxy-space-md,1rem);white-space:pre-line}.roxy-tablist{margin:var(--roxy-space-sm,.5rem) 0}.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);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}`],p([vd()],Wr.prototype,"orientation",2),Wr=p([Ld("roxy-tarot-card")],Wr);import{css as wd,html as it}from"lit";import{customElement as kd,property as Sd}from"lit/decorators.js";var Jr=class extends g{constructor(){super(...arguments);this.heading=""}renderEmpty(){return it`<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 it`<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=>it`<li class="tile">${o.imageUrl?it`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:it`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${Rd(o)}</p></li>`)}</ul></section>`}};Jr.styles=[y,wd`.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}`],p([Sd({type:String,reflect:!0})],Jr.prototype,"heading",2),Jr=p([kd("roxy-tarot-catalog")],Jr);function Rd(n){return n.suit?`${h(n.arcana)} \xB7 ${h(n.suit)}`:`${h(n.arcana)} Arcana`}import{css as Cd,html as F,nothing as Se}from"lit";import{customElement as Ad,property as Pd}from"lit/decorators.js";var Xr=class extends g{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return F`<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=r?e.card:void 0,d="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,u="summary"in e?e.summary:void 0,b=r?e.interpretation:void 0,$=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return F`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${d}</h2>${m?F`<span class="question">"${m}"</span>`:Se}</header>${r?F`<div class="verdict"><div class="card"><div class="image">${c?.imageUrl?F`<img src="${c.imageUrl}" alt="${c.name??"tarot card"}" class="${c.reversed?"reversed":""}">`:F`${c?.name??"?"}`}</div><p class="name">${c?.name??""} ${c?.reversed?F`<small>(reversed)</small>`:Se}</p>${c?.arcana?F`<p class="arcana">${c.arcana} arcana</p>`:Se}</div><div class="meta"><div><span class="${`answer ${$}`}">${i}</span> ${l?F`<small>· ${l}</small>`:Se}</div>${c?.keywords&&c.keywords.length>0?F`<div class="chips">${c.keywords.map(S=>F`<span>${S}</span>`)}</div>`:Se}</div></div>`:Se} ${s.length>0?F`<div class="grid">${s.map(S=>F`<div class="card"><p class="label">${S.name??""}</p><div class="image">${S.card?.imageUrl?F`<img src="${S.card.imageUrl}" alt="${S.card.name??"tarot card"}" class="${S.card.reversed?"reversed":""}">`:F`${S.card?.name??"?"}`}</div><p class="name">${S.card?.name??""} ${S.card?.reversed?F`<small>(reversed)</small>`:Se}</p>${S.interpretation?F`<p class="interp">${S.interpretation}</p>`:Se}</div>`)}</div>`:Se} ${o.length>0?F`<div class="grid">${o.map(S=>F`<div class="card"><div class="image">${S.imageUrl?F`<img src="${S.imageUrl}" alt="${S.name??"tarot card"}" class="${S.reversed?"reversed":""}">`:F`${S.name??"?"}`}</div><p class="name">${S.name??""} ${S.reversed?F`<small>(reversed)</small>`:Se}</p>${S.meaning?F`<p class="interp">${S.meaning}</p>`:Se}</div>`)}</div>`:Se} ${u?F`<p class="reading">${u}</p>`:Se} ${b?F`<p class="reading">${b}</p>`:Se}</article>`}};Xr.styles=[y,Cd`.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)}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.verdict{gap:var(--roxy-space-md,1rem);grid-template-columns:minmax(0,8rem) 1fr;align-items:start;display:grid}@container (width<=26rem){.verdict{grid-template-columns:1fr}}.verdict .meta{gap:var(--roxy-space-sm,.5rem);justify-items:start;display:grid}.arcana{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.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}`],p([Pd({type:String,reflect:!0})],Xr.prototype,"spread",2),Xr=p([Ad("roxy-tarot-spread")],Xr);import{css as Dd,html as ie,nothing as wr}from"lit";import{customElement as zd,state as Td}from"lit/decorators.js";var Qr=class extends g{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return ie`<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=[T(r),ue(t)].filter(Boolean).join(" "),c=o?.length??0,d=this.tab;return ie`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?ie`<p class="subtitle">${l}</p>`:wr}</div>${c>0?ie`${ve({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:d,onSelect:m=>{this.tab=m},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${d}" role="tabpanel" aria-labelledby="transits-tab-${d}">${d==="positions"?ie`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:ie`${i?this.renderSummaryPills(i):wr}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:ie`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return ie`<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 ie`<table class="planets-table"><caption class="roxy-sr-only">Transiting planets: each planet with its current sign, degree and daily speed.</caption><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[h(r.name)]??"",s=K[h(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return ie`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?ie`<span class="retro-badge" aria-label="retrograde">R</span>`:wr}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${f(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${f(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return ie`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=v[h(r.transitPlanet)]??"",o=v[h(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),d=r.isApplying?"Applying":"Separating";return ie`<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">${d} · orb ${f(r.orb,2)}° · strength ${f(r.strength,1)} </span>${_()}</summary><div class="interp-body">${l?.summary?ie`<p>${l.summary}</p>`:wr} ${l?.impact?ie`<p><strong>Impact:</strong> ${l.impact}</p>`:wr} ${l?.timing?ie`<p><strong>Timing:</strong> ${l.timing}</p>`:wr} ${l?.guidance?ie`<p><strong>Guidance:</strong> ${l.guidance}</p>`:wr} ${l?.keywords?.length?ie`<div class="interp-keywords">${l.keywords.map(m=>ie`<span class="kw">${m}</span>`)}</div>`:wr}</div></details>`})}</div>`}};Qr.styles=[y,pe,R,Dd`.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);grid-template-columns:minmax(0,1fr);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;min-width:0;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)}`],p([Td()],Qr.prototype,"tab",2),Qr=p([zd("roxy-transits-table")],Qr);import{css as Md,html as Ze,nothing as _a}from"lit";import{customElement as Ed}from"lit/decorators.js";var Ka=class extends g{renderEmpty(){return Ze`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[],t=a.planets??[];if(e.length===0&&r.length===0)return this.renderEmpty();let s=a.datetime?`${T(a.datetime)}, ${ue(a.datetime)}`:"";return Ze`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${s?Ze`<p class="subtitle">Chart time ${s}</p>`:_a}</div>${t.length>0?Ze`<div><p class="section-label">Sidereal positions</p><div class="mutual">${t.map(o=>Ze`<span class="position"><strong>${o.name}</strong> ${typeof o.longitude=="number"?Me(o.longitude):o.sign??""}</span>`)}</div></div>`:_a} ${r.length>0?Ze`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(o=>Ze`<span class="mutual-pill">${o.planet1} ⟷ ${o.planet2} ${o.aspectType?Ze`<span class="rel">${o.aspectType}</span>`:_a}</span>`)}</div></div>`:_a} ${e.length>0?Ze`<div class="overflow-scroll"><table><caption class="roxy-sr-only">Vedic planetary aspects: aspecting planet, aspect type, aspected planet, strength and orb.</caption><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(o=>Ze`<tr><td>${o.aspectingPlanet}</td><td><span class="kind">${o.aspectType}</span></td><td>${o.aspectedPlanet}</td><td>${typeof o.strength=="number"?Ze`<span class="bar" style="width:${Math.max(4,Math.min(100,o.strength)*.4)}px"></span><span class="num">${f(o.strength,0)}</span>`:_a}</td><td class="num">${typeof o.orb=="number"?`${f(o.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:_a}</div>`}};Ka.styles=[y,Md`.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);grid-template-columns:minmax(0,1fr);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}.position{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);color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums;align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.position strong{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem)}.overflow-scroll{-webkit-overflow-scrolling:touch;min-width:0;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}`],Ka=p([Ed("roxy-vedic-aspects")],Ka);import{html as fo}from"lit";import{customElement as Nd,property as bs}from"lit/decorators.js";var cr=class extends g{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?Rt(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return fo`<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 fo`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${At(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>${Ct(r,this.chartStyle)}</svg></div>`}};cr.styles=[y,Pt,pe],p([bs({type:String,reflect:!0,attribute:"chart-style"})],cr.prototype,"chartStyle",2),p([bs({type:String,reflect:!0,attribute:"chart-reference"})],cr.prototype,"chartReference",2),p([bs({type:String,reflect:!0,attribute:"lagna-override"})],cr.prototype,"lagnaOverride",2),cr=p([Nd("roxy-vedic-kundli")],cr);import{css as Gd,html as ae,nothing as De}from"lit";import{customElement as Hd}from"lit/decorators.js";var Od=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Ya=class extends g{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of Od){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 ae`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return ae`<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"><caption class="roxy-sr-only">Vedic planetary positions: each graha with its rashi, degree, nakshatra, pada, nakshatra lord, house, avastha and retrograde state.</caption><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[h(t.graha??r)]??"",i=K[h(t.rashi??"")]??"";return ae`<tr class="${s?"lagna":""}"><td class="graha">${o?ae`<span class="glyph">${o}</span>`:De}${t.graha??r}</td><td>${i?ae`<span class="glyph">${i}</span>`:De}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Me(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?ae`<span class="retro">R</span>`:De}</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?De:ae`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${_()}</summary><div class="panel-body">${a.map(e=>{let r=v[h(e.planet)]??"",t=f(e.distanceFromSun,2),s=f(e.orb,1);return ae`<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?De:ae`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${_()}</summary><div class="panel-body">${a.map(e=>{let r=f(e.distance,2);return ae`<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?De:ae`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${_()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=v[h(r)]??"";return ae`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?ae`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:De} ${t.nakshatra?ae`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:De}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?De:ae`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${_()}</summary><div class="panel-body">${a.map(e=>ae`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?ae`<p class="desc">${e.description}</p>`:De}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?De:ae`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${_()}</summary><div class="panel-body">${a.map(e=>ae`<div class="bhava"><span class="name">${e.name} ${e.quality?ae`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:De}</span> ${e.result?ae`<p class="desc">${e.result}</p>`:De}</div>`)}</div></details>`}};Ya.styles=[y,R,Gd`.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{min-width:0;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);grid-template-columns:minmax(0,1fr);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)}`],Ya=p([Hd("roxy-vedic-planets-table")],Ya);import{css as jd,html as ea,nothing as It}from"lit";import{customElement as Id}from"lit/decorators.js";var Fa=class extends g{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 ea`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return ea`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><caption class="roxy-sr-only">Western planetary positions: each body with its sign, degree, house and motion.</caption><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[h(r.name)]??"",s=K[h(r.sign??"")]??"",o=typeof r.speed=="number"?f(r.speed,3):"";return ea`<tr class="${r.isPoint?"point":""}"><td class="body">${t?ea`<span class="glyph">${t}</span>`:It}${r.name}</td><td>${s?ea`<span class="glyph">${s}</span>`:It}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Me(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?ea`${o}°/day`:It} ${r.isRetrograde?ea`<span class="retro">℞</span>`:It}</td></tr>`})}</tbody></table></div>`}};Fa.styles=[y,jd`.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}`],Fa=p([Id("roxy-western-planets-table")],Fa);import{css as Bd,html as ne,nothing as pr}from"lit";import{customElement as _d,state as Kd}from"lit/decorators.js";var ra=class extends g{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return ne`<span class="${r}">${e}</span>`}renderDetailCard(e){return ne`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):pr}</p>${e.description?ne`<p class="description">${e.description}</p>`:pr} ${e.result?ne`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:pr}</div>`}renderDetectCard(e){return ne`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):pr} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?ne`<p class="description">${e.description}</p>`:pr} ${e.present&&e.result?ne`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:pr} ${e.evidence?ne`<p class="evidence">${e.evidence}</p>`:pr}</div>`}renderEmpty(){return ne`<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 ne`<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,d=r?c.filter(b=>b.name.toLowerCase().includes(r)):c,m=[...d.filter(b=>b.present),...d.filter(b=>!b.present)],u=e.total??c.filter(b=>b.present).length;return ne`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${u} 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">${m.length>0?m.map(b=>this.renderDetectCard(b)):ne`<p class="no-results">No yogas match your search.</p>`}</div></div>`}if(t.length>0&&"description"in t[0]){let c=t,d=r?c.filter(u=>u.name.toLowerCase().includes(r)):c,m=e.total;return ne`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${m!==void 0?ne`<span class="count">${m} total</span>`:pr}</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">${d.length>0?d.map(u=>this.renderDetailCard(u)):ne`<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 ne`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?ne`<span class="count">${l} total</span>`:pr}</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=>ne`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):ne`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return ne`<div class="roxy-empty" role="status">No yoga data</div>`}};ra.styles=[y,Bd`.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}`],p([Kd()],ra.prototype,"filter",2),ra=p([_d("roxy-yoga-list")],ra);var Ls=[{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,navamsa}",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 and nodes in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, planets and nodes 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, POST /vedic-astrology/yoga/detect",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 the full reading: type, strategy, authority, profile, definition, incarnation cross, and a gate and line meaning for every activation",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, and gates, plus the type, strategy, authority, profile, and definition readings, the channels by circuit, the centers, and every activation with its gate and line meaning",topic:"Human Design"},{pascal:"RoxyHdTypeCard",tag:"roxy-hd-type-card",slug:"hd-type-card",heading:"HD type",description:"Human Design type reading without the chart: type, strategy, authority, and profile, with the aura mechanic, the signature and not-self themes, and the interpretation behind each label. Also renders the profile response with its two line keynotes",docsLabel:"Human Design",endpointLabel:"POST /human-design/type, /human-design/profile",docsSummary:"Type, strategy, authority, and profile tiles with the aura, signature, and not-self themes, plus the reading behind each label and the profile line keynotes",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, color, tone, and base, plus the reading for each arrow and the cognition",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction, color, tone, and base, plus a reading per arrow grouped by layer and the cognition",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,significant-dates,transits}",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 drawn line by line with trigram glyphs, judgment, image, and a reading for every line: the oracle statement and what it asks of the querent. A cast highlights the moving lines and shows only their readings, plus the hexagram it transforms into",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram figure with trigrams, judgment, image, and a reading per line (statement plus meaning); a cast highlights the moving lines and the resulting hexagram",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 Yd="0.15.1";var Lf=Ls.map(n=>n.slug);export{Ls as ROXY_COMPONENTS,Lf as ROXY_UI_COMPONENTS,Yd as ROXY_UI_VERSION,aa as RoxyAngelNumberCard,ta as RoxyAngelNumberLookup,kr as RoxyAshtakavargaGrid,sa as RoxyAspectsTable,ia as RoxyAstrocartographyMap,Cr as RoxyBiorhythmChart,Dr as RoxyBodygraph,la as RoxyChoghadiyaGrid,zr as RoxyCompatibilityCard,da as RoxyCrystalCard,Mr as RoxyCrystalGrid,Er as RoxyDashaTimeline,Gr as RoxyData,Or as RoxyDivisionalChart,Ir as RoxyDoshaCard,ma as RoxyDreamCard,ga as RoxyDreamSearch,fe as RoxyEndpointForm,ya as RoxyFixedStars,ua as RoxyForecastDigest,ha as RoxyForecastTimeline,fa as RoxyGunaMilan,ba as RoxyHdConnection,La as RoxyHdPenta,$a as RoxyHdTypeCard,wa as RoxyHdVariables,Br as RoxyHexagram,Sa as RoxyHoraTable,_r as RoxyHoroscopeCard,Kr as RoxyKpChart,Ra as RoxyKpPlanetsTable,Ca as RoxyKpRulingPlanets,Aa as RoxyLocalSpaceCompass,ge as RoxyLocationSearch,Fr as RoxyMoonPhase,Da as RoxyNakshatraCard,dr as RoxyNatalChart,qr as RoxyNumerologyCard,Zr as RoxyPanchangTable,Vr as RoxyPositionsTable,Ea as RoxyProfectionCard,Na as RoxyReferenceCard,Ga as RoxyRelocationWheel,Ha as RoxyShadbalaTable,Ia as RoxySynastryChart,Wr as RoxyTarotCard,Jr as RoxyTarotCatalog,Xr as RoxyTarotSpread,Qr as RoxyTransitsTable,Ka as RoxyVedicAspects,cr as RoxyVedicKundli,Ya as RoxyVedicPlanetsTable,Fa as RoxyWesternPlanetsTable,ra as RoxyYogaList,ko as roxyDataScript,ws as serializeRoxyData};
104
104
  //# sourceMappingURL=index.js.map