@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/AGENTS.md +1 -1
- package/README.md +1 -1
- package/components-catalog.json +2 -2
- package/dist/cdn/components/kp-chart.js +1 -1
- package/dist/cdn/components/kp-chart.js.map +2 -2
- package/dist/cdn/roxy-ui.js +2 -2
- package/dist/cdn/roxy-ui.js.map +2 -2
- package/dist/components/kp-chart.d.ts +4 -3
- package/dist/components/kp-chart.d.ts.map +1 -1
- package/dist/components/kp-chart.js +1 -1
- package/dist/components/kp-chart.js.map +2 -2
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +2 -2
- package/dist/manifest.d.ts.map +1 -1
- package/dist/types/types.gen.d.ts +13 -1
- package/dist/types/types.gen.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/kp-chart.ts +5 -3
- package/src/manifest.ts +3 -2
- package/src/types/types.gen.ts +13 -1
- package/src/version.ts +1 -1
package/dist/index.cjs
CHANGED
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
`}function Dn(n){let a=n.lagnaSign.toLowerCase();return j.svg`
|
|
80
80
|
${An(n.divisionLabel)}
|
|
81
81
|
${be.map(e=>Pn(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,Ms(e,n.lagnaSign)))}
|
|
82
|
-
`}function rt(n,a){switch(a){case"north":return Sn(n);case"east":return Dn(n);default:return Ln(n)}}function at(n,a){return Me({items:mn,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var Es=require("lit"),tt=Es.css`.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 fr=class extends y{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 et(this.data.chart.meta,r)}renderEmpty(){return Oe.html`<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 Oe.html`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?Oe.html`<span class="division-meta">· ${t.sanskritName}</span>`:Oe.nothing}</h2>${t.significance?Oe.html`<p class="significance">${t.significance}</p>`:Oe.nothing}</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>${rt(r,this.chartStyle)}</svg> ${s&&s.length>0?Oe.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>Oe.html`<span class="vargottama-pill" role="listitem">${R[o]??""} ${o}</span>`)}</div>`:Oe.nothing}</div>`}};fr.styles=[u,tt,Se,Oe.css`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],p([(0,st.property)({type:String,reflect:!0,attribute:"chart-style"})],fr.prototype,"chartStyle",2),fr=p([(0,st.customElement)("roxy-divisional-chart")],fr);var ce=require("lit"),ot=require("lit/decorators.js");var zn={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},br=class extends y{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return ce.html`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=zn[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 ce.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${"type"in e&&e.type?ce.html`<p class="subtype"><span class="subtype-label">${this.type==="sadhesati"?"Current phase":"Type"}</span>${e.type}</p>`:ce.nothing} ${e.severity?ce.html`<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>`:ce.nothing} ${e.description?ce.html`<p class="description">${e.description}</p>`:ce.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?ce.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>ce.html`<li>${c}</li>`)}</ul></div>`:ce.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?ce.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>ce.html`<li>${c}</li>`)}</ul></div>`:ce.nothing}</article>`}renderEffects(e){if(!e.effects)return ce.nothing;let r=[];for(let[t,s]of Object.entries(e.effects))if(typeof s=="string"&&s.length>0)r.push(ce.html`<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(ce.html`<div><h3>${o}</h3><p>${i}</p></div>`);return r.length===0?ce.nothing:ce.html`<div class="effects">${r}</div>`}};br.styles=[u,ce.css`.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([(0,ot.property)({type:String,reflect:!0})],br.prototype,"type",2),br=p([(0,ot.customElement)("roxy-dosha-card")],br);var Ze=require("lit"),Ns=require("lit/decorators.js");var Fr=class extends y{renderData(a){return Ze.html`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?Ze.html`<span class="letter" aria-hidden="true">${a.letter}</span>`:Ze.nothing}<div><p class="label">Dream symbol</p>${a.name?Ze.html`<h2 class="name">${a.name}</h2>`:Ze.nothing}</div></header>${a.meaning?Ze.html`<p class="meaning">${a.meaning}</p>`:Ze.nothing}</article>`}renderEmpty(){return Ze.html`<div class="roxy-empty" role="status">No dream symbol</div>`}};Fr.styles=[u,Ze.css`.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}`],Fr=p([(0,Ns.customElement)("roxy-dream-card")],Fr);var or=require("lit"),Gs=require("lit/decorators.js");var qr=class extends y{renderEmpty(){return or.html`<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 or.html`<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=>or.html`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?or.html`<span class="letter" aria-hidden="true">${t.letter}</span>`:or.nothing} <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}))}};qr.styles=[u,or.css`.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}`],qr=p([(0,Gs.customElement)("roxy-dream-search")],qr);var me=require("lit"),je=require("lit/decorators.js");var Tt=new Map;async function Tn(n){let a=Tt.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 Tt.delete(n),e}),Tt.set(n,a)),a}var Ce=class extends me.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.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 Tn(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,g]of Object.entries(i.properties)){let h=this.resolve(g,s)??{};if(h.type==="object"&&h.properties){let w=new Set(h.required??[]);for(let[D,T]of Object.entries(h.properties)){let le=this.resolve(T,s)??{};o.push({key:`${d}.${D}`,name:D,group:d,type:this.fieldType(le),required:c.has(d)&&w.has(D),description:le.description,enum:le.enum,min:le.minimum,max:le.maximum,default:le.default})}}else o.push({key:d,name:d,type:this.fieldType(h),required:c.has(d),description:h.description,enum:h.enum,min:h.minimum,max:h.maximum,default:h.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let 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 me.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return me.html`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return me.nothing;let i=`roxy-form-${o.key}`;return me.html`<div class="field"><label for="${i}">${F(o.name)}${o.required?me.html`<span class="req" aria-hidden="true">*</span>`:me.nothing}</label> ${o.enum?me.html`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>me.html`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:me.html`<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?me.html`<small class="help">${o.description}</small>`:me.nothing}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?me.html`<div class="location-block"><label>${o?`${F(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>`:me.nothing,s=o=>me.html`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return me.html`<form @submit="${this.onSubmit}"><h2 class="title">${F(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):me.html`<fieldset class="person-group"><legend>${F(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}}};Ce.styles=[u,me.css`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.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([(0,je.property)({type:String,attribute:"data-endpoint"})],Ce.prototype,"endpoint",2),p([(0,je.property)({type:String})],Ce.prototype,"method",2),p([(0,je.property)({type:String,attribute:"spec-url"})],Ce.prototype,"specUrl",2),p([(0,je.property)({type:String,attribute:"submit-label"})],Ce.prototype,"submitLabel",2),p([(0,je.property)({attribute:!1})],Ce.prototype,"initialValues",2),p([(0,je.state)()],Ce.prototype,"fields",2),p([(0,je.state)()],Ce.prototype,"values",2),p([(0,je.state)()],Ce.prototype,"loaded",2),p([(0,je.state)()],Ce.prototype,"specError",2),Ce=p([(0,je.customElement)("roxy-endpoint-form")],Ce);var ye=require("lit"),Hs=require("lit/decorators.js");var Zr=class extends y{renderEmpty(){return ye.html`<div class="roxy-empty" role="status">No fixed star data</div>`}renderData(a){let e=a.conjunctions??[],r=a.stars??[];return ye.html`<div class="wrap"><header><h2 class="title">Fixed stars</h2>${typeof a.orb=="number"?ye.html`<span class="badge"><b>Orb</b> ${b(a.orb,1)}°</span>`:ye.nothing}</header>${a.summary?ye.html`<p class="summary">${a.summary}</p>`:ye.nothing} ${e.length?ye.html`<section><p class="subhead">Conjunctions to the chart</p>${e.map((t,s)=>ye.html`<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> ${ae()} <span class="interp-aside"><small>orb ${b(t.orb,2)}°</small></span></summary>${t.interpretation?ye.html`<div class="interp-body"><p>${t.interpretation}</p></div>`:ye.nothing}</details>`)}</section>`:ye.html`<p class="empty-note">No star sits within the orb of a natal point.</p>`} ${r.length?this.renderCatalog(r):ye.nothing}</div>`}renderCatalog(a){return ye.html`<details class="catalog"><summary>${ae()} 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=te[x(e.sign)];return ye.html`<tr><td>${e.name}</td><td>${r?ye.html`<span class="sg">${r}</span>`:ye.nothing}${Sa(e.degree)} ${e.sign}</td><td class="num">${b(e.magnitude,1)}</td><td>${e.nature}</td><td><div class="kw">${(e.keywords??[]).map(t=>ye.html`<span>${t}</span>`)}</div></td></tr>`})}</tbody></table></div></details>`}};Zr.styles=[u,G,_,ye.css`.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}`],Zr=p([(0,Hs.customElement)("roxy-fixed-stars")],Zr);var De=require("lit"),Os=require("lit/decorators.js");var Vr=class extends y{renderEmpty(){return De.html`<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=[W(a.startDate),W(a.endDate)].filter(Boolean).join(" \u2013 ");return De.html`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?De.html`<p class="subtitle">${r}</p>`:De.nothing}</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 De.html`<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?De.html`<div class="domains">${t.map(([s,o])=>De.html`<span class="domain-chip"><span class="swatch sw-${s}"></span>${F(s)} ${o}</span>`)}</div>`:De.nothing} ${e.length>0?De.html`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:De.html`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return De.html`<div class="event" role="listitem"><span class="event-date">${W(a.date)}</span> <span class="event-desc">${a.description??F(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${b(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};Vr.styles=[u,De.css`.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}`],Vr=p([(0,Os.customElement)("roxy-forecast-digest")],Vr);var pe=require("lit"),js=require("lit/decorators.js");var Mn={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},En=["western","vedic","biorhythm"],Ur=class extends y{renderEmpty(){return pe.html`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=En.filter(s=>e.some(o=>o.domain===s));return pe.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?pe.html`<div class="range">${W(a.startDate)} - ${W(a.endDate)} · ${a.count??e.length} events</div>`:pe.nothing}</header>${t.length?pe.html`<div class="legend">${t.map(s=>pe.html`<span><span class="swatch swatch-${s}"></span>${Mn[s]}</span>`)}</div>`:pe.nothing} ${r.length?pe.html`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:pe.html`<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 pe.html`<div class="day" role="listitem"><div class="day-date">${W(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 pe.html`<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?pe.html`<p class="event-desc">${a.description}</p>`:pe.nothing}<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?x(a.body):"",r=a.target?x(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=Gr[t]??"",o=t?va[t]??t:"",i=typeof a.orb=="number"?b(a.orb,1):"",l=this.typeQualifier(a);return t&&r?pe.html`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?pe.html`<span class="kind">orb ${i}°</span>`:pe.nothing}`:pe.html`<strong>${e||F(a.type??"")}</strong>${l?pe.html`<span class="kind">${l}</span>`:pe.nothing}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${x(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 ${x(a.target)}`:F(a.type??"")}};Ur.styles=[u,pe.css`.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}`],Ur=p([(0,js.customElement)("roxy-forecast-timeline")],Ur);var ue=require("lit"),Is=require("lit/decorators.js");var Nn={varna:1,vashya:2,tara:3,yoni:4,"graha maitri":5,gana:6,bhakoot:7,nadi:8},Wr=class extends y{renderEmpty(){return ue.html`<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 ue.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${b(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?ue.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${ss(a.percentage,1)}</small>`:ue.nothing}</div><div class="verdict-wrap">${typeof a.isCompatible=="boolean"?ue.html`<span class="verdict ${a.isCompatible?"yes":"no"}">${a.isCompatible?"Compatible":"Not compatible"}</span>`:ue.nothing} ${a.recommendation?ue.html`<span class="recommendation">${a.recommendation}</span>`:ue.nothing}</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?ue.html`<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 g=d.score??0,h=d.maxScore??Gn(d.category),w=h?g/h*100:0;return ue.html`<tr><td>${d.category} ${d.description?ue.html`<small>${d.description}</small>`:ue.nothing}</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:${w}%"></span></div></td><td class="score">${b(g,1)} / ${h}</td></tr>`})}</tbody></table>`:ue.nothing} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?ue.html`<div class="tags">${a.doshas?.map(d=>ue.html`<span class="dosha">${d}</span>`)} ${a.doshaCancellations?.map(d=>ue.html`<span class="cancel" title="${d.reason}">${d.dosha} cancelled</span>`)}</div>`:ue.nothing}</article>`}};Wr.styles=[u,ue.css`.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)}`],Wr=p([(0,Is.customElement)("roxy-guna-milan")],Wr);function Gn(n){return n&&Nn[n.toLowerCase()]||1}var $e=require("lit"),_s=require("lit/decorators.js");var Jr=class extends y{renderData(a){let e=a.channels??[],r=a.centers??[],t=r.filter(s=>s.defined).length;return $e.html`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?$e.html`<span class="count">${a.totalChannels} channels</span>`:$e.nothing}</header>${tr([{label:"Channels",value:a.totalChannels?.toString()},{label:"Combined definition",value:a.combinedDefinition?F(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 $e.nothing;let e=[{label:"Electromagnetic",aside:nt(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:nt(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:nt(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:nt(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 U(e,"hd-connection-dynamic","Dynamics")}renderCenters(a){return a.length===0?$e.nothing:$e.html`<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 $e.html`<div class="row"><span class="cname">${e.name??F(String(e.id??""))}</span> <span class="badge ${e.defined?o?"together":"defined":"open"}">${e.defined?o?"Only together":"Defined":"Open"} </span><span class="who">${Hn(!!e.defined,t,s)}</span></div>`})}</section>`}renderChannels(a,e){if(a.length===0)return $e.nothing;let r=new Map(e.map(s=>[String(s.id??""),s.name??""])),t=s=>r.get(s)||F(s);return $e.html`<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=>$e.html`<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?$e.html`<span class="dyn">${s.dynamic}</span>`:$e.nothing}</td><td class="held">${Bs(s.personAGates)}</td><td class="held">${Bs(s.personBGates)}</td></tr>`)}</tbody></table></div></section>`}renderEmpty(){return $e.html`<div class="roxy-empty" role="status">No connection data</div>`}};Jr.styles=[u,G,_,mr,$e.css`.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}`],Jr=p([(0,_s.customElement)("roxy-hd-connection")],Jr);function nt(n){if(typeof n=="number")return n===0?"None":n===1?"1 channel":`${n} channels`}function Bs(n){let a=n??[];return a.length>0?a.join(", "):"Neither"}function Hn(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"}var se=require("lit"),Ks=require("lit/decorators.js");var Xr=class extends y{renderData(a){let e=a.channels??[],r=a.gates??[],t=a.summary,s=t?.gapGates??[],o=e.some(i=>i.isCore);return se.html`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?se.html`<span class="count">${a.memberCount} members</span>`:se.nothing}</header>${tr([{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?se.html`<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>`:se.nothing} ${this.renderGates(r)} ${e.length>0||r.length>0?se.html`<p class="footnote">Members are lettered in the order they were sent, so A is the first member of the group.</p>`:se.nothing}</div>`}renderGroup(a,e,r){return e.length===0?se.nothing:se.html`<div class="section"><h3>${a}</h3>${r?se.html`<p class="note">${r}</p>`:se.nothing} ${e.map(t=>se.html`<div class="row"><span class="gates">${t.gateA}-${t.gateB}</span> <span class="cname">${t.name??""} ${t.circuit?se.html`<span class="circuit">${t.circuit} circuit</span>`:se.nothing} </span><span class="badge ${t.defined?"defined":"open"}">${t.defined?"Defined":"Open"}</span> ${t.isCore?se.html`<span class="badge core">Core</span>`:se.nothing} <span class="held">Gate ${t.gateA} held by ${Mt(t.gateAHeldBy)}. Gate ${t.gateB} held by ${Mt(t.gateBHeldBy)}.</span></div>`)}</div>`}renderGates(a){if(a.length===0)return se.nothing;let e=a.filter(r=>r.filled).length;return se.html`<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=>se.html`<div class="row"><span class="gate-id">${r.gate}</span> <span class="cname">${r.gateName??""}</span> ${r.filled?se.html`<span class="who">Held by ${Mt(r.heldBy)}</span>`:se.html`<span class="badge gap">Gap</span>`}</div>`)}</div>`}renderEmpty(){return se.html`<div class="roxy-empty" role="status">No penta data</div>`}};Xr.styles=[u,mr,se.css`.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}`],Xr=p([(0,Ks.customElement)("roxy-hd-penta")],Xr);var On="ABCDE";function Mt(n){let a=(n??[]).map(e=>On[e]??String(e+1));return a.length>0?a.join(", "):"nobody"}var Ie=require("lit"),Ys=require("lit/decorators.js");var Qr=class extends y{renderEmpty(){return Ie.html`<div class="roxy-empty" role="status">No Human Design data</div>`}renderData(a){return jn(a)?this.renderType(a):this.renderProfile(a)}renderType(a){return Ie.html`<div class="wrap"><header class="head"><h2 class="title">Type</h2>${a.type||a.profile?Ie.html`<div class="type-line">${[a.type,a.profile?`Profile ${a.profile}`:""].filter(Boolean).join(" \xB7 ")}</div>`:Ie.nothing}</header>${tr([{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile}])} ${a.typeDescription?Ie.html`<p class="lead">${a.typeDescription}</p>`:Ie.nothing} ${Ka(a.signature,a.notSelf)} ${Ya([{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 Ie.html`<div class="wrap"><header class="head"><h2 class="title">Profile</h2>${a.profile?Ie.html`<div class="type-line">${a.profile}</div>`:Ie.nothing}</header>${tr([{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>${Fa({personality:a.personalityKeynote,personalityLine:a.personalityLine,design:a.designKeynote,designLine:a.designLine})}</section></div>`}};Qr.styles=[u,G,_,mr,Ie.css`.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)}`],Qr=p([(0,Ys.customElement)("roxy-hd-type-card")],Qr);function jn(n){return typeof n.type=="string"}var K=require("lit"),qs=require("lit/decorators.js");var ea=class extends y{renderData(a){let e=[...a.arrows??[]].sort((r,t)=>Fs(r.position)-Fs(t.position));return K.html`<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?K.html`<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>`:K.nothing} ${this.renderReading(e,a.baseDescription)}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return K.html`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?K.html`<span class="layer">${a.layer}</span>`:K.nothing} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?K.html`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}${a.baseName?`, ${a.baseName}`:""}</span>`:K.nothing} ${a.activation?.planet?K.html`<span class="ctb">${[a.activation.planet,x(a.activation.side??"")].filter(Boolean).join(" \xB7 ")}</span>`:K.nothing} ${a.confident===!1?K.html`<span class="note" role="note">Knife-edge: could flip with a more precise birth time.</span>`:K.nothing}</div>`}renderReading(a,e){let r=a.filter(o=>o.description||o.colorMeaning);if(r.length===0)return K.nothing;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 K.html`<section class="block"><h3>Reading</h3>${[...t].map(([o,i])=>K.html`<div class="group">${o?K.html`<p class="group-head">${o}</p>`:K.nothing} ${i[0]?.layerDescription?K.html`<p class="group-note">${i[0].layerDescription}</p>`:K.nothing} ${i.map(l=>this.renderArrowReading(l,s++===0))}</div>`)} ${e?K.html`<p class="footnote">Base. ${e}</p>`:K.nothing}</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 K.html`<details class="interp-card" name="hd-variable" ?open="${e}"><summary><span class="interp-lead">${a.name??""}</span> ${ae()} ${a.position?K.html`<span class="interp-aside"><small>${a.position}</small></span>`:K.nothing}</summary><div class="interp-body">${a.description?K.html`<p>${a.description}</p>`:K.nothing} ${t.length>0?K.html`<dl class="facets">${t.map(s=>K.html`<dt>${s.label}</dt><dd>${s.body}</dd>`)}</dl>`:K.nothing}</div></details>`}renderEmpty(){return K.html`<div class="roxy-empty" role="status">No variables data</div>`}};ea.styles=[u,G,_,K.css`.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}`],ea=p([(0,qs.customElement)("roxy-hd-variables")],ea);function Fs(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}}var B=require("lit"),it=require("lit/decorators.js");var Lr=class extends y{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 B.html`<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 B.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?B.html`<div class="symbol">${r.symbol}</div>`:B.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((d,g)=>{let h=l.length-1-g+1,w=c.has(h),D=d===6||d===8;return B.html`<div class="line ${`${D?"broken":"solid"}${w?" changing":""}`}">${D?B.svg`<span class="seg"></span><span class="seg"></span>`:B.svg`<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?B.html`${r.chinese}`:B.nothing} ${r.pinyin?B.html`· ${r.pinyin}`:B.nothing}</p><div class="trigrams">${r.upperTrigram?B.html`<div>Upper <span class="tri-glyph">${wt[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:B.nothing} ${r.lowerTrigram?B.html`<div>Lower <span class="tri-glyph">${wt[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:B.nothing}</div>${r.judgment?B.html`<p class="judgment">${r.judgment}</p>`:B.nothing} ${r.image?B.html`<p class="image">${r.image}</p>`:B.nothing} ${o?B.html`<p class="message">${o}</p>`:B.nothing} ${r.interpretation?.general?B.html`<p>${r.interpretation.general}</p>`:B.nothing} ${c.size>0?B.html`<div class="changing">Changing lines: ${Array.from(c).sort((d,g)=>d-g).join(", ")}. ${i?.english?B.html`Becomes hexagram ${i.number} ${i.english}.`:B.nothing}</div>`:B.nothing} ${this.renderLines(r,c)}</div></article>`}renderLines(e,r){let t=e.changingLines??[];if(t.length===0)return B.nothing;let s=r.size>0,o=s?t.filter(l=>r.has(l.position)):t;if(o.length===0)return B.nothing;let i=o.map(l=>({label:`Line ${l.position}`,body:l.text??"",extra:l.meaning?B.html`<p class="line-meaning">${l.meaning}</p>`:B.nothing}));return U(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)}};Lr.styles=[u,G,_,B.css`.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([(0,it.property)({type:String,reflect:!0})],Lr.prototype,"mode",2),Lr=p([(0,it.customElement)("roxy-hexagram")],Lr);var Be=require("lit"),Zs=require("lit/decorators.js");var ra=class extends y{renderEmpty(){return Be.html`<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():Be.html`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?Be.html`<p class="subtitle">${a.date}</p>`:Be.nothing}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?Be.nothing:Be.html`<div class="col"><p class="section-label">${a}</p>${e.map(r=>Be.html`<div class="row"><span class="glyph" aria-hidden="true">${R[x(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${cr(r)}</span> ${typeof r.number=="number"?Be.html`<span class="num">${r.number}</span>`:Be.nothing}</div>`)}</div>`}};ra.styles=[u,Be.css`.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}}`],ra=p([(0,Zs.customElement)("roxy-hora-table")],ra);var k=require("lit"),lt=require("lit/decorators.js");var vr=class extends y{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return k.html`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?te[x(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 k.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${o?k.html`<div class="date">${o}</div>`:k.nothing}</div>${s!==null?k.html`<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>`:k.nothing}</header>${e.overview?k.html`<p class="overview">${e.overview}</p>`:k.nothing} ${this.renderSky(e)}<div class="sections">${e.love?k.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:k.nothing} ${e.career?k.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:k.nothing} ${e.health?k.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:k.nothing} ${e.finance?k.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:k.nothing} ${"advice"in e&&e.advice?k.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:k.nothing}</div>${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:[],g=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&d.length===0&&g.length===0?k.nothing:k.html`<div class="lucky">${i!==void 0?k.html`<span>Lucky number <strong>${i}</strong></span>`:k.nothing} ${l?k.html`<span>Lucky color <strong>${l}</strong></span>`:k.nothing} ${c.length?k.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:k.nothing} ${d.length?k.html`<span>Lucky days <strong>${d.join(", ")}</strong></span>`:k.nothing} ${g.length?k.html`<span class="compat-wrap">Best with <span class="compat">${g.map(h=>k.html`<span>${h}</span>`)}</span></span>`:k.nothing}</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 k.nothing;let o=r?te[x(r)]??"":"";return k.html`<div class="sky">${r||t?k.html`<div class="moon-line">${r?k.html`<span><span class="lbl">Moon</span> <span aria-hidden="true">${o}</span> <b>${r}</b></span>`:k.nothing} ${t?k.html`<span><span class="lbl">Phase</span> <b>${t}</b></span>`:k.nothing}</div>`:k.nothing} ${s.length?k.html`<ul class="transits" aria-label="Active transits">${s.map(i=>k.html`<li>${i}</li>`)}</ul>`:k.nothing}</div>`}renderMonth(e){let r=("weekByWeek"in e?e.weekByWeek:[])??[],t=("keyDates"in e?e.keyDates:[])??[];return r.length===0&&t.length===0?k.nothing:k.html`${r.length?k.html`<section><h3 class="block-title">Week by week</h3><div class="weeks">${r.map(s=>k.html`<div class="week"><span class="week-no">Week ${s.week}</span><div><div class="week-focus">${s.focus}</div>${s.advice?k.html`<p class="week-advice">${s.advice}</p>`:k.nothing}</div></div>`)}</div></section>`:k.nothing} ${t.length?k.html`<section><h3 class="block-title">Key dates</h3><dl class="dates">${t.map(s=>k.html`<div class="date-row"><dt>${W(s.date)||s.date}</dt><dd>${s.event}</dd></div>`)}</dl></section>`:k.nothing}`}};vr.styles=[u,k.css`.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([(0,lt.property)({type:String,reflect:!0})],vr.prototype,"period",2),vr=p([(0,lt.customElement)("roxy-horoscope-card")],vr);var M=require("lit"),ct=require("lit/decorators.js");var In=[{id:"planets",label:"Planets"},{id:"cusps",label:"Cusps"},{id:"significators",label:"Significators"}],dt=[1,2,3,4];function Et(n,a){return n?typeof a=="number"?`${n} ${a}`:n:""}function Vs(n){return[...new Set(n.map(String))].join(" > ")}var $r=class extends y{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 M.html`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return M.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?M.html`<div class="asc">Ascendant: <strong>${typeof r.longitude=="number"?qe(r.longitude):r.sign??""} </strong>${r.nakshatra?M.html`· ${Et(r.nakshatra,r.pada)}`:M.nothing} ${r.subLord?M.html`· sub lord ${r.subLord}`:M.nothing} ${typeof r.kpNumber=="number"?M.html`· KP ${r.kpNumber}`:M.nothing}</div>`:M.nothing} ${typeof e.meta?.ayanamsa=="number"?M.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${b(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?M.html`· ${e.meta.houseSystem} houses`:M.nothing}</div>`:M.nothing}</header>${Me({items:In,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?M.html`<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=>M.html`<tr><td class="body">${r.name}${r.retrograde?M.html`<span class="retro">R</span>`:M.nothing}</td><td class="num">${typeof r.longitude=="number"?qe(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${Et(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>`:M.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?M.html`<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=>M.html`<tr><td class="body num">${r.house}</td><td class="num">${typeof r.longitude=="number"?qe(r.longitude):r.sign??""}</td><td>${r.signLord??""}</td><td>${Et(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>`:M.html`<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?M.html`<p class="roxy-empty" role="status">No significators</p>`:M.html`${this.renderLevelLegend(r)} ${r.length?M.html`<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>${dt.map(s=>M.html`<th scope="col">L${s}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${r.map(s=>M.html`<tr><td class="body num">${s.house}</td>${dt.map(o=>this.renderCell(this.planetsAtLevel(s,o).join(", ")))}<td class="chain">${Vs(s.all??[])}</td></tr>`)}</tbody></table>`:M.nothing} ${t.length?M.html`<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>${dt.map(s=>M.html`<th scope="col">L${s}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${t.map(s=>M.html`<tr><td class="body">${s.planet}</td>${dt.map(o=>this.renderCell(this.housesAtLevel(s,o).join(", ")))}<td class="chain">${Vs(s.allHouses??[])}</td></tr>`)}</tbody></table>`:M.nothing}`}renderCell(e){return e?M.html`<td>${e}</td>`:M.html`<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?M.nothing:M.html`<ul class="legend" aria-label="Significator levels">${[...r.entries()].sort((t,s)=>t[0]-s[0]).map(([t,s])=>M.html`<li><b>L${t}</b>${s}</li>`)}</ul>`}};$r.styles=[u,Se,M.css`.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([(0,ct.state)()],$r.prototype,"activeTab",2),$r=p([(0,ct.customElement)("roxy-kp-chart")],$r);var We=require("lit"),Us=require("lit/decorators.js");var aa=class extends y{renderEmpty(){return We.html`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return We.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?We.html`<span class="ayanamsa">Ayanamsa: ${b(a.ayanamsa,2)}°</span>`:We.nothing}</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=>We.html`<tr><td class="planet">${r.planet} ${r.retrograde?We.html`<span class="retro">R</span>`:We.nothing}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};aa.styles=[u,We.css`.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}`],aa=p([(0,Us.customElement)("roxy-kp-planets-table")],aa);var Ee=require("lit"),Ws=require("lit/decorators.js");var ta=class extends y{renderEmpty(){return Ee.html`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return Ee.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?Ee.html`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:Ee.nothing}</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?Ee.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>Ee.html`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:Ee.nothing} ${e.length?Ee.html`<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=>Ee.html`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:Ee.nothing}</div>`}};ta.styles=[u,Ee.css`.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}`],ta=p([(0,Ws.customElement)("roxy-kp-ruling-planets")],ta);var he=require("lit"),Js=require("lit/decorators.js");var Nt=320,Ve=Nt/2,nr=128,Bn=118,_n=140,Kn=150;function ir(n,a){let e=n*Math.PI/180;return{x:Ve+a*Math.sin(e),y:Ve-a*Math.cos(e)}}var Yn=[{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"}],sa=class extends y{renderEmpty(){return he.html`<div class="roxy-empty" role="status">No local space data</div>`}renderData(a){let e=a.bodies??[],r=a.birthDetails;return he.html`<div class="wrap"><header><h2 class="title">Local space</h2>${r?he.html`<div class="meta">${[r.date,r.time].filter(Boolean).join(" \xB7 ")}</div>`:he.nothing}</header>${this.renderDial(e)} ${a.summary?he.html`<p class="summary">${a.summary}</p>`:he.nothing} ${this.renderList(e)}</div>`}renderDial(a){return he.html`<svg viewBox="0 0 ${Nt} ${Nt}" 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="${Ve}" cy="${Ve}" r="${nr}"/><circle class="dial" cx="${Ve}" cy="${Ve}" r="${nr*.66}" stroke-width="0.5"/><circle class="dial" cx="${Ve}" cy="${Ve}" r="${nr*.33}" stroke-width="0.5"/>${this.renderCompassRing()} ${this.renderSpokes(a)}<circle class="center-dot" cx="${Ve}" cy="${Ve}" r="2.5"/></svg>`}renderCompassRing(){let a=[];for(let i=0;i<360;i+=22.5){let l=ir(i,nr),c=ir(i,nr-(i%45===0?8:4));a.push(he.svg`<line class="tick" x1=${c.x} y1=${c.y} x2=${l.x} y2=${l.y} />`)}let e=ir(0,nr),r=ir(180,nr),t=ir(90,nr),s=ir(270,nr),o=Yn.map(({az:i,label:l})=>{let c=ir(i,Kn),d=i%90===0;return he.svg`<text class=${`compass-label${d?" cardinal":""}`} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${l}</text>`});return he.svg`
|
|
82
|
+
`}function rt(n,a){switch(a){case"north":return Sn(n);case"east":return Dn(n);default:return Ln(n)}}function at(n,a){return Me({items:mn,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var Es=require("lit"),tt=Es.css`.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 fr=class extends y{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 et(this.data.chart.meta,r)}renderEmpty(){return Oe.html`<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 Oe.html`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?Oe.html`<span class="division-meta">· ${t.sanskritName}</span>`:Oe.nothing}</h2>${t.significance?Oe.html`<p class="significance">${t.significance}</p>`:Oe.nothing}</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>${rt(r,this.chartStyle)}</svg> ${s&&s.length>0?Oe.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>Oe.html`<span class="vargottama-pill" role="listitem">${R[o]??""} ${o}</span>`)}</div>`:Oe.nothing}</div>`}};fr.styles=[u,tt,Se,Oe.css`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],p([(0,st.property)({type:String,reflect:!0,attribute:"chart-style"})],fr.prototype,"chartStyle",2),fr=p([(0,st.customElement)("roxy-divisional-chart")],fr);var ce=require("lit"),ot=require("lit/decorators.js");var zn={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},br=class extends y{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return ce.html`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=zn[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 ce.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${"type"in e&&e.type?ce.html`<p class="subtype"><span class="subtype-label">${this.type==="sadhesati"?"Current phase":"Type"}</span>${e.type}</p>`:ce.nothing} ${e.severity?ce.html`<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>`:ce.nothing} ${e.description?ce.html`<p class="description">${e.description}</p>`:ce.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?ce.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>ce.html`<li>${c}</li>`)}</ul></div>`:ce.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?ce.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>ce.html`<li>${c}</li>`)}</ul></div>`:ce.nothing}</article>`}renderEffects(e){if(!e.effects)return ce.nothing;let r=[];for(let[t,s]of Object.entries(e.effects))if(typeof s=="string"&&s.length>0)r.push(ce.html`<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(ce.html`<div><h3>${o}</h3><p>${i}</p></div>`);return r.length===0?ce.nothing:ce.html`<div class="effects">${r}</div>`}};br.styles=[u,ce.css`.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([(0,ot.property)({type:String,reflect:!0})],br.prototype,"type",2),br=p([(0,ot.customElement)("roxy-dosha-card")],br);var Ze=require("lit"),Ns=require("lit/decorators.js");var Fr=class extends y{renderData(a){return Ze.html`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?Ze.html`<span class="letter" aria-hidden="true">${a.letter}</span>`:Ze.nothing}<div><p class="label">Dream symbol</p>${a.name?Ze.html`<h2 class="name">${a.name}</h2>`:Ze.nothing}</div></header>${a.meaning?Ze.html`<p class="meaning">${a.meaning}</p>`:Ze.nothing}</article>`}renderEmpty(){return Ze.html`<div class="roxy-empty" role="status">No dream symbol</div>`}};Fr.styles=[u,Ze.css`.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}`],Fr=p([(0,Ns.customElement)("roxy-dream-card")],Fr);var or=require("lit"),Gs=require("lit/decorators.js");var qr=class extends y{renderEmpty(){return or.html`<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 or.html`<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=>or.html`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?or.html`<span class="letter" aria-hidden="true">${t.letter}</span>`:or.nothing} <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}))}};qr.styles=[u,or.css`.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}`],qr=p([(0,Gs.customElement)("roxy-dream-search")],qr);var me=require("lit"),je=require("lit/decorators.js");var Tt=new Map;async function Tn(n){let a=Tt.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 Tt.delete(n),e}),Tt.set(n,a)),a}var Ce=class extends me.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.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 Tn(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,g]of Object.entries(i.properties)){let h=this.resolve(g,s)??{};if(h.type==="object"&&h.properties){let w=new Set(h.required??[]);for(let[D,T]of Object.entries(h.properties)){let le=this.resolve(T,s)??{};o.push({key:`${d}.${D}`,name:D,group:d,type:this.fieldType(le),required:c.has(d)&&w.has(D),description:le.description,enum:le.enum,min:le.minimum,max:le.maximum,default:le.default})}}else o.push({key:d,name:d,type:this.fieldType(h),required:c.has(d),description:h.description,enum:h.enum,min:h.minimum,max:h.maximum,default:h.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let 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 me.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return me.html`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return me.nothing;let i=`roxy-form-${o.key}`;return me.html`<div class="field"><label for="${i}">${F(o.name)}${o.required?me.html`<span class="req" aria-hidden="true">*</span>`:me.nothing}</label> ${o.enum?me.html`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>me.html`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:me.html`<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?me.html`<small class="help">${o.description}</small>`:me.nothing}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?me.html`<div class="location-block"><label>${o?`${F(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>`:me.nothing,s=o=>me.html`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return me.html`<form @submit="${this.onSubmit}"><h2 class="title">${F(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):me.html`<fieldset class="person-group"><legend>${F(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}}};Ce.styles=[u,me.css`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.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([(0,je.property)({type:String,attribute:"data-endpoint"})],Ce.prototype,"endpoint",2),p([(0,je.property)({type:String})],Ce.prototype,"method",2),p([(0,je.property)({type:String,attribute:"spec-url"})],Ce.prototype,"specUrl",2),p([(0,je.property)({type:String,attribute:"submit-label"})],Ce.prototype,"submitLabel",2),p([(0,je.property)({attribute:!1})],Ce.prototype,"initialValues",2),p([(0,je.state)()],Ce.prototype,"fields",2),p([(0,je.state)()],Ce.prototype,"values",2),p([(0,je.state)()],Ce.prototype,"loaded",2),p([(0,je.state)()],Ce.prototype,"specError",2),Ce=p([(0,je.customElement)("roxy-endpoint-form")],Ce);var ye=require("lit"),Hs=require("lit/decorators.js");var Zr=class extends y{renderEmpty(){return ye.html`<div class="roxy-empty" role="status">No fixed star data</div>`}renderData(a){let e=a.conjunctions??[],r=a.stars??[];return ye.html`<div class="wrap"><header><h2 class="title">Fixed stars</h2>${typeof a.orb=="number"?ye.html`<span class="badge"><b>Orb</b> ${b(a.orb,1)}°</span>`:ye.nothing}</header>${a.summary?ye.html`<p class="summary">${a.summary}</p>`:ye.nothing} ${e.length?ye.html`<section><p class="subhead">Conjunctions to the chart</p>${e.map((t,s)=>ye.html`<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> ${ae()} <span class="interp-aside"><small>orb ${b(t.orb,2)}°</small></span></summary>${t.interpretation?ye.html`<div class="interp-body"><p>${t.interpretation}</p></div>`:ye.nothing}</details>`)}</section>`:ye.html`<p class="empty-note">No star sits within the orb of a natal point.</p>`} ${r.length?this.renderCatalog(r):ye.nothing}</div>`}renderCatalog(a){return ye.html`<details class="catalog"><summary>${ae()} 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=te[x(e.sign)];return ye.html`<tr><td>${e.name}</td><td>${r?ye.html`<span class="sg">${r}</span>`:ye.nothing}${Sa(e.degree)} ${e.sign}</td><td class="num">${b(e.magnitude,1)}</td><td>${e.nature}</td><td><div class="kw">${(e.keywords??[]).map(t=>ye.html`<span>${t}</span>`)}</div></td></tr>`})}</tbody></table></div></details>`}};Zr.styles=[u,G,_,ye.css`.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}`],Zr=p([(0,Hs.customElement)("roxy-fixed-stars")],Zr);var De=require("lit"),Os=require("lit/decorators.js");var Vr=class extends y{renderEmpty(){return De.html`<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=[W(a.startDate),W(a.endDate)].filter(Boolean).join(" \u2013 ");return De.html`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?De.html`<p class="subtitle">${r}</p>`:De.nothing}</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 De.html`<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?De.html`<div class="domains">${t.map(([s,o])=>De.html`<span class="domain-chip"><span class="swatch sw-${s}"></span>${F(s)} ${o}</span>`)}</div>`:De.nothing} ${e.length>0?De.html`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:De.html`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return De.html`<div class="event" role="listitem"><span class="event-date">${W(a.date)}</span> <span class="event-desc">${a.description??F(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${b(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};Vr.styles=[u,De.css`.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}`],Vr=p([(0,Os.customElement)("roxy-forecast-digest")],Vr);var pe=require("lit"),js=require("lit/decorators.js");var Mn={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},En=["western","vedic","biorhythm"],Ur=class extends y{renderEmpty(){return pe.html`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=En.filter(s=>e.some(o=>o.domain===s));return pe.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?pe.html`<div class="range">${W(a.startDate)} - ${W(a.endDate)} · ${a.count??e.length} events</div>`:pe.nothing}</header>${t.length?pe.html`<div class="legend">${t.map(s=>pe.html`<span><span class="swatch swatch-${s}"></span>${Mn[s]}</span>`)}</div>`:pe.nothing} ${r.length?pe.html`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:pe.html`<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 pe.html`<div class="day" role="listitem"><div class="day-date">${W(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 pe.html`<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?pe.html`<p class="event-desc">${a.description}</p>`:pe.nothing}<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?x(a.body):"",r=a.target?x(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=Gr[t]??"",o=t?va[t]??t:"",i=typeof a.orb=="number"?b(a.orb,1):"",l=this.typeQualifier(a);return t&&r?pe.html`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?pe.html`<span class="kind">orb ${i}°</span>`:pe.nothing}`:pe.html`<strong>${e||F(a.type??"")}</strong>${l?pe.html`<span class="kind">${l}</span>`:pe.nothing}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${x(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 ${x(a.target)}`:F(a.type??"")}};Ur.styles=[u,pe.css`.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}`],Ur=p([(0,js.customElement)("roxy-forecast-timeline")],Ur);var ue=require("lit"),Is=require("lit/decorators.js");var Nn={varna:1,vashya:2,tara:3,yoni:4,"graha maitri":5,gana:6,bhakoot:7,nadi:8},Wr=class extends y{renderEmpty(){return ue.html`<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 ue.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${b(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?ue.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${ss(a.percentage,1)}</small>`:ue.nothing}</div><div class="verdict-wrap">${typeof a.isCompatible=="boolean"?ue.html`<span class="verdict ${a.isCompatible?"yes":"no"}">${a.isCompatible?"Compatible":"Not compatible"}</span>`:ue.nothing} ${a.recommendation?ue.html`<span class="recommendation">${a.recommendation}</span>`:ue.nothing}</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?ue.html`<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 g=d.score??0,h=d.maxScore??Gn(d.category),w=h?g/h*100:0;return ue.html`<tr><td>${d.category} ${d.description?ue.html`<small>${d.description}</small>`:ue.nothing}</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:${w}%"></span></div></td><td class="score">${b(g,1)} / ${h}</td></tr>`})}</tbody></table>`:ue.nothing} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?ue.html`<div class="tags">${a.doshas?.map(d=>ue.html`<span class="dosha">${d}</span>`)} ${a.doshaCancellations?.map(d=>ue.html`<span class="cancel" title="${d.reason}">${d.dosha} cancelled</span>`)}</div>`:ue.nothing}</article>`}};Wr.styles=[u,ue.css`.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)}`],Wr=p([(0,Is.customElement)("roxy-guna-milan")],Wr);function Gn(n){return n&&Nn[n.toLowerCase()]||1}var $e=require("lit"),_s=require("lit/decorators.js");var Jr=class extends y{renderData(a){let e=a.channels??[],r=a.centers??[],t=r.filter(s=>s.defined).length;return $e.html`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?$e.html`<span class="count">${a.totalChannels} channels</span>`:$e.nothing}</header>${tr([{label:"Channels",value:a.totalChannels?.toString()},{label:"Combined definition",value:a.combinedDefinition?F(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 $e.nothing;let e=[{label:"Electromagnetic",aside:nt(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:nt(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:nt(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:nt(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 U(e,"hd-connection-dynamic","Dynamics")}renderCenters(a){return a.length===0?$e.nothing:$e.html`<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 $e.html`<div class="row"><span class="cname">${e.name??F(String(e.id??""))}</span> <span class="badge ${e.defined?o?"together":"defined":"open"}">${e.defined?o?"Only together":"Defined":"Open"} </span><span class="who">${Hn(!!e.defined,t,s)}</span></div>`})}</section>`}renderChannels(a,e){if(a.length===0)return $e.nothing;let r=new Map(e.map(s=>[String(s.id??""),s.name??""])),t=s=>r.get(s)||F(s);return $e.html`<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=>$e.html`<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?$e.html`<span class="dyn">${s.dynamic}</span>`:$e.nothing}</td><td class="held">${Bs(s.personAGates)}</td><td class="held">${Bs(s.personBGates)}</td></tr>`)}</tbody></table></div></section>`}renderEmpty(){return $e.html`<div class="roxy-empty" role="status">No connection data</div>`}};Jr.styles=[u,G,_,mr,$e.css`.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}`],Jr=p([(0,_s.customElement)("roxy-hd-connection")],Jr);function nt(n){if(typeof n=="number")return n===0?"None":n===1?"1 channel":`${n} channels`}function Bs(n){let a=n??[];return a.length>0?a.join(", "):"Neither"}function Hn(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"}var se=require("lit"),Ks=require("lit/decorators.js");var Xr=class extends y{renderData(a){let e=a.channels??[],r=a.gates??[],t=a.summary,s=t?.gapGates??[],o=e.some(i=>i.isCore);return se.html`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?se.html`<span class="count">${a.memberCount} members</span>`:se.nothing}</header>${tr([{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?se.html`<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>`:se.nothing} ${this.renderGates(r)} ${e.length>0||r.length>0?se.html`<p class="footnote">Members are lettered in the order they were sent, so A is the first member of the group.</p>`:se.nothing}</div>`}renderGroup(a,e,r){return e.length===0?se.nothing:se.html`<div class="section"><h3>${a}</h3>${r?se.html`<p class="note">${r}</p>`:se.nothing} ${e.map(t=>se.html`<div class="row"><span class="gates">${t.gateA}-${t.gateB}</span> <span class="cname">${t.name??""} ${t.circuit?se.html`<span class="circuit">${t.circuit} circuit</span>`:se.nothing} </span><span class="badge ${t.defined?"defined":"open"}">${t.defined?"Defined":"Open"}</span> ${t.isCore?se.html`<span class="badge core">Core</span>`:se.nothing} <span class="held">Gate ${t.gateA} held by ${Mt(t.gateAHeldBy)}. Gate ${t.gateB} held by ${Mt(t.gateBHeldBy)}.</span></div>`)}</div>`}renderGates(a){if(a.length===0)return se.nothing;let e=a.filter(r=>r.filled).length;return se.html`<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=>se.html`<div class="row"><span class="gate-id">${r.gate}</span> <span class="cname">${r.gateName??""}</span> ${r.filled?se.html`<span class="who">Held by ${Mt(r.heldBy)}</span>`:se.html`<span class="badge gap">Gap</span>`}</div>`)}</div>`}renderEmpty(){return se.html`<div class="roxy-empty" role="status">No penta data</div>`}};Xr.styles=[u,mr,se.css`.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}`],Xr=p([(0,Ks.customElement)("roxy-hd-penta")],Xr);var On="ABCDE";function Mt(n){let a=(n??[]).map(e=>On[e]??String(e+1));return a.length>0?a.join(", "):"nobody"}var Ie=require("lit"),Ys=require("lit/decorators.js");var Qr=class extends y{renderEmpty(){return Ie.html`<div class="roxy-empty" role="status">No Human Design data</div>`}renderData(a){return jn(a)?this.renderType(a):this.renderProfile(a)}renderType(a){return Ie.html`<div class="wrap"><header class="head"><h2 class="title">Type</h2>${a.type||a.profile?Ie.html`<div class="type-line">${[a.type,a.profile?`Profile ${a.profile}`:""].filter(Boolean).join(" \xB7 ")}</div>`:Ie.nothing}</header>${tr([{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile}])} ${a.typeDescription?Ie.html`<p class="lead">${a.typeDescription}</p>`:Ie.nothing} ${Ka(a.signature,a.notSelf)} ${Ya([{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 Ie.html`<div class="wrap"><header class="head"><h2 class="title">Profile</h2>${a.profile?Ie.html`<div class="type-line">${a.profile}</div>`:Ie.nothing}</header>${tr([{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>${Fa({personality:a.personalityKeynote,personalityLine:a.personalityLine,design:a.designKeynote,designLine:a.designLine})}</section></div>`}};Qr.styles=[u,G,_,mr,Ie.css`.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)}`],Qr=p([(0,Ys.customElement)("roxy-hd-type-card")],Qr);function jn(n){return typeof n.type=="string"}var K=require("lit"),qs=require("lit/decorators.js");var ea=class extends y{renderData(a){let e=[...a.arrows??[]].sort((r,t)=>Fs(r.position)-Fs(t.position));return K.html`<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?K.html`<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>`:K.nothing} ${this.renderReading(e,a.baseDescription)}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return K.html`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?K.html`<span class="layer">${a.layer}</span>`:K.nothing} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?K.html`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}${a.baseName?`, ${a.baseName}`:""}</span>`:K.nothing} ${a.activation?.planet?K.html`<span class="ctb">${[a.activation.planet,x(a.activation.side??"")].filter(Boolean).join(" \xB7 ")}</span>`:K.nothing} ${a.confident===!1?K.html`<span class="note" role="note">Knife-edge: could flip with a more precise birth time.</span>`:K.nothing}</div>`}renderReading(a,e){let r=a.filter(o=>o.description||o.colorMeaning);if(r.length===0)return K.nothing;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 K.html`<section class="block"><h3>Reading</h3>${[...t].map(([o,i])=>K.html`<div class="group">${o?K.html`<p class="group-head">${o}</p>`:K.nothing} ${i[0]?.layerDescription?K.html`<p class="group-note">${i[0].layerDescription}</p>`:K.nothing} ${i.map(l=>this.renderArrowReading(l,s++===0))}</div>`)} ${e?K.html`<p class="footnote">Base. ${e}</p>`:K.nothing}</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 K.html`<details class="interp-card" name="hd-variable" ?open="${e}"><summary><span class="interp-lead">${a.name??""}</span> ${ae()} ${a.position?K.html`<span class="interp-aside"><small>${a.position}</small></span>`:K.nothing}</summary><div class="interp-body">${a.description?K.html`<p>${a.description}</p>`:K.nothing} ${t.length>0?K.html`<dl class="facets">${t.map(s=>K.html`<dt>${s.label}</dt><dd>${s.body}</dd>`)}</dl>`:K.nothing}</div></details>`}renderEmpty(){return K.html`<div class="roxy-empty" role="status">No variables data</div>`}};ea.styles=[u,G,_,K.css`.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}`],ea=p([(0,qs.customElement)("roxy-hd-variables")],ea);function Fs(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}}var B=require("lit"),it=require("lit/decorators.js");var Lr=class extends y{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 B.html`<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 B.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?B.html`<div class="symbol">${r.symbol}</div>`:B.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((d,g)=>{let h=l.length-1-g+1,w=c.has(h),D=d===6||d===8;return B.html`<div class="line ${`${D?"broken":"solid"}${w?" changing":""}`}">${D?B.svg`<span class="seg"></span><span class="seg"></span>`:B.svg`<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?B.html`${r.chinese}`:B.nothing} ${r.pinyin?B.html`· ${r.pinyin}`:B.nothing}</p><div class="trigrams">${r.upperTrigram?B.html`<div>Upper <span class="tri-glyph">${wt[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:B.nothing} ${r.lowerTrigram?B.html`<div>Lower <span class="tri-glyph">${wt[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:B.nothing}</div>${r.judgment?B.html`<p class="judgment">${r.judgment}</p>`:B.nothing} ${r.image?B.html`<p class="image">${r.image}</p>`:B.nothing} ${o?B.html`<p class="message">${o}</p>`:B.nothing} ${r.interpretation?.general?B.html`<p>${r.interpretation.general}</p>`:B.nothing} ${c.size>0?B.html`<div class="changing">Changing lines: ${Array.from(c).sort((d,g)=>d-g).join(", ")}. ${i?.english?B.html`Becomes hexagram ${i.number} ${i.english}.`:B.nothing}</div>`:B.nothing} ${this.renderLines(r,c)}</div></article>`}renderLines(e,r){let t=e.changingLines??[];if(t.length===0)return B.nothing;let s=r.size>0,o=s?t.filter(l=>r.has(l.position)):t;if(o.length===0)return B.nothing;let i=o.map(l=>({label:`Line ${l.position}`,body:l.text??"",extra:l.meaning?B.html`<p class="line-meaning">${l.meaning}</p>`:B.nothing}));return U(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)}};Lr.styles=[u,G,_,B.css`.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([(0,it.property)({type:String,reflect:!0})],Lr.prototype,"mode",2),Lr=p([(0,it.customElement)("roxy-hexagram")],Lr);var Be=require("lit"),Zs=require("lit/decorators.js");var ra=class extends y{renderEmpty(){return Be.html`<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():Be.html`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?Be.html`<p class="subtitle">${a.date}</p>`:Be.nothing}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?Be.nothing:Be.html`<div class="col"><p class="section-label">${a}</p>${e.map(r=>Be.html`<div class="row"><span class="glyph" aria-hidden="true">${R[x(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${cr(r)}</span> ${typeof r.number=="number"?Be.html`<span class="num">${r.number}</span>`:Be.nothing}</div>`)}</div>`}};ra.styles=[u,Be.css`.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}}`],ra=p([(0,Zs.customElement)("roxy-hora-table")],ra);var k=require("lit"),lt=require("lit/decorators.js");var vr=class extends y{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return k.html`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?te[x(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 k.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${o?k.html`<div class="date">${o}</div>`:k.nothing}</div>${s!==null?k.html`<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>`:k.nothing}</header>${e.overview?k.html`<p class="overview">${e.overview}</p>`:k.nothing} ${this.renderSky(e)}<div class="sections">${e.love?k.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:k.nothing} ${e.career?k.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:k.nothing} ${e.health?k.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:k.nothing} ${e.finance?k.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:k.nothing} ${"advice"in e&&e.advice?k.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:k.nothing}</div>${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:[],g=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&d.length===0&&g.length===0?k.nothing:k.html`<div class="lucky">${i!==void 0?k.html`<span>Lucky number <strong>${i}</strong></span>`:k.nothing} ${l?k.html`<span>Lucky color <strong>${l}</strong></span>`:k.nothing} ${c.length?k.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:k.nothing} ${d.length?k.html`<span>Lucky days <strong>${d.join(", ")}</strong></span>`:k.nothing} ${g.length?k.html`<span class="compat-wrap">Best with <span class="compat">${g.map(h=>k.html`<span>${h}</span>`)}</span></span>`:k.nothing}</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 k.nothing;let o=r?te[x(r)]??"":"";return k.html`<div class="sky">${r||t?k.html`<div class="moon-line">${r?k.html`<span><span class="lbl">Moon</span> <span aria-hidden="true">${o}</span> <b>${r}</b></span>`:k.nothing} ${t?k.html`<span><span class="lbl">Phase</span> <b>${t}</b></span>`:k.nothing}</div>`:k.nothing} ${s.length?k.html`<ul class="transits" aria-label="Active transits">${s.map(i=>k.html`<li>${i}</li>`)}</ul>`:k.nothing}</div>`}renderMonth(e){let r=("weekByWeek"in e?e.weekByWeek:[])??[],t=("keyDates"in e?e.keyDates:[])??[];return r.length===0&&t.length===0?k.nothing:k.html`${r.length?k.html`<section><h3 class="block-title">Week by week</h3><div class="weeks">${r.map(s=>k.html`<div class="week"><span class="week-no">Week ${s.week}</span><div><div class="week-focus">${s.focus}</div>${s.advice?k.html`<p class="week-advice">${s.advice}</p>`:k.nothing}</div></div>`)}</div></section>`:k.nothing} ${t.length?k.html`<section><h3 class="block-title">Key dates</h3><dl class="dates">${t.map(s=>k.html`<div class="date-row"><dt>${W(s.date)||s.date}</dt><dd>${s.event}</dd></div>`)}</dl></section>`:k.nothing}`}};vr.styles=[u,k.css`.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([(0,lt.property)({type:String,reflect:!0})],vr.prototype,"period",2),vr=p([(0,lt.customElement)("roxy-horoscope-card")],vr);var M=require("lit"),ct=require("lit/decorators.js");var In=[{id:"planets",label:"Planets"},{id:"cusps",label:"Cusps"},{id:"significators",label:"Significators"}],dt=[1,2,3,4];function Et(n,a){return n?typeof a=="number"?`${n} ${a}`:n:""}function Vs(n){return[...new Set(n.map(String))].join(" > ")}var $r=class extends y{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 M.html`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return M.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?M.html`<div class="asc">Ascendant: <strong>${typeof r.longitude=="number"?qe(r.longitude):r.sign??""} </strong>${r.nakshatra?M.html`· ${Et(r.nakshatra,r.pada)}`:M.nothing} ${r.subLord?M.html`· sub lord ${r.subLord}`:M.nothing} ${typeof r.kpNumber=="number"?M.html`· KP ${r.kpNumber}`:M.nothing}</div>`:M.nothing} ${typeof e.meta?.ayanamsa=="number"?M.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${b(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?M.html`· ${e.meta.houseSystem} houses`:M.nothing}</div>`:M.nothing}</header>${Me({items:In,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?M.html`<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=>M.html`<tr><td class="body">${r.name}${r.retrograde?M.html`<span class="retro">R</span>`:M.nothing}</td><td class="num">${typeof r.longitude=="number"?qe(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${Et(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>`:M.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?M.html`<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=>M.html`<tr><td class="body num">${r.house}</td><td class="num">${typeof r.longitude=="number"?qe(r.longitude):r.sign??""}</td><td>${r.signLord??""}</td><td>${Et(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>`:M.html`<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?M.html`<p class="roxy-empty" role="status">No significators</p>`:M.html`${this.renderLevelLegend(r)} ${r.length?M.html`<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>${dt.map(s=>M.html`<th scope="col">L${s}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${r.map(s=>M.html`<tr><td class="body num">${s.house}</td>${dt.map(o=>this.renderCell(this.planetsAtLevel(s,o).join(", ")))}<td class="chain">${Vs(s.all??[])}</td></tr>`)}</tbody></table>`:M.nothing} ${t.length?M.html`<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>${dt.map(s=>M.html`<th scope="col">L${s}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${t.map(s=>M.html`<tr><td class="body">${s.planet}</td>${dt.map(o=>this.renderCell(this.housesAtLevel(s,o).join(", ")))}<td class="chain">${Vs(s.allHouses??[])}</td></tr>`)}</tbody></table>`:M.nothing}`}renderCell(e){return e?M.html`<td>${e}</td>`:M.html`<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?M.nothing:M.html`<ul class="legend" aria-label="Significator levels">${[...r.entries()].sort((t,s)=>t[0]-s[0]).map(([t,s])=>M.html`<li><b>L${t}</b>${s}</li>`)}</ul>`}};$r.styles=[u,Se,M.css`.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([(0,ct.state)()],$r.prototype,"activeTab",2),$r=p([(0,ct.customElement)("roxy-kp-chart")],$r);var We=require("lit"),Us=require("lit/decorators.js");var aa=class extends y{renderEmpty(){return We.html`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return We.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?We.html`<span class="ayanamsa">Ayanamsa: ${b(a.ayanamsa,2)}°</span>`:We.nothing}</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=>We.html`<tr><td class="planet">${r.planet} ${r.retrograde?We.html`<span class="retro">R</span>`:We.nothing}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};aa.styles=[u,We.css`.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}`],aa=p([(0,Us.customElement)("roxy-kp-planets-table")],aa);var Ee=require("lit"),Ws=require("lit/decorators.js");var ta=class extends y{renderEmpty(){return Ee.html`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return Ee.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?Ee.html`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:Ee.nothing}</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?Ee.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>Ee.html`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:Ee.nothing} ${e.length?Ee.html`<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=>Ee.html`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:Ee.nothing}</div>`}};ta.styles=[u,Ee.css`.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}`],ta=p([(0,Ws.customElement)("roxy-kp-ruling-planets")],ta);var he=require("lit"),Js=require("lit/decorators.js");var Nt=320,Ve=Nt/2,nr=128,Bn=118,_n=140,Kn=150;function ir(n,a){let e=n*Math.PI/180;return{x:Ve+a*Math.sin(e),y:Ve-a*Math.cos(e)}}var Yn=[{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"}],sa=class extends y{renderEmpty(){return he.html`<div class="roxy-empty" role="status">No local space data</div>`}renderData(a){let e=a.bodies??[],r=a.birthDetails;return he.html`<div class="wrap"><header><h2 class="title">Local space</h2>${r?he.html`<div class="meta">${[r.date,r.time].filter(Boolean).join(" \xB7 ")}</div>`:he.nothing}</header>${this.renderDial(e)} ${a.summary?he.html`<p class="summary">${a.summary}</p>`:he.nothing} ${this.renderList(e)}</div>`}renderDial(a){return he.html`<svg viewBox="0 0 ${Nt} ${Nt}" 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="${Ve}" cy="${Ve}" r="${nr}"/><circle class="dial" cx="${Ve}" cy="${Ve}" r="${nr*.66}" stroke-width="0.5"/><circle class="dial" cx="${Ve}" cy="${Ve}" r="${nr*.33}" stroke-width="0.5"/>${this.renderCompassRing()} ${this.renderSpokes(a)}<circle class="center-dot" cx="${Ve}" cy="${Ve}" r="2.5"/></svg>`}renderCompassRing(){let a=[];for(let i=0;i<360;i+=22.5){let l=ir(i,nr),c=ir(i,nr-(i%45===0?8:4));a.push(he.svg`<line class="tick" x1=${c.x} y1=${c.y} x2=${l.x} y2=${l.y} />`)}let e=ir(0,nr),r=ir(180,nr),t=ir(90,nr),s=ir(270,nr),o=Yn.map(({az:i,label:l})=>{let c=ir(i,Kn),d=i%90===0;return he.svg`<text class=${`compass-label${d?" cardinal":""}`} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${l}</text>`});return he.svg`
|
|
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=Or(e.planet,r),s=e.aboveHorizon===!1,o=ir(e.azimuth,Bn),i=ir(e.azimuth,_n),l=e.symbol||e.planet.slice(0,2),c=`${e.altitude>0?"+":""}${Math.round(e.altitude)}\xB0`;return he.svg`<g>
|
|
@@ -100,5 +100,5 @@
|
|
|
100
100
|
</g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=be.findIndex(h=>h.toLowerCase()===t.sign.toLowerCase());if(o===-1)return;let i=o*30+t.degree,l=this.toAngle(i),c=s===1?Yt+14:ba+14,d=ee(ie,ie,c,l),g=ee(ie,ie,Kt+14,l);e.push($.svg`<g>
|
|
101
101
|
<line class="asc-tick" x1=${d.x} y1=${d.y} x2=${g.x} y2=${g.y} />
|
|
102
102
|
<text class="asc-label" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
|
|
103
|
-
</g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=x(o);for(let l of s)if(x(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 $.nothing;let l=ee(ie,ie,Yt-12,this.toAngle(o)),c=ee(ie,ie,ba+8,this.toAngle(i)),d=ar(s),g=Gr[d]??"aspect-other",h=b(s.orb,1);return $.svg`<line class=${`aspect ${g}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${d} ${s.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}renderAspects(a){return $.html`<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=>$.html`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${ar(e)||""}</td><td class="orb">${b(e.orb,1)}</td><td>${b(e.strength,0)}</td></tr>`)}</tbody></table>`}};pa.styles=[u,G,_,$.css`.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}`],pa=p([(0,co.customElement)("roxy-synastry-chart")],pa);var ge=require("lit"),ht=require("lit/decorators.js");var ti=[["love","Love"],["career","Career"],["finances","Finances"],["health","Health"],["spirituality","Spirituality"]],Cr=class extends y{constructor(){super(...arguments);this.orientation="upright"}renderEmpty(){return ge.html`<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 ge.html`<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?ge.html`<p class="message">${e.dailyMessage}</p>`:ge.nothing} ${r.meaning?ge.html`<p class="reading">${r.meaning}</p>`:ge.nothing} ${s.length>0?ge.html`<div class="chips">${s.map(i=>ge.html`<span>${i}</span>`)}</div>`:ge.nothing} ${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 ge.html`<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>${Me({items:[{id:"upright",label:"Upright"},{id:"reversed",label:"Reversed"}],active:this.orientation,onSelect:o=>{this.orientation=o},label:"Card orientation",idPrefix:"tarot"})} ${t?.description?ge.html`<p class="reading">${t.description}</p>`:ge.nothing} ${s.length>0?ge.html`<div class="chips">${s.map(o=>ge.html`<span>${o}</span>`)}</div>`:ge.nothing} ${this.renderGuidance(t,`tarot-${this.orientation}-guidance`)}</div></article>`}renderImage(e,r,t){let s=`image ${t?"reversed":""}`;return e?ge.html`<img class="${s}" src="${e}" alt="${r??"Tarot card"}">`:ge.html`<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 ge.nothing;let t=ti.map(([s,o])=>({label:o,body:e[s]??""}));return U(t,r,"Guidance")}};Cr.styles=[u,G,_,Se,ge.css`.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([(0,ht.state)()],Cr.prototype,"orientation",2),Cr=p([(0,ht.customElement)("roxy-tarot-card")],Cr);var Pr=require("lit"),xt=require("lit/decorators.js");var Ar=class extends y{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Pr.html`<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 Pr.html`<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=>Pr.html`<li class="tile">${o.imageUrl?Pr.html`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:Pr.html`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${si(o)}</p></li>`)}</ul></section>`}};Ar.styles=[u,Pr.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);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([(0,xt.property)({type:String,reflect:!0})],Ar.prototype,"heading",2),Ar=p([(0,xt.customElement)("roxy-tarot-catalog")],Ar);function si(n){return n.suit?`${x(n.arcana)} \xB7 ${x(n.suit)}`:`${x(n.arcana)} Arcana`}var P=require("lit"),ft=require("lit/decorators.js");var Dr=class extends y{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return P.html`<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," "),g="question"in e?e.question:void 0,h="summary"in e?e.summary:void 0,w=r?e.interpretation:void 0,D=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return P.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${d}</h2>${g?P.html`<span class="question">"${g}"</span>`:P.nothing}</header>${r?P.html`<div class="verdict"><div class="card"><div class="image">${c?.imageUrl?P.html`<img src="${c.imageUrl}" alt="${c.name??"tarot card"}" class="${c.reversed?"reversed":""}">`:P.html`${c?.name??"?"}`}</div><p class="name">${c?.name??""} ${c?.reversed?P.html`<small>(reversed)</small>`:P.nothing}</p>${c?.arcana?P.html`<p class="arcana">${c.arcana} arcana</p>`:P.nothing}</div><div class="meta"><div><span class="${`answer ${D}`}">${i}</span> ${l?P.html`<small>· ${l}</small>`:P.nothing}</div>${c?.keywords&&c.keywords.length>0?P.html`<div class="chips">${c.keywords.map(T=>P.html`<span>${T}</span>`)}</div>`:P.nothing}</div></div>`:P.nothing} ${s.length>0?P.html`<div class="grid">${s.map(T=>P.html`<div class="card"><p class="label">${T.name??""}</p><div class="image">${T.card?.imageUrl?P.html`<img src="${T.card.imageUrl}" alt="${T.card.name??"tarot card"}" class="${T.card.reversed?"reversed":""}">`:P.html`${T.card?.name??"?"}`}</div><p class="name">${T.card?.name??""} ${T.card?.reversed?P.html`<small>(reversed)</small>`:P.nothing}</p>${T.interpretation?P.html`<p class="interp">${T.interpretation}</p>`:P.nothing}</div>`)}</div>`:P.nothing} ${o.length>0?P.html`<div class="grid">${o.map(T=>P.html`<div class="card"><div class="image">${T.imageUrl?P.html`<img src="${T.imageUrl}" alt="${T.name??"tarot card"}" class="${T.reversed?"reversed":""}">`:P.html`${T.name??"?"}`}</div><p class="name">${T.name??""} ${T.reversed?P.html`<small>(reversed)</small>`:P.nothing}</p>${T.meaning?P.html`<p class="interp">${T.meaning}</p>`:P.nothing}</div>`)}</div>`:P.nothing} ${h?P.html`<p class="reading">${h}</p>`:P.nothing} ${w?P.html`<p class="reading">${w}</p>`:P.nothing}</article>`}};Dr.styles=[u,P.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.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([(0,ft.property)({type:String,reflect:!0})],Dr.prototype,"spread",2),Dr=p([(0,ft.customElement)("roxy-tarot-spread")],Dr);var q=require("lit"),bt=require("lit/decorators.js");var zr=class extends y{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return q.html`<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=[W(r),Ae(t)].filter(Boolean).join(" "),c=o?.length??0,d=this.tab;return q.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?q.html`<p class="subtitle">${l}</p>`:q.nothing}</div>${c>0?q.html`${Me({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:d,onSelect:g=>{this.tab=g},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${d}" role="tabpanel" aria-labelledby="transits-tab-${d}">${d==="positions"?q.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:q.html`${i?this.renderSummaryPills(i):q.nothing}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:q.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return q.html`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return q.html`<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=R[x(r.name)]??"",s=te[x(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return q.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?q.html`<span class="retro-badge" aria-label="retrograde">R</span>`:q.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${b(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${b(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return q.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=R[x(r.transitPlanet)]??"",o=R[x(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),d=r.isApplying?"Applying":"Separating";return q.html`<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 ${b(r.orb,2)}° · strength ${b(r.strength,1)} </span>${ae()}</summary><div class="interp-body">${l?.summary?q.html`<p>${l.summary}</p>`:q.nothing} ${l?.impact?q.html`<p><strong>Impact:</strong> ${l.impact}</p>`:q.nothing} ${l?.timing?q.html`<p><strong>Timing:</strong> ${l.timing}</p>`:q.nothing} ${l?.guidance?q.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:q.nothing} ${l?.keywords?.length?q.html`<div class="interp-keywords">${l.keywords.map(g=>q.html`<span class="kw">${g}</span>`)}</div>`:q.nothing}</div></details>`})}</div>`}};zr.styles=[u,Se,G,q.css`.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([(0,bt.state)()],zr.prototype,"tab",2),zr=p([(0,bt.customElement)("roxy-transits-table")],zr);var xe=require("lit"),po=require("lit/decorators.js");var ma=class extends y{renderEmpty(){return xe.html`<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?`${W(a.datetime)}, ${Ae(a.datetime)}`:"";return xe.html`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${s?xe.html`<p class="subtitle">Chart time ${s}</p>`:xe.nothing}</div>${t.length>0?xe.html`<div><p class="section-label">Sidereal positions</p><div class="mutual">${t.map(o=>xe.html`<span class="position"><strong>${o.name}</strong> ${typeof o.longitude=="number"?qe(o.longitude):o.sign??""}</span>`)}</div></div>`:xe.nothing} ${r.length>0?xe.html`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(o=>xe.html`<span class="mutual-pill">${o.planet1} ⟷ ${o.planet2} ${o.aspectType?xe.html`<span class="rel">${o.aspectType}</span>`:xe.nothing}</span>`)}</div></div>`:xe.nothing} ${e.length>0?xe.html`<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=>xe.html`<tr><td>${o.aspectingPlanet}</td><td><span class="kind">${o.aspectType}</span></td><td>${o.aspectedPlanet}</td><td>${typeof o.strength=="number"?xe.html`<span class="bar" style="width:${Math.max(4,Math.min(100,o.strength)*.4)}px"></span><span class="num">${b(o.strength,0)}</span>`:xe.nothing}</td><td class="num">${typeof o.orb=="number"?`${b(o.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:xe.nothing}</div>`}};ma.styles=[u,xe.css`.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}`],ma=p([(0,po.customElement)("roxy-vedic-aspects")],ma);var qt=require("lit"),La=require("lit/decorators.js");var er=class extends y{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?et(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return qt.html`<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 qt.html`<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>${rt(r,this.chartStyle)}</svg></div>`}};er.styles=[u,tt,Se],p([(0,La.property)({type:String,reflect:!0,attribute:"chart-style"})],er.prototype,"chartStyle",2),p([(0,La.property)({type:String,reflect:!0,attribute:"chart-reference"})],er.prototype,"chartReference",2),p([(0,La.property)({type:String,reflect:!0,attribute:"lagna-override"})],er.prototype,"lagnaOverride",2),er=p([(0,La.customElement)("roxy-vedic-kundli")],er);var O=require("lit"),mo=require("lit/decorators.js");var oi=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],ga=class extends y{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of oi){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 O.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return O.html`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><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=R[x(t.graha??r)]??"",i=te[x(t.rashi??"")]??"";return O.html`<tr class="${s?"lagna":""}"><td class="graha">${o?O.html`<span class="glyph">${o}</span>`:O.nothing}${t.graha??r}</td><td>${i?O.html`<span class="glyph">${i}</span>`:O.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?qe(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?O.html`<span class="retro">R</span>`:O.nothing}</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?O.nothing:O.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${ae()}</summary><div class="panel-body">${a.map(e=>{let r=R[x(e.planet)]??"",t=b(e.distanceFromSun,2),s=b(e.orb,1);return O.html`<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?O.nothing:O.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${ae()}</summary><div class="panel-body">${a.map(e=>{let r=b(e.distance,2);return O.html`<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?O.nothing:O.html`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${ae()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=R[x(r)]??"";return O.html`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?O.html`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:O.nothing} ${t.nakshatra?O.html`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:O.nothing}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?O.nothing:O.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${ae()}</summary><div class="panel-body">${a.map(e=>O.html`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?O.html`<p class="desc">${e.description}</p>`:O.nothing}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?O.nothing:O.html`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${ae()}</summary><div class="panel-body">${a.map(e=>O.html`<div class="bhava"><span class="name">${e.name} ${e.quality?O.html`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:O.nothing}</span> ${e.result?O.html`<p class="desc">${e.result}</p>`:O.nothing}</div>`)}</div></details>`}};ga.styles=[u,G,O.css`.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)}`],ga=p([(0,mo.customElement)("roxy-vedic-planets-table")],ga);var Te=require("lit"),go=require("lit/decorators.js");var ya=class extends y{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 Te.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return Te.html`<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=R[x(r.name)]??"",s=te[x(r.sign??"")]??"",o=typeof r.speed=="number"?b(r.speed,3):"";return Te.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?Te.html`<span class="glyph">${t}</span>`:Te.nothing}${r.name}</td><td>${s?Te.html`<span class="glyph">${s}</span>`:Te.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?qe(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?Te.html`${o}°/day`:Te.nothing} ${r.isRetrograde?Te.html`<span class="retro">℞</span>`:Te.nothing}</td></tr>`})}</tbody></table></div>`}};ya.styles=[u,Te.css`.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}`],ya=p([(0,go.customElement)("roxy-western-planets-table")],ya);var Y=require("lit"),Lt=require("lit/decorators.js");var Tr=class extends y{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Y.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return Y.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Y.nothing}</p>${e.description?Y.html`<p class="description">${e.description}</p>`:Y.nothing} ${e.result?Y.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Y.nothing}</div>`}renderDetectCard(e){return Y.html`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Y.nothing} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?Y.html`<p class="description">${e.description}</p>`:Y.nothing} ${e.present&&e.result?Y.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Y.nothing} ${e.evidence?Y.html`<p class="evidence">${e.evidence}</p>`:Y.nothing}</div>`}renderEmpty(){return Y.html`<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 Y.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"present"in t[0]){let c=t,d=r?c.filter(w=>w.name.toLowerCase().includes(r)):c,g=[...d.filter(w=>w.present),...d.filter(w=>!w.present)],h=e.total??c.filter(w=>w.present).length;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${h} of ${c.length} present</span></div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter detected yogas by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Detected yogas">${g.length>0?g.map(w=>this.renderDetectCard(w)):Y.html`<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(h=>h.name.toLowerCase().includes(r)):c,g=e.total;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${g!==void 0?Y.html`<span class="count">${g} total</span>`:Y.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${d.length>0?d.map(h=>this.renderDetailCard(h)):Y.html`<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 Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Y.html`<span class="count">${l} total</span>`:Y.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>Y.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Y.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Y.html`<div class="roxy-empty" role="status">No yoga data</div>`}};Tr.styles=[u,Y.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-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([(0,Lt.state)()],Tr.prototype,"filter",2),Tr=p([(0,Lt.customElement)("roxy-yoga-list")],Tr);var vt=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyAstrocartographyMap",tag:"roxy-astrocartography-map",slug:"astrocartography-map",heading:"Astrocartography",description:"Astrocartography world map plotting each body Midheaven, IC, Ascendant, and Descendant relocation lines",docsLabel:"Western",endpointLabel:"POST /astrology/astrocartography",docsSummary:"World map of planetary MC, IC, Ascendant, and Descendant lines with per-line interpretations",topic:"Astrology"},{pascal:"RoxyLocalSpaceCompass",tag:"roxy-local-space-compass",slug:"local-space-compass",heading:"Local space",description:"Local space compass plotting each body direction from the birthplace by azimuth and altitude",docsLabel:"Western",endpointLabel:"POST /astrology/local-space",docsSummary:"Compass dial of planetary azimuth lines from the birthplace, dimmed below the horizon",topic:"Astrology"},{pascal:"RoxyRelocationWheel",tag:"roxy-relocation-wheel",slug:"relocation-wheel",heading:"Relocation chart",description:"Relocation chart wheel recomputing houses and angles for a new place, with the planets that change house",docsLabel:"Western",endpointLabel:"POST /astrology/relocation-chart",docsSummary:"Relocated chart wheel plus the move geometry, angular planets, and planets that change house",topic:"Astrology"},{pascal:"RoxyPositionsTable",tag:"roxy-positions-table",slug:"positions-table",heading:"Positions table",description:"Editorial positions table for asteroids, Black Moon Lilith, secondary progressions, solar arc directions, and the Arabic lots",docsLabel:"Western",endpointLabel:"POST /astrology/asteroids, /astrology/lilith, /astrology/progressions, /astrology/solar-arc, /astrology/arabic-lots",docsSummary:"Body, sign, degree, and per-shape columns (house, motion, formula, or natal arc) plus each reading",topic:"Astrology"},{pascal:"RoxyFixedStars",tag:"roxy-fixed-stars",slug:"fixed-stars",heading:"Fixed stars",description:"Fixed star conjunctions to the natal chart, tightest first, with the precessed star catalog",docsLabel:"Western",endpointLabel:"POST /astrology/fixed-stars",docsSummary:"Star to natal point conjunctions with readings, plus a catalog of position, magnitude, nature, and keywords",topic:"Astrology"},{pascal:"RoxyProfectionCard",tag:"roxy-profection-card",slug:"profection-card",heading:"Annual profection",description:"Annual profection card with the profected house and sign, the lord of the year, and its natal placement",docsLabel:"Western",endpointLabel:"POST /astrology/profections",docsSummary:"Profected house and sign for the year, the lord of the year, its natal placement, and the reading",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/{divisional-chart,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 yo="0.15.0";var ni=vt.map(n=>n.slug);
|
|
103
|
+
</g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=x(o);for(let l of s)if(x(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 $.nothing;let l=ee(ie,ie,Yt-12,this.toAngle(o)),c=ee(ie,ie,ba+8,this.toAngle(i)),d=ar(s),g=Gr[d]??"aspect-other",h=b(s.orb,1);return $.svg`<line class=${`aspect ${g}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${d} ${s.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}renderAspects(a){return $.html`<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=>$.html`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${ar(e)||""}</td><td class="orb">${b(e.orb,1)}</td><td>${b(e.strength,0)}</td></tr>`)}</tbody></table>`}};pa.styles=[u,G,_,$.css`.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}`],pa=p([(0,co.customElement)("roxy-synastry-chart")],pa);var ge=require("lit"),ht=require("lit/decorators.js");var ti=[["love","Love"],["career","Career"],["finances","Finances"],["health","Health"],["spirituality","Spirituality"]],Cr=class extends y{constructor(){super(...arguments);this.orientation="upright"}renderEmpty(){return ge.html`<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 ge.html`<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?ge.html`<p class="message">${e.dailyMessage}</p>`:ge.nothing} ${r.meaning?ge.html`<p class="reading">${r.meaning}</p>`:ge.nothing} ${s.length>0?ge.html`<div class="chips">${s.map(i=>ge.html`<span>${i}</span>`)}</div>`:ge.nothing} ${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 ge.html`<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>${Me({items:[{id:"upright",label:"Upright"},{id:"reversed",label:"Reversed"}],active:this.orientation,onSelect:o=>{this.orientation=o},label:"Card orientation",idPrefix:"tarot"})} ${t?.description?ge.html`<p class="reading">${t.description}</p>`:ge.nothing} ${s.length>0?ge.html`<div class="chips">${s.map(o=>ge.html`<span>${o}</span>`)}</div>`:ge.nothing} ${this.renderGuidance(t,`tarot-${this.orientation}-guidance`)}</div></article>`}renderImage(e,r,t){let s=`image ${t?"reversed":""}`;return e?ge.html`<img class="${s}" src="${e}" alt="${r??"Tarot card"}">`:ge.html`<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 ge.nothing;let t=ti.map(([s,o])=>({label:o,body:e[s]??""}));return U(t,r,"Guidance")}};Cr.styles=[u,G,_,Se,ge.css`.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([(0,ht.state)()],Cr.prototype,"orientation",2),Cr=p([(0,ht.customElement)("roxy-tarot-card")],Cr);var Pr=require("lit"),xt=require("lit/decorators.js");var Ar=class extends y{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Pr.html`<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 Pr.html`<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=>Pr.html`<li class="tile">${o.imageUrl?Pr.html`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:Pr.html`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${si(o)}</p></li>`)}</ul></section>`}};Ar.styles=[u,Pr.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);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([(0,xt.property)({type:String,reflect:!0})],Ar.prototype,"heading",2),Ar=p([(0,xt.customElement)("roxy-tarot-catalog")],Ar);function si(n){return n.suit?`${x(n.arcana)} \xB7 ${x(n.suit)}`:`${x(n.arcana)} Arcana`}var P=require("lit"),ft=require("lit/decorators.js");var Dr=class extends y{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return P.html`<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," "),g="question"in e?e.question:void 0,h="summary"in e?e.summary:void 0,w=r?e.interpretation:void 0,D=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return P.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${d}</h2>${g?P.html`<span class="question">"${g}"</span>`:P.nothing}</header>${r?P.html`<div class="verdict"><div class="card"><div class="image">${c?.imageUrl?P.html`<img src="${c.imageUrl}" alt="${c.name??"tarot card"}" class="${c.reversed?"reversed":""}">`:P.html`${c?.name??"?"}`}</div><p class="name">${c?.name??""} ${c?.reversed?P.html`<small>(reversed)</small>`:P.nothing}</p>${c?.arcana?P.html`<p class="arcana">${c.arcana} arcana</p>`:P.nothing}</div><div class="meta"><div><span class="${`answer ${D}`}">${i}</span> ${l?P.html`<small>· ${l}</small>`:P.nothing}</div>${c?.keywords&&c.keywords.length>0?P.html`<div class="chips">${c.keywords.map(T=>P.html`<span>${T}</span>`)}</div>`:P.nothing}</div></div>`:P.nothing} ${s.length>0?P.html`<div class="grid">${s.map(T=>P.html`<div class="card"><p class="label">${T.name??""}</p><div class="image">${T.card?.imageUrl?P.html`<img src="${T.card.imageUrl}" alt="${T.card.name??"tarot card"}" class="${T.card.reversed?"reversed":""}">`:P.html`${T.card?.name??"?"}`}</div><p class="name">${T.card?.name??""} ${T.card?.reversed?P.html`<small>(reversed)</small>`:P.nothing}</p>${T.interpretation?P.html`<p class="interp">${T.interpretation}</p>`:P.nothing}</div>`)}</div>`:P.nothing} ${o.length>0?P.html`<div class="grid">${o.map(T=>P.html`<div class="card"><div class="image">${T.imageUrl?P.html`<img src="${T.imageUrl}" alt="${T.name??"tarot card"}" class="${T.reversed?"reversed":""}">`:P.html`${T.name??"?"}`}</div><p class="name">${T.name??""} ${T.reversed?P.html`<small>(reversed)</small>`:P.nothing}</p>${T.meaning?P.html`<p class="interp">${T.meaning}</p>`:P.nothing}</div>`)}</div>`:P.nothing} ${h?P.html`<p class="reading">${h}</p>`:P.nothing} ${w?P.html`<p class="reading">${w}</p>`:P.nothing}</article>`}};Dr.styles=[u,P.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.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([(0,ft.property)({type:String,reflect:!0})],Dr.prototype,"spread",2),Dr=p([(0,ft.customElement)("roxy-tarot-spread")],Dr);var q=require("lit"),bt=require("lit/decorators.js");var zr=class extends y{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return q.html`<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=[W(r),Ae(t)].filter(Boolean).join(" "),c=o?.length??0,d=this.tab;return q.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?q.html`<p class="subtitle">${l}</p>`:q.nothing}</div>${c>0?q.html`${Me({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:d,onSelect:g=>{this.tab=g},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${d}" role="tabpanel" aria-labelledby="transits-tab-${d}">${d==="positions"?q.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:q.html`${i?this.renderSummaryPills(i):q.nothing}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:q.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return q.html`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return q.html`<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=R[x(r.name)]??"",s=te[x(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return q.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?q.html`<span class="retro-badge" aria-label="retrograde">R</span>`:q.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${b(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${b(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return q.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=R[x(r.transitPlanet)]??"",o=R[x(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),d=r.isApplying?"Applying":"Separating";return q.html`<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 ${b(r.orb,2)}° · strength ${b(r.strength,1)} </span>${ae()}</summary><div class="interp-body">${l?.summary?q.html`<p>${l.summary}</p>`:q.nothing} ${l?.impact?q.html`<p><strong>Impact:</strong> ${l.impact}</p>`:q.nothing} ${l?.timing?q.html`<p><strong>Timing:</strong> ${l.timing}</p>`:q.nothing} ${l?.guidance?q.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:q.nothing} ${l?.keywords?.length?q.html`<div class="interp-keywords">${l.keywords.map(g=>q.html`<span class="kw">${g}</span>`)}</div>`:q.nothing}</div></details>`})}</div>`}};zr.styles=[u,Se,G,q.css`.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([(0,bt.state)()],zr.prototype,"tab",2),zr=p([(0,bt.customElement)("roxy-transits-table")],zr);var xe=require("lit"),po=require("lit/decorators.js");var ma=class extends y{renderEmpty(){return xe.html`<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?`${W(a.datetime)}, ${Ae(a.datetime)}`:"";return xe.html`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${s?xe.html`<p class="subtitle">Chart time ${s}</p>`:xe.nothing}</div>${t.length>0?xe.html`<div><p class="section-label">Sidereal positions</p><div class="mutual">${t.map(o=>xe.html`<span class="position"><strong>${o.name}</strong> ${typeof o.longitude=="number"?qe(o.longitude):o.sign??""}</span>`)}</div></div>`:xe.nothing} ${r.length>0?xe.html`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(o=>xe.html`<span class="mutual-pill">${o.planet1} ⟷ ${o.planet2} ${o.aspectType?xe.html`<span class="rel">${o.aspectType}</span>`:xe.nothing}</span>`)}</div></div>`:xe.nothing} ${e.length>0?xe.html`<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=>xe.html`<tr><td>${o.aspectingPlanet}</td><td><span class="kind">${o.aspectType}</span></td><td>${o.aspectedPlanet}</td><td>${typeof o.strength=="number"?xe.html`<span class="bar" style="width:${Math.max(4,Math.min(100,o.strength)*.4)}px"></span><span class="num">${b(o.strength,0)}</span>`:xe.nothing}</td><td class="num">${typeof o.orb=="number"?`${b(o.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:xe.nothing}</div>`}};ma.styles=[u,xe.css`.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}`],ma=p([(0,po.customElement)("roxy-vedic-aspects")],ma);var qt=require("lit"),La=require("lit/decorators.js");var er=class extends y{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?et(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return qt.html`<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 qt.html`<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>${rt(r,this.chartStyle)}</svg></div>`}};er.styles=[u,tt,Se],p([(0,La.property)({type:String,reflect:!0,attribute:"chart-style"})],er.prototype,"chartStyle",2),p([(0,La.property)({type:String,reflect:!0,attribute:"chart-reference"})],er.prototype,"chartReference",2),p([(0,La.property)({type:String,reflect:!0,attribute:"lagna-override"})],er.prototype,"lagnaOverride",2),er=p([(0,La.customElement)("roxy-vedic-kundli")],er);var O=require("lit"),mo=require("lit/decorators.js");var oi=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],ga=class extends y{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of oi){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 O.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return O.html`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><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=R[x(t.graha??r)]??"",i=te[x(t.rashi??"")]??"";return O.html`<tr class="${s?"lagna":""}"><td class="graha">${o?O.html`<span class="glyph">${o}</span>`:O.nothing}${t.graha??r}</td><td>${i?O.html`<span class="glyph">${i}</span>`:O.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?qe(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?O.html`<span class="retro">R</span>`:O.nothing}</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?O.nothing:O.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${ae()}</summary><div class="panel-body">${a.map(e=>{let r=R[x(e.planet)]??"",t=b(e.distanceFromSun,2),s=b(e.orb,1);return O.html`<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?O.nothing:O.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${ae()}</summary><div class="panel-body">${a.map(e=>{let r=b(e.distance,2);return O.html`<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?O.nothing:O.html`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${ae()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=R[x(r)]??"";return O.html`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?O.html`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:O.nothing} ${t.nakshatra?O.html`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:O.nothing}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?O.nothing:O.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${ae()}</summary><div class="panel-body">${a.map(e=>O.html`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?O.html`<p class="desc">${e.description}</p>`:O.nothing}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?O.nothing:O.html`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${ae()}</summary><div class="panel-body">${a.map(e=>O.html`<div class="bhava"><span class="name">${e.name} ${e.quality?O.html`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:O.nothing}</span> ${e.result?O.html`<p class="desc">${e.result}</p>`:O.nothing}</div>`)}</div></details>`}};ga.styles=[u,G,O.css`.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)}`],ga=p([(0,mo.customElement)("roxy-vedic-planets-table")],ga);var Te=require("lit"),go=require("lit/decorators.js");var ya=class extends y{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 Te.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return Te.html`<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=R[x(r.name)]??"",s=te[x(r.sign??"")]??"",o=typeof r.speed=="number"?b(r.speed,3):"";return Te.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?Te.html`<span class="glyph">${t}</span>`:Te.nothing}${r.name}</td><td>${s?Te.html`<span class="glyph">${s}</span>`:Te.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?qe(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?Te.html`${o}°/day`:Te.nothing} ${r.isRetrograde?Te.html`<span class="retro">℞</span>`:Te.nothing}</td></tr>`})}</tbody></table></div>`}};ya.styles=[u,Te.css`.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}`],ya=p([(0,go.customElement)("roxy-western-planets-table")],ya);var Y=require("lit"),Lt=require("lit/decorators.js");var Tr=class extends y{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Y.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return Y.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Y.nothing}</p>${e.description?Y.html`<p class="description">${e.description}</p>`:Y.nothing} ${e.result?Y.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Y.nothing}</div>`}renderDetectCard(e){return Y.html`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Y.nothing} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?Y.html`<p class="description">${e.description}</p>`:Y.nothing} ${e.present&&e.result?Y.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Y.nothing} ${e.evidence?Y.html`<p class="evidence">${e.evidence}</p>`:Y.nothing}</div>`}renderEmpty(){return Y.html`<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 Y.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"present"in t[0]){let c=t,d=r?c.filter(w=>w.name.toLowerCase().includes(r)):c,g=[...d.filter(w=>w.present),...d.filter(w=>!w.present)],h=e.total??c.filter(w=>w.present).length;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${h} of ${c.length} present</span></div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter detected yogas by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Detected yogas">${g.length>0?g.map(w=>this.renderDetectCard(w)):Y.html`<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(h=>h.name.toLowerCase().includes(r)):c,g=e.total;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${g!==void 0?Y.html`<span class="count">${g} total</span>`:Y.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${d.length>0?d.map(h=>this.renderDetailCard(h)):Y.html`<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 Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Y.html`<span class="count">${l} total</span>`:Y.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>Y.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Y.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Y.html`<div class="roxy-empty" role="status">No yoga data</div>`}};Tr.styles=[u,Y.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-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([(0,Lt.state)()],Tr.prototype,"filter",2),Tr=p([(0,Lt.customElement)("roxy-yoga-list")],Tr);var vt=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyAstrocartographyMap",tag:"roxy-astrocartography-map",slug:"astrocartography-map",heading:"Astrocartography",description:"Astrocartography world map plotting each body Midheaven, IC, Ascendant, and Descendant relocation lines",docsLabel:"Western",endpointLabel:"POST /astrology/astrocartography",docsSummary:"World map of planetary MC, IC, Ascendant, and Descendant lines with per-line interpretations",topic:"Astrology"},{pascal:"RoxyLocalSpaceCompass",tag:"roxy-local-space-compass",slug:"local-space-compass",heading:"Local space",description:"Local space compass plotting each body direction from the birthplace by azimuth and altitude",docsLabel:"Western",endpointLabel:"POST /astrology/local-space",docsSummary:"Compass dial of planetary azimuth lines from the birthplace, dimmed below the horizon",topic:"Astrology"},{pascal:"RoxyRelocationWheel",tag:"roxy-relocation-wheel",slug:"relocation-wheel",heading:"Relocation chart",description:"Relocation chart wheel recomputing houses and angles for a new place, with the planets that change house",docsLabel:"Western",endpointLabel:"POST /astrology/relocation-chart",docsSummary:"Relocated chart wheel plus the move geometry, angular planets, and planets that change house",topic:"Astrology"},{pascal:"RoxyPositionsTable",tag:"roxy-positions-table",slug:"positions-table",heading:"Positions table",description:"Editorial positions table for asteroids, Black Moon Lilith, secondary progressions, solar arc directions, and the Arabic lots",docsLabel:"Western",endpointLabel:"POST /astrology/asteroids, /astrology/lilith, /astrology/progressions, /astrology/solar-arc, /astrology/arabic-lots",docsSummary:"Body, sign, degree, and per-shape columns (house, motion, formula, or natal arc) plus each reading",topic:"Astrology"},{pascal:"RoxyFixedStars",tag:"roxy-fixed-stars",slug:"fixed-stars",heading:"Fixed stars",description:"Fixed star conjunctions to the natal chart, tightest first, with the precessed star catalog",docsLabel:"Western",endpointLabel:"POST /astrology/fixed-stars",docsSummary:"Star to natal point conjunctions with readings, plus a catalog of position, magnitude, nature, and keywords",topic:"Astrology"},{pascal:"RoxyProfectionCard",tag:"roxy-profection-card",slug:"profection-card",heading:"Annual profection",description:"Annual profection card with the profected house and sign, the lord of the year, and its natal placement",docsLabel:"Western",endpointLabel:"POST /astrology/profections",docsSummary:"Profected house and sign for the year, the lord of the year, its natal placement, and the reading",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/{divisional-chart,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 yo="0.15.1";var ni=vt.map(n=>n.slug);
|
|
104
104
|
//# sourceMappingURL=index.cjs.map
|