@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/cdn/roxy-ui.js
CHANGED
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
`}function Bo(l){let r=l.lagnaSign.toLowerCase();return L`
|
|
82
82
|
${jo(l.divisionLabel)}
|
|
83
83
|
${K.map(e=>Io(e,l.placements[e.toLowerCase()]??[],e.toLowerCase()===r,es(e,l.lagnaSign)))}
|
|
84
|
-
`}function gt(l,r){switch(r){case"north":return Oo(l);case"east":return Bo(l);default:return Mo(l)}}function yt(l,r){return Z({items:ko,active:l,onSelect:r,label:"Kundli style",idPrefix:"kundli"})}var ht=h`.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 $e=class extends u{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,t=`D${e.number} ${e.name}`;return mt(this.data.chart.meta,t)}renderEmpty(){return s`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let t=this.viewModel();if(!t)return this.renderEmpty();let{division:a,vargottama:o}=e;return s`<div class="wrap"><div class="header"><div><h2 class="title">D${a.number} ${a.name} ${a.sanskritName&&a.sanskritName!==a.name?s`<span class="division-meta">· ${a.sanskritName}</span>`:n}</h2>${a.significance?s`<p class="significance">${a.significance}</p>`:n}</div>${yt(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${a.number} ${a.name} divisional chart with twelve sign houses"><title>D${a.number} ${a.name}</title>${gt(t,this.chartStyle)}</svg> ${o&&o.length>0?s`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${o.map(i=>s`<span class="vargottama-pill" role="listitem">${S[i]??""} ${i}</span>`)}</div>`:n}</div>`}};$e.styles=[x,ht,Y,h`.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}`],g([k({type:String,reflect:!0,attribute:"chart-style"})],$e.prototype,"chartStyle",2),$e=g([f("roxy-divisional-chart")],$e);var Ko={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},we=class extends u{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return s`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let t=!!e.present,a=Ko[this.type]??this.type,o=(e.severity??"").toLowerCase(),i=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=i*33,c=i===3?"var(--roxy-danger)":i>=1?"var(--roxy-warning)":"transparent";return s`<article class="card" aria-label="${a}"><header class="head"><h2 class="title">${a}</h2><span class="${`badge ${t?"present":"absent"}`}">${t?"Present":"Absent"}</span></header>${"type"in e&&e.type?s`<p class="subtype"><span class="subtype-label">${this.type==="sadhesati"?"Current phase":"Type"}</span>${e.type}</p>`:n} ${e.severity?s`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${i}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${d}%;background:${c}"></span></div>`:n} ${e.description?s`<p class="description">${e.description}</p>`:n} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?s`<div><h3>Remedies</h3><ul>${e.remedies.map(m=>s`<li>${m}</li>`)}</ul></div>`:n} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?s`<div><h3>Exceptions</h3><ul>${e.exceptions.map(m=>s`<li>${m}</li>`)}</ul></div>`:n}</article>`}renderEffects(e){if(!e.effects)return n;let t=[];for(let[a,o]of Object.entries(e.effects))if(typeof o=="string"&&o.length>0)t.push(s`<div><h3>${a}</h3><p>${o}</p></div>`);else if(o&&typeof o=="object")for(let[i,d]of Object.entries(o))typeof d=="string"&&d.length>0&&t.push(s`<div><h3>${i}</h3><p>${d}</p></div>`);return t.length===0?n:s`<div class="effects">${t}</div>`}};we.styles=[x,h`.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}`],g([k({type:String,reflect:!0})],we.prototype,"type",2),we=g([f("roxy-dosha-card")],we);var Je=class extends u{renderData(r){return s`<article class="card" aria-label="${r.name??"Dream symbol"}"><header class="head">${r.letter?s`<span class="letter" aria-hidden="true">${r.letter}</span>`:n}<div><p class="label">Dream symbol</p>${r.name?s`<h2 class="name">${r.name}</h2>`:n}</div></header>${r.meaning?s`<p class="meaning">${r.meaning}</p>`:n}</article>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No dream symbol</div>`}};Je.styles=[x,h`.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}`],Je=g([f("roxy-dream-card")],Je);var Xe=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(r){let e=r.symbols??[];if(e.length===0)return this.renderEmpty();let t=typeof r.total=="number"?r.total:e.length;return s`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${t} match${t===1?"":"es"}</span></header><ul class="grid">${e.map(a=>s`<li><button type="button" class="result" @click="${()=>this.select(a)}">${a.letter?s`<span class="letter" aria-hidden="true">${a.letter}</span>`:n} <span class="name">${a.name}</span></button></li>`)}</ul></section>`}select(r){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:r.id,name:r.name,letter:r.letter},bubbles:!0,composed:!0}))}};Xe.styles=[x,h`.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}`],Xe=g([f("roxy-dream-search")],Xe);var qt=new Map;async function qo(l){let r=qt.get(l);return r||(r=fetch(l).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw qt.delete(l),e}),qt.set(l,r)),r}var F=class extends J{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 t=this.fields.filter(o=>o.required).filter(o=>this.values[o.key]===void 0||this.values[o.key]==="");if(t.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:t.map(o=>o.key)},bubbles:!0,composed:!0}));return}let a={};for(let o of this.fields){let i=this.values[o.key];if(!(i===void 0||i===""))if(o.group){let d=a[o.group]??{};d[o.name]=i,a[o.group]=d}else a[o.name]=i}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:a,queryKeys:this.fields.filter(o=>o.inQuery).map(o=>o.name)},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await qo(this.specUrl),t=`/${this.endpoint.replace(/^\//,"")}`,a=e.paths?.[t]?.[this.method.toLowerCase()];if(!a)throw new Error(`Endpoint ${this.method} ${t} not found in OpenAPI spec`);let o=e.components?.schemas??{},i=[],d;if(a.requestBody){let m=a.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[p,y]of Object.entries(d.properties)){let b=this.resolve(y,o)??{};if(b.type==="object"&&b.properties){let $=new Set(b.required??[]);for(let[R,C]of Object.entries(b.properties)){let I=this.resolve(C,o)??{};i.push({key:`${p}.${R}`,name:R,group:p,type:this.fieldType(I),required:m.has(p)&&$.has(R),description:I.description,enum:I.enum,min:I.minimum,max:I.maximum,default:I.default})}}else i.push({key:p,name:p,type:this.fieldType(b),required:m.has(p),description:b.description,enum:b.enum,min:b.minimum,max:b.maximum,default:b.default})}}for(let m of a.parameters??[])if(m.in==="path"||m.in==="query"){let p=this.resolve(m.schema,o)??{};i.push({key:m.name,name:m.name,inQuery:m.in==="query",type:this.fieldType(p),required:!!m.required,description:p.description,enum:p.enum,default:p.default})}this.fields=i;let c={};for(let m of i){m.default!==void 0&&(c[m.key]=m.default);let p=m.group?this.initialValues?.[m.group]?.[m.name]:this.initialValues?.[m.name];p!==void 0&&(c[m.key]=p)}this.values=c,this.loaded=!0}catch(e){let t=e instanceof Error?e.message:String(e);this.specError=t,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:t},bubbles:!0,composed:!0}))}}resolve(e,t){if(e){if("$ref"in e&&e.$ref){let a=e.$ref.split("/").pop();return a?t[a]: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,t){this.values={...this.values,[e]:t}}groupHasLocation(e){let t=this.fields.filter(a=>a.group===e);return["latitude","longitude","timezone"].every(a=>t.some(o=>o.name===a))}onLocationFor(e){let t=e?`${e}.`:"";return a=>{let o=a.detail;o&&(this.values={...this.values,[`${t}latitude`]:o.latitude,[`${t}longitude`]:o.longitude,[`${t}timezone`]:o.timezone??o.utcOffset})}}render(){if(!this.loaded)return s`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return s`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=i=>{if(this.groupHasLocation(i.group)&&(i.name==="latitude"||i.name==="longitude"||i.name==="timezone"))return n;let d=`roxy-form-${i.key}`;return s`<div class="field"><label for="${d}">${T(i.name)}${i.required?s`<span class="req" aria-hidden="true">*</span>`:n}</label> ${i.enum?s`<select id="${d}" ?required="${i.required}" @change="${c=>this.setValue(i.key,c.target.value)}"><option value="">Choose</option>${i.enum.map(c=>s`<option value="${c}" ?selected="${this.values[i.key]===c}">${c}</option>`)}</select>`:s`<input id="${d}" type="${this.htmlType(i.type)}" ?required="${i.required}" min="${i.min??""}" max="${i.max??""}" step="${i.type==="number"?"any":""}" .value="${this.values[i.key]??""}" @input="${c=>this.setValue(i.key,this.coerce(i.type,c.target.value))}">`} ${i.description?s`<small class="help">${i.description}</small>`:n}</div>`},t=[];for(let i of this.fields)t.includes(i.group)||t.push(i.group);let a=i=>this.groupHasLocation(i)?s`<div class="location-block"><label>${i?`${T(i)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(i)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:n,o=i=>s`${a(i)}<div class="fields">${this.fields.filter(d=>d.group===i).map(d=>e(d))}</div>`;return s`<form @submit="${this.onSubmit}"><h2 class="title">${T(this.endpoint.split("/").pop()??"")}</h2>${t.map(i=>i===void 0?o(void 0):s`<fieldset class="person-group"><legend>${T(i)}</legend>${o(i)}</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,t){if(t!==""){if(e==="number"){let a=Number(t);return Number.isFinite(a)?a:void 0}return t}}};F.styles=[x,h`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}`],g([k({type:String,attribute:"data-endpoint"})],F.prototype,"endpoint",2),g([k({type:String})],F.prototype,"method",2),g([k({type:String,attribute:"spec-url"})],F.prototype,"specUrl",2),g([k({type:String,attribute:"submit-label"})],F.prototype,"submitLabel",2),g([k({attribute:!1})],F.prototype,"initialValues",2),g([N()],F.prototype,"fields",2),g([N()],F.prototype,"values",2),g([N()],F.prototype,"loaded",2),g([N()],F.prototype,"specError",2),F=g([f("roxy-endpoint-form")],F);var Qe=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No fixed star data</div>`}renderData(r){let e=r.conjunctions??[],t=r.stars??[];return s`<div class="wrap"><header><h2 class="title">Fixed stars</h2>${typeof r.orb=="number"?s`<span class="badge"><b>Orb</b> ${w(r.orb,1)}°</span>`:n}</header>${r.summary?s`<p class="summary">${r.summary}</p>`:n} ${e.length?s`<section><p class="subhead">Conjunctions to the chart</p>${e.map((a,o)=>s`<details class="interp-card" name="fixed-star-contacts" ?open="${o===0}"><summary><span class="interp-lead"><span class="point">${a.point}</span> conjunct ${a.star}</span> ${G()} <span class="interp-aside"><small>orb ${w(a.orb,2)}°</small></span></summary>${a.interpretation?s`<div class="interp-body"><p>${a.interpretation}</p></div>`:n}</details>`)}</section>`:s`<p class="empty-note">No star sits within the orb of a natal point.</p>`} ${t.length?this.renderCatalog(t):n}</div>`}renderCatalog(r){return s`<details class="catalog"><summary>${G()} Star catalog (${r.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>${r.map(e=>{let t=H[v(e.sign)];return s`<tr><td>${e.name}</td><td>${t?s`<span class="sg">${t}</span>`:n}${Hr(e.degree)} ${e.sign}</td><td class="num">${w(e.magnitude,1)}</td><td>${e.nature}</td><td><div class="kw">${(e.keywords??[]).map(a=>s`<span>${a}</span>`)}</div></td></tr>`})}</tbody></table></div></details>`}};Qe.styles=[x,E,P,h`.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}`],Qe=g([f("roxy-fixed-stars")],Qe);var er=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No digest data</div>`}renderData(r){let e=r.windows??[];if(e.length===0)return this.renderEmpty();let t=[D(r.startDate),D(r.endDate)].filter(Boolean).join(" \u2013 ");return s`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${t?s`<p class="subtitle">${t}</p>`:n}</div>${e.map(a=>this.renderWindow(a))}</div>`}windowLabel(r){return r===1?"Next 24 hours":typeof r=="number"?`Next ${r} days`:"Window"}renderWindow(r){let e=r.top??[],t=r.byDomain??{},a=Object.entries(t);return s`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(r.days)}</span> <span class="window-count">${r.count??0} event${r.count===1?"":"s"}</span></div>${a.length>0?s`<div class="domains">${a.map(([o,i])=>s`<span class="domain-chip"><span class="swatch sw-${o}"></span>${T(o)} ${i}</span>`)}</div>`:n} ${e.length>0?s`<div role="list">${e.map(o=>this.renderEvent(o))}</div>`:s`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(r){let e=typeof r.significance=="number"?r.significance:0;return s`<div class="event" role="listitem"><span class="event-date">${D(r.date)}</span> <span class="event-desc">${r.description??T(r.type??"")}</span> <span class="sig" role="img" aria-label="significance ${w(e,0)} of 100"><span class="sig-fill ${r.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};er.styles=[x,h`.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}`],er=g([f("roxy-forecast-digest")],er);var Yo={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Uo=["western","vedic","biorhythm"],rr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(r){let e=r.events??[],t=this.groupByDate(e),a=Uo.filter(o=>e.some(i=>i.domain===o));return s`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${r.startDate&&r.endDate?s`<div class="range">${D(r.startDate)} - ${D(r.endDate)} · ${r.count??e.length} events</div>`:n}</header>${a.length?s`<div class="legend">${a.map(o=>s`<span><span class="swatch swatch-${o}"></span>${Yo[o]}</span>`)}</div>`:n} ${t.length?s`<div class="days" role="list">${t.map(([o,i])=>this.renderDay(o,i))}</div>`:s`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(r){let e=new Map;for(let t of r){let a=t.date??"",o=e.get(a)??[];o.push(t),e.set(a,o)}return[...e.entries()]}renderDay(r,e){return s`<div class="day" role="listitem"><div class="day-date">${D(r)}</div><div class="events">${e.map(t=>this.renderEvent(t))}</div></div>`}renderEvent(r){let e=typeof r.significance=="number"?r.significance:0,t=Math.max(0,Math.min(100,e));return s`<div class="event"><span class="dot dot-${r.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(r)}</div>${r.description?s`<p class="event-desc">${r.description}</p>`:n}<div class="sig" title="Significance ${t} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${r.domain}" style="width:${t}%"></span> </span><span class="sig-val">${t}</span></div></div></div>`}renderHeadline(r){let e=r.body?v(r.body):"",t=r.target?v(r.target):"",a=r.aspect?r.aspect.toLowerCase():"",o=Be[a]??"",i=a?Nr[a]??a:"",d=typeof r.orb=="number"?w(r.orb,1):"",c=this.typeQualifier(r);return a&&t?s`<strong>${e}</strong> <span class="${o}">${i}</span> <strong>${t}</strong>${d?s`<span class="kind">orb ${d}°</span>`:n}`:s`<strong>${e||T(r.type??"")}</strong>${c?s`<span class="kind">${c}</span>`:n}`}typeQualifier(r){return r.type==="sign-ingress"&&r.target?`enters ${v(r.target)}`:r.type==="retrograde-station"&&r.station?r.station:r.type==="eclipse"?[r.kind,"eclipse"].filter(Boolean).join(" "):r.type==="critical-day"?"critical day":r.type==="dasha-change"&&r.target?`dasha ${v(r.target)}`:T(r.type??"")}};rr.styles=[x,h`.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}`],rr=g([f("roxy-forecast-timeline")],rr);var Fo={varna:1,vashya:2,tara:3,yoni:4,"graha maitri":5,gana:6,bhakoot:7,nadi:8},tr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(r){let e=(r.breakdown??[]).filter(p=>p?.category!==void 0),t=r.total??0,a=r.maxScore??36,o=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",d=o>=70?"var(--roxy-success)":o>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=o*2.827,m=(100-o)*2.827;return s`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${w(r.total,1)}</span> <span class="over">/ ${r.maxScore}</span> ${typeof r.percentage=="number"?s`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Ea(r.percentage,1)}</small>`:n}</div><div class="verdict-wrap">${typeof r.isCompatible=="boolean"?s`<span class="verdict ${r.isCompatible?"yes":"no"}">${r.isCompatible?"Compatible":"Not compatible"}</span>`:n} ${r.recommendation?s`<span class="recommendation">${r.recommendation}</span>`:n}</div></div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8" stroke-dasharray="${c},${m}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${e.length>0?s`<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(p=>{let y=p.score??0,b=p.maxScore??Vo(p.category),$=b?y/b*100:0;return s`<tr><td>${p.category} ${p.description?s`<small>${p.description}</small>`:n}</td><td class="classification">${p.person1??""}</td><td class="classification">${p.person2??""}</td><td class="bar-cell bar-col"><div class="mini-bar"><span style="width:${$}%"></span></div></td><td class="score">${w(y,1)} / ${b}</td></tr>`})}</tbody></table>`:n} ${(r.doshas?.length??0)>0||(r.doshaCancellations?.length??0)>0?s`<div class="tags">${r.doshas?.map(p=>s`<span class="dosha">${p}</span>`)} ${r.doshaCancellations?.map(p=>s`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:n}</article>`}};tr.styles=[x,h`.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)}`],tr=g([f("roxy-guna-milan")],tr);function Vo(l){return l&&Fo[l.toLowerCase()]||1}var ar=class extends u{renderData(r){let e=r.channels??[],t=r.centers??[],a=t.filter(o=>o.defined).length;return s`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof r.totalChannels=="number"?s`<span class="count">${r.totalChannels} channels</span>`:n}</header>${le([{label:"Channels",value:r.totalChannels?.toString()},{label:"Combined definition",value:r.combinedDefinition?T(String(r.combinedDefinition)):void 0},{label:"Centers defined",value:t.length>0?`${a} of ${t.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(r.summary)} ${this.renderCenters(t)} ${this.renderChannels(e,t)}</div>`}renderDynamics(r){if(!r)return n;let e=[{label:"Electromagnetic",aside:ut(r.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:ut(r.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:ut(r.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:ut(r.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 M(e,"hd-connection-dynamic","Dynamics")}renderCenters(r){return r.length===0?n:s`<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>${r.map(e=>{let t=e.definedBy??[],a=t.includes("A"),o=t.includes("B"),i=!!e.defined&&!a&&!o;return s`<div class="row"><span class="cname">${e.name??T(String(e.id??""))}</span> <span class="badge ${e.defined?i?"together":"defined":"open"}">${e.defined?i?"Only together":"Defined":"Open"} </span><span class="who">${Zo(!!e.defined,a,o)}</span></div>`})}</section>`}renderChannels(r,e){if(r.length===0)return n;let t=new Map(e.map(o=>[String(o.id??""),o.name??""])),a=o=>t.get(o)||T(o);return s`<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>${r.map(o=>s`<tr><td>${o.name??""}</td><td class="gates">${o.gateA}-${o.gateB}</td><td>${(o.centers??[]).map(a).join(" to ")}</td><td>${o.circuit??""}</td><td>${o.dynamic?s`<span class="dyn">${o.dynamic}</span>`:n}</td><td class="held">${rs(o.personAGates)}</td><td class="held">${rs(o.personBGates)}</td></tr>`)}</tbody></table></div></section>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No connection data</div>`}};ar.styles=[x,E,P,ue,h`.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}`],ar=g([f("roxy-hd-connection")],ar);function ut(l){if(typeof l=="number")return l===0?"None":l===1?"1 channel":`${l} channels`}function rs(l){let r=l??[];return r.length>0?r.join(", "):"Neither"}function Zo(l,r,e){return r&&e?"Defined in both charts":r?"Defined by A":e?"Defined by B":l?"Defined by neither alone, only by the connection":"Open in both charts"}var sr=class extends u{renderData(r){let e=r.channels??[],t=r.gates??[],a=r.summary,o=a?.gapGates??[],i=e.some(d=>d.isCore);return s`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof r.memberCount=="number"?s`<span class="count">${r.memberCount} members</span>`:n}</header>${le([{label:"Members",value:r.memberCount?.toString()},{label:"Defined channels",value:typeof a?.definedChannels=="number"&&e.length>0?`${a.definedChannels} of ${e.length}`:void 0},{label:"Filled gates",value:typeof a?.filledGates=="number"&&t.length>0?`${a.filledGates} of ${t.length}`:void 0},{label:"Core",value:typeof a?.coreDefined=="boolean"?a.coreDefined?"Defined":"Open":void 0},{label:"Gap gates",value:o.length>0?o.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(d=>d.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(d=>d.position==="lower"),"Lower channels run from the G Center to the Sacral. They carry the managed, generative, resource work.")} ${this.renderGroup("Channels",e.filter(d=>d.position!=="upper"&&d.position!=="lower"))} ${i?s`<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>`:n} ${this.renderGates(t)} ${e.length>0||t.length>0?s`<p class="footnote">Members are lettered in the order they were sent, so A is the first member of the group.</p>`:n}</div>`}renderGroup(r,e,t){return e.length===0?n:s`<div class="section"><h3>${r}</h3>${t?s`<p class="note">${t}</p>`:n} ${e.map(a=>s`<div class="row"><span class="gates">${a.gateA}-${a.gateB}</span> <span class="cname">${a.name??""} ${a.circuit?s`<span class="circuit">${a.circuit} circuit</span>`:n} </span><span class="badge ${a.defined?"defined":"open"}">${a.defined?"Defined":"Open"}</span> ${a.isCore?s`<span class="badge core">Core</span>`:n} <span class="held">Gate ${a.gateA} held by ${Yt(a.gateAHeldBy)}. Gate ${a.gateB} held by ${Yt(a.gateBHeldBy)}.</span></div>`)}</div>`}renderGates(r){if(r.length===0)return n;let e=r.filter(t=>t.filled).length;return s`<div class="section"><h3>Gates (${e} of ${r.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>${r.map(t=>s`<div class="row"><span class="gate-id">${t.gate}</span> <span class="cname">${t.gateName??""}</span> ${t.filled?s`<span class="who">Held by ${Yt(t.heldBy)}</span>`:s`<span class="badge gap">Gap</span>`}</div>`)}</div>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No penta data</div>`}};sr.styles=[x,ue,h`.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}`],sr=g([f("roxy-hd-penta")],sr);var Wo="ABCDE";function Yt(l){let r=(l??[]).map(e=>Wo[e]??String(e+1));return r.length>0?r.join(", "):"nobody"}var or=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No Human Design data</div>`}renderData(r){return Jo(r)?this.renderType(r):this.renderProfile(r)}renderType(r){return s`<div class="wrap"><header class="head"><h2 class="title">Type</h2>${r.type||r.profile?s`<div class="type-line">${[r.type,r.profile?`Profile ${r.profile}`:""].filter(Boolean).join(" \xB7 ")}</div>`:n}</header>${le([{label:"Type",value:r.type},{label:"Strategy",value:r.strategy},{label:"Authority",value:r.authority},{label:"Profile",value:r.profile}])} ${r.typeDescription?s`<p class="lead">${r.typeDescription}</p>`:n} ${nt(r.signature,r.notSelf)} ${it([{label:"Strategy",aside:r.strategy,body:r.strategyDescription},{label:"Authority",aside:r.authority,body:r.authorityDescription},{label:"Aura",body:r.aura}],"hd-type-reading")}</div>`}renderProfile(r){return s`<div class="wrap"><header class="head"><h2 class="title">Profile</h2>${r.profile?s`<div class="type-line">${r.profile}</div>`:n}</header>${le([{label:"Profile",value:r.profile},{label:"Personality line",value:r.personalityLine?.toString()},{label:"Design line",value:r.designLine?.toString()}])}<section class="block"><h3>Lines</h3>${lt({personality:r.personalityKeynote,personalityLine:r.personalityLine,design:r.designKeynote,designLine:r.designLine})}</section></div>`}};or.styles=[x,E,P,ue,h`.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)}`],or=g([f("roxy-hd-type-card")],or);function Jo(l){return typeof l.type=="string"}var nr=class extends u{renderData(r){let e=[...r.arrows??[]].sort((t,a)=>ts(t.position)-ts(a.position));return s`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(t=>this.renderArrow(t))}</div>${r.confident===!1?s`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof r.confidenceMarginDeg=="number"?` (within ${r.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:n} ${this.renderReading(e,r.baseDescription)}</div>`}renderArrow(r){let e=r.direction==="left"?"\u2190":"\u2192";return s`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${r.name??""}</span></div>${r.layer?s`<span class="layer">${r.layer}</span>`:n} <span class="labels">${[r.directionLabel,r.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof r.color=="number"?s`<span class="ctb">Color ${r.color} · Tone ${r.tone} · Base ${r.base}${r.baseName?`, ${r.baseName}`:""}</span>`:n} ${r.activation?.planet?s`<span class="ctb">${[r.activation.planet,v(r.activation.side??"")].filter(Boolean).join(" \xB7 ")}</span>`:n} ${r.confident===!1?s`<span class="note" role="note">Knife-edge: could flip with a more precise birth time.</span>`:n}</div>`}renderReading(r,e){let t=r.filter(i=>i.description||i.colorMeaning);if(t.length===0)return n;let a=new Map;for(let i of t){let d=i.layer??"",c=a.get(d);c?c.push(i):a.set(d,[i])}let o=0;return s`<section class="block"><h3>Reading</h3>${[...a].map(([i,d])=>s`<div class="group">${i?s`<p class="group-head">${i}</p>`:n} ${d[0]?.layerDescription?s`<p class="group-note">${d[0].layerDescription}</p>`:n} ${d.map(c=>this.renderArrowReading(c,o++===0))}</div>`)} ${e?s`<p class="footnote">Base. ${e}</p>`:n}</section>`}renderArrowReading(r,e){let t=r.cognition,a=[{label:"Color",body:r.colorMeaning},{label:"Tone",body:r.toneMeaning},{label:"Direction",body:r.directionMeaning},{label:t?.label?`Cognition \xB7 ${t.label}`:"Cognition",body:t?.description}].filter(o=>!!o.body);return s`<details class="interp-card" name="hd-variable" ?open="${e}"><summary><span class="interp-lead">${r.name??""}</span> ${G()} ${r.position?s`<span class="interp-aside"><small>${r.position}</small></span>`:n}</summary><div class="interp-body">${r.description?s`<p>${r.description}</p>`:n} ${a.length>0?s`<dl class="facets">${a.map(o=>s`<dt>${o.label}</dt><dd>${o.body}</dd>`)}</dl>`:n}</div></details>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No variables data</div>`}};nr.styles=[x,E,P,h`.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}`],nr=g([f("roxy-hd-variables")],nr);function ts(l){switch(l){case"Top left":return 0;case"Top right":return 1;case"Bottom left":return 2;case"Bottom right":return 3;default:return 99}}var ke=class extends u{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 a=e;return{hex:a.hexagram,lines:a.lines,changingLinePositions:a.changingLinePositions,resultingHexagram:a.resultingHexagram}}let t=e;return{hex:t.hexagram,dailyMessage:t.dailyMessage}}return{hex:e}}renderEmpty(){return s`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:t,lines:a,changingLinePositions:o,dailyMessage:i,resultingHexagram:d}=e,c=a??this.derivedLines(t),m=new Set(o??[]);return s`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${t.symbol?s`<div class="symbol">${t.symbol}</div>`:n}<div class="lines" aria-hidden="true">${c.slice().reverse().map((p,y)=>{let b=c.length-1-y+1,$=m.has(b),R=p===6||p===8;return s`<div class="line ${`${R?"broken":"solid"}${$?" changing":""}`}">${R?L`<span class="seg"></span><span class="seg"></span>`:L`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${[t.number!=null?`${t.number}.`:"",t.english??t.chinese??"Hexagram"].filter(Boolean).join(" ")}</h2><p class="subtitle">${t.chinese?s`${t.chinese}`:n} ${t.pinyin?s`· ${t.pinyin}`:n}</p><div class="trigrams">${t.upperTrigram?s`<div>Upper <span class="tri-glyph">${Nt[t.upperTrigram]??""}</span>${t.upperTrigram}</div>`:n} ${t.lowerTrigram?s`<div>Lower <span class="tri-glyph">${Nt[t.lowerTrigram]??""}</span>${t.lowerTrigram}</div>`:n}</div>${t.judgment?s`<p class="judgment">${t.judgment}</p>`:n} ${t.image?s`<p class="image">${t.image}</p>`:n} ${i?s`<p class="message">${i}</p>`:n} ${t.interpretation?.general?s`<p>${t.interpretation.general}</p>`:n} ${m.size>0?s`<div class="changing">Changing lines: ${Array.from(m).sort((p,y)=>p-y).join(", ")}. ${d?.english?s`Becomes hexagram ${d.number} ${d.english}.`:n}</div>`:n} ${this.renderLines(t,m)}</div></article>`}renderLines(e,t){let a=e.changingLines??[];if(a.length===0)return n;let o=t.size>0,i=o?a.filter(c=>t.has(c.position)):a;if(i.length===0)return n;let d=i.map(c=>({label:`Line ${c.position}`,body:c.text??"",extra:c.meaning?s`<p class="line-meaning">${c.meaning}</p>`:n}));return M(d,"hexagram-lines",o?"Changing lines":"Lines")}derivedLines(e){let t=e.binary??"";return/^[01]{6}$/.test(t)?Array.from(t,a=>a==="1"?7:8):Array.from({length:6},()=>7)}};ke.styles=[x,E,P,h`.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)}`],g([k({type:String,reflect:!0})],ke.prototype,"mode",2),ke=g([f("roxy-hexagram")],ke);var ir=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No hora data</div>`}renderData(r){let e=r.dayHoras??[],t=r.nightHoras??[];return e.length===0&&t.length===0?this.renderEmpty():s`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${r.date?s`<p class="subtitle">${r.date}</p>`:n}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",t)}</div></div>`}renderColumn(r,e){return e.length===0?n:s`<div class="col"><p class="section-label">${r}</p>${e.map(t=>s`<div class="row"><span class="glyph" aria-hidden="true">${S[v(t.planet??"")]??"\xB7"}</span> <span class="planet">${t.planet}</span> <span class="time">${ye(t)}</span> ${typeof t.number=="number"?s`<span class="num">${t.number}</span>`:n}</div>`)}</div>`}};ir.styles=[x,h`.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}}`],ir=g([f("roxy-hora-table")],ir);var Se=class extends u{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return s`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let t=e.sign??"",a=t?H[v(t)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,i="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return s`<article class="card" aria-label="${`${this.period} horoscope for ${t}`}"><header class="head"><span class="glyph" aria-hidden="true">${a}</span><div><h2 class="title">${t} ${this.period}</h2>${i?s`<div class="date">${i}</div>`:n}</div>${o!==null?s`<span class="energy" aria-label="${`Energy ${o} of 10`}">Energy ${o}/10 <span class="energy-bar"><span style="width:${o/10*100}%"></span></span></span>`:n}</header>${e.overview?s`<p class="overview">${e.overview}</p>`:n} ${this.renderSky(e)}<div class="sections">${e.love?s`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:n} ${e.career?s`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:n} ${e.health?s`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:n} ${e.finance?s`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:n} ${"advice"in e&&e.advice?s`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:n}</div>${this.renderMonth(e)} ${(()=>{let d="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,c="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],y=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&p.length===0&&y.length===0?n:s`<div class="lucky">${d!==void 0?s`<span>Lucky number <strong>${d}</strong></span>`:n} ${c?s`<span>Lucky color <strong>${c}</strong></span>`:n} ${m.length?s`<span>Lucky numbers <strong>${m.join(", ")}</strong></span>`:n} ${p.length?s`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:n} ${y.length?s`<span class="compat-wrap">Best with <span class="compat">${y.map(b=>s`<span>${b}</span>`)}</span></span>`:n}</div>`})()}</article>`}renderSky(e){let t="moonSign"in e?e.moonSign:"",a="moonPhase"in e?e.moonPhase:"",o=("activeTransits"in e?e.activeTransits:[])??[];if(!t&&!a&&o.length===0)return n;let i=t?H[v(t)]??"":"";return s`<div class="sky">${t||a?s`<div class="moon-line">${t?s`<span><span class="lbl">Moon</span> <span aria-hidden="true">${i}</span> <b>${t}</b></span>`:n} ${a?s`<span><span class="lbl">Phase</span> <b>${a}</b></span>`:n}</div>`:n} ${o.length?s`<ul class="transits" aria-label="Active transits">${o.map(d=>s`<li>${d}</li>`)}</ul>`:n}</div>`}renderMonth(e){let t=("weekByWeek"in e?e.weekByWeek:[])??[],a=("keyDates"in e?e.keyDates:[])??[];return t.length===0&&a.length===0?n:s`${t.length?s`<section><h3 class="block-title">Week by week</h3><div class="weeks">${t.map(o=>s`<div class="week"><span class="week-no">Week ${o.week}</span><div><div class="week-focus">${o.focus}</div>${o.advice?s`<p class="week-advice">${o.advice}</p>`:n}</div></div>`)}</div></section>`:n} ${a.length?s`<section><h3 class="block-title">Key dates</h3><dl class="dates">${a.map(o=>s`<div class="date-row"><dt>${D(o.date)||o.date}</dt><dd>${o.event}</dd></div>`)}</dl></section>`:n}`}};Se.styles=[x,h`.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}`],g([k({type:String,reflect:!0})],Se.prototype,"period",2),Se=g([f("roxy-horoscope-card")],Se);var Xo=[{id:"planets",label:"Planets"},{id:"cusps",label:"Cusps"},{id:"significators",label:"Significators"}],xt=[1,2,3,4];function Ut(l,r){return l?typeof r=="number"?`${l} ${r}`:l:""}function as(l){return[...new Set(l.map(String))].join(" > ")}var Re=class extends u{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let t=(e.planets??[]).map(o=>({name:o.planet,longitude:o.longitude,house:o.house,nakshatra:o.nakshatra,pada:o.pada,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,kpNumber:o.kpNumber,retrograde:o.retrograde})),a=e.nodes;for(let[o,i]of[["Rahu",a?.rahu],["Ketu",a?.ketu]])i&&t.push({name:o,longitude:i.longitude,house:i.house,nakshatra:i.nakshatra,starLord:i.starLord,subLord:i.subLord,subSubLord:i.subSubLord,retrograde:!0});return t}renderEmpty(){return s`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let t=e.ascendant;return s`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${t?s`<div class="asc">Ascendant: <strong>${typeof t.longitude=="number"?Q(t.longitude):t.sign??""} </strong>${t.nakshatra?s`· ${Ut(t.nakshatra,t.pada)}`:n} ${t.subLord?s`· sub lord ${t.subLord}`:n} ${typeof t.kpNumber=="number"?s`· KP ${t.kpNumber}`:n}</div>`:n} ${typeof e.meta?.ayanamsa=="number"?s`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${w(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?s`· ${e.meta.houseSystem} houses`:n}</div>`:n}</header>${Z({items:Xo,active:this.activeTab,onSelect:a=>{this.activeTab=a},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?s`<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(t=>s`<tr><td class="body">${t.name}${t.retrograde?s`<span class="retro">R</span>`:n}</td><td class="num">${typeof t.longitude=="number"?Q(t.longitude):""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${Ut(t.nakshatra,t.pada)}</td><td>${t.starLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?s`<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(t=>s`<tr><td class="body num">${t.house}</td><td class="num">${typeof t.longitude=="number"?Q(t.longitude):t.sign??""}</td><td>${t.signLord??""}</td><td>${Ut(t.nakshatra,t.pada)}</td><td>${t.starLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No cusps</p>`}renderSignificators(){let e=this.data?.significators,t=e?.houseWise??[],a=e?.planetWise??[];return!t.length&&!a.length?s`<p class="roxy-empty" role="status">No significators</p>`:s`${this.renderLevelLegend(t)} ${t.length?s`<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>${xt.map(o=>s`<th scope="col">L${o}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${t.map(o=>s`<tr><td class="body num">${o.house}</td>${xt.map(i=>this.renderCell(this.planetsAtLevel(o,i).join(", ")))}<td class="chain">${as(o.all??[])}</td></tr>`)}</tbody></table>`:n} ${a.length?s`<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>${xt.map(o=>s`<th scope="col">L${o}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${a.map(o=>s`<tr><td class="body">${o.planet}</td>${xt.map(i=>this.renderCell(this.housesAtLevel(o,i).join(", ")))}<td class="chain">${as(o.allHouses??[])}</td></tr>`)}</tbody></table>`:n}`}renderCell(e){return e?s`<td>${e}</td>`:s`<td class="empty-cell">none</td>`}planetsAtLevel(e,t){return(e.significators??[]).filter(a=>a.level===t).flatMap(a=>a.planets??[])}housesAtLevel(e,t){return(e.signifies??[]).filter(a=>a.level===t).flatMap(a=>a.houses??[])}renderLevelLegend(e){let t=new Map;for(let a of e)for(let o of a.significators??[])o.description&&!t.has(o.level)&&t.set(o.level,o.description);return t.size===0?n:s`<ul class="legend" aria-label="Significator levels">${[...t.entries()].sort((a,o)=>a[0]-o[0]).map(([a,o])=>s`<li><b>L${a}</b>${o}</li>`)}</ul>`}};Re.styles=[x,Y,h`.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)}`],g([N()],Re.prototype,"activeTab",2),Re=g([f("roxy-kp-chart")],Re);var lr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No KP data</div>`}renderData(r){let e=r.planets??[];return s`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof r.ayanamsa=="number"?s`<span class="ayanamsa">Ayanamsa: ${w(r.ayanamsa,2)}°</span>`:n}</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(t=>s`<tr><td class="planet">${t.planet} ${t.retrograde?s`<span class="retro">R</span>`:n}</td><td>${t.sign??""}</td><td>${t.signLord??""}</td><td>${t.nakshatra??""}</td><td>${t.nakshatraLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td>${t.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};lr.styles=[x,h`.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}`],lr=g([f("roxy-kp-planets-table")],lr);var dr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(r){let e=r.significators??[];return s`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${r.dayLord?s`<div class="day-lord">Day lord: <strong>${r.dayLord}</strong></div>`:n}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${r.moonSignLord??""}</dd><dt>Star lord</dt><dd>${r.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${r.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${r.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${r.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${r.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${r.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${r.lagnaSubSublord??""}</dd></dl></div></div>${r.rulingPlanets?.length?s`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${r.rulingPlanets.map((t,a)=>s`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:n} ${e.length?s`<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(t=>s`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:n}</div>`}};dr.styles=[x,h`.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}`],dr=g([f("roxy-kp-ruling-planets")],dr);var Ft=320,ee=Ft/2,ce=128,Qo=118,en=140,rn=150;function pe(l,r){let e=l*Math.PI/180;return{x:ee+r*Math.sin(e),y:ee-r*Math.cos(e)}}var tn=[{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"}],cr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No local space data</div>`}renderData(r){let e=r.bodies??[],t=r.birthDetails;return s`<div class="wrap"><header><h2 class="title">Local space</h2>${t?s`<div class="meta">${[t.date,t.time].filter(Boolean).join(" \xB7 ")}</div>`:n}</header>${this.renderDial(e)} ${r.summary?s`<p class="summary">${r.summary}</p>`:n} ${this.renderList(e)}</div>`}renderDial(r){return s`<svg viewBox="0 0 ${Ft} ${Ft}" 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="${ee}" cy="${ee}" r="${ce}"/><circle class="dial" cx="${ee}" cy="${ee}" r="${ce*.66}" stroke-width="0.5"/><circle class="dial" cx="${ee}" cy="${ee}" r="${ce*.33}" stroke-width="0.5"/>${this.renderCompassRing()} ${this.renderSpokes(r)}<circle class="center-dot" cx="${ee}" cy="${ee}" r="2.5"/></svg>`}renderCompassRing(){let r=[];for(let d=0;d<360;d+=22.5){let c=pe(d,ce),m=pe(d,ce-(d%45===0?8:4));r.push(L`<line class="tick" x1=${m.x} y1=${m.y} x2=${c.x} y2=${c.y} />`)}let e=pe(0,ce),t=pe(180,ce),a=pe(90,ce),o=pe(270,ce),i=tn.map(({az:d,label:c})=>{let m=pe(d,rn),p=d%90===0;return L`<text class=${`compass-label${p?" cardinal":""}`} x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${c}</text>`});return L`
|
|
84
|
+
`}function gt(l,r){switch(r){case"north":return Oo(l);case"east":return Bo(l);default:return Mo(l)}}function yt(l,r){return Z({items:ko,active:l,onSelect:r,label:"Kundli style",idPrefix:"kundli"})}var ht=h`.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 $e=class extends u{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,t=`D${e.number} ${e.name}`;return mt(this.data.chart.meta,t)}renderEmpty(){return s`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let t=this.viewModel();if(!t)return this.renderEmpty();let{division:a,vargottama:o}=e;return s`<div class="wrap"><div class="header"><div><h2 class="title">D${a.number} ${a.name} ${a.sanskritName&&a.sanskritName!==a.name?s`<span class="division-meta">· ${a.sanskritName}</span>`:n}</h2>${a.significance?s`<p class="significance">${a.significance}</p>`:n}</div>${yt(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${a.number} ${a.name} divisional chart with twelve sign houses"><title>D${a.number} ${a.name}</title>${gt(t,this.chartStyle)}</svg> ${o&&o.length>0?s`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${o.map(i=>s`<span class="vargottama-pill" role="listitem">${S[i]??""} ${i}</span>`)}</div>`:n}</div>`}};$e.styles=[x,ht,Y,h`.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}`],g([k({type:String,reflect:!0,attribute:"chart-style"})],$e.prototype,"chartStyle",2),$e=g([f("roxy-divisional-chart")],$e);var Ko={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},we=class extends u{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return s`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let t=!!e.present,a=Ko[this.type]??this.type,o=(e.severity??"").toLowerCase(),i=o==="severe"?3:o==="moderate"?2:o==="mild"?1:0,d=i*33,c=i===3?"var(--roxy-danger)":i>=1?"var(--roxy-warning)":"transparent";return s`<article class="card" aria-label="${a}"><header class="head"><h2 class="title">${a}</h2><span class="${`badge ${t?"present":"absent"}`}">${t?"Present":"Absent"}</span></header>${"type"in e&&e.type?s`<p class="subtype"><span class="subtype-label">${this.type==="sadhesati"?"Current phase":"Type"}</span>${e.type}</p>`:n} ${e.severity?s`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${i}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${d}%;background:${c}"></span></div>`:n} ${e.description?s`<p class="description">${e.description}</p>`:n} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?s`<div><h3>Remedies</h3><ul>${e.remedies.map(m=>s`<li>${m}</li>`)}</ul></div>`:n} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?s`<div><h3>Exceptions</h3><ul>${e.exceptions.map(m=>s`<li>${m}</li>`)}</ul></div>`:n}</article>`}renderEffects(e){if(!e.effects)return n;let t=[];for(let[a,o]of Object.entries(e.effects))if(typeof o=="string"&&o.length>0)t.push(s`<div><h3>${a}</h3><p>${o}</p></div>`);else if(o&&typeof o=="object")for(let[i,d]of Object.entries(o))typeof d=="string"&&d.length>0&&t.push(s`<div><h3>${i}</h3><p>${d}</p></div>`);return t.length===0?n:s`<div class="effects">${t}</div>`}};we.styles=[x,h`.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}`],g([k({type:String,reflect:!0})],we.prototype,"type",2),we=g([f("roxy-dosha-card")],we);var Je=class extends u{renderData(r){return s`<article class="card" aria-label="${r.name??"Dream symbol"}"><header class="head">${r.letter?s`<span class="letter" aria-hidden="true">${r.letter}</span>`:n}<div><p class="label">Dream symbol</p>${r.name?s`<h2 class="name">${r.name}</h2>`:n}</div></header>${r.meaning?s`<p class="meaning">${r.meaning}</p>`:n}</article>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No dream symbol</div>`}};Je.styles=[x,h`.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}`],Je=g([f("roxy-dream-card")],Je);var Xe=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(r){let e=r.symbols??[];if(e.length===0)return this.renderEmpty();let t=typeof r.total=="number"?r.total:e.length;return s`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${t} match${t===1?"":"es"}</span></header><ul class="grid">${e.map(a=>s`<li><button type="button" class="result" @click="${()=>this.select(a)}">${a.letter?s`<span class="letter" aria-hidden="true">${a.letter}</span>`:n} <span class="name">${a.name}</span></button></li>`)}</ul></section>`}select(r){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:r.id,name:r.name,letter:r.letter},bubbles:!0,composed:!0}))}};Xe.styles=[x,h`.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}`],Xe=g([f("roxy-dream-search")],Xe);var qt=new Map;async function qo(l){let r=qt.get(l);return r||(r=fetch(l).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw qt.delete(l),e}),qt.set(l,r)),r}var F=class extends J{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 t=this.fields.filter(o=>o.required).filter(o=>this.values[o.key]===void 0||this.values[o.key]==="");if(t.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:t.map(o=>o.key)},bubbles:!0,composed:!0}));return}let a={};for(let o of this.fields){let i=this.values[o.key];if(!(i===void 0||i===""))if(o.group){let d=a[o.group]??{};d[o.name]=i,a[o.group]=d}else a[o.name]=i}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:a,queryKeys:this.fields.filter(o=>o.inQuery).map(o=>o.name)},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await qo(this.specUrl),t=`/${this.endpoint.replace(/^\//,"")}`,a=e.paths?.[t]?.[this.method.toLowerCase()];if(!a)throw new Error(`Endpoint ${this.method} ${t} not found in OpenAPI spec`);let o=e.components?.schemas??{},i=[],d;if(a.requestBody){let m=a.requestBody.content?.["application/json"]?.schema;d=this.resolve(m,o)}if(d?.properties){let m=new Set(d.required??[]);for(let[p,y]of Object.entries(d.properties)){let b=this.resolve(y,o)??{};if(b.type==="object"&&b.properties){let $=new Set(b.required??[]);for(let[R,C]of Object.entries(b.properties)){let I=this.resolve(C,o)??{};i.push({key:`${p}.${R}`,name:R,group:p,type:this.fieldType(I),required:m.has(p)&&$.has(R),description:I.description,enum:I.enum,min:I.minimum,max:I.maximum,default:I.default})}}else i.push({key:p,name:p,type:this.fieldType(b),required:m.has(p),description:b.description,enum:b.enum,min:b.minimum,max:b.maximum,default:b.default})}}for(let m of a.parameters??[])if(m.in==="path"||m.in==="query"){let p=this.resolve(m.schema,o)??{};i.push({key:m.name,name:m.name,inQuery:m.in==="query",type:this.fieldType(p),required:!!m.required,description:p.description,enum:p.enum,default:p.default})}this.fields=i;let c={};for(let m of i){m.default!==void 0&&(c[m.key]=m.default);let p=m.group?this.initialValues?.[m.group]?.[m.name]:this.initialValues?.[m.name];p!==void 0&&(c[m.key]=p)}this.values=c,this.loaded=!0}catch(e){let t=e instanceof Error?e.message:String(e);this.specError=t,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:t},bubbles:!0,composed:!0}))}}resolve(e,t){if(e){if("$ref"in e&&e.$ref){let a=e.$ref.split("/").pop();return a?t[a]: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,t){this.values={...this.values,[e]:t}}groupHasLocation(e){let t=this.fields.filter(a=>a.group===e);return["latitude","longitude","timezone"].every(a=>t.some(o=>o.name===a))}onLocationFor(e){let t=e?`${e}.`:"";return a=>{let o=a.detail;o&&(this.values={...this.values,[`${t}latitude`]:o.latitude,[`${t}longitude`]:o.longitude,[`${t}timezone`]:o.timezone??o.utcOffset})}}render(){if(!this.loaded)return s`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return s`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=i=>{if(this.groupHasLocation(i.group)&&(i.name==="latitude"||i.name==="longitude"||i.name==="timezone"))return n;let d=`roxy-form-${i.key}`;return s`<div class="field"><label for="${d}">${T(i.name)}${i.required?s`<span class="req" aria-hidden="true">*</span>`:n}</label> ${i.enum?s`<select id="${d}" ?required="${i.required}" @change="${c=>this.setValue(i.key,c.target.value)}"><option value="">Choose</option>${i.enum.map(c=>s`<option value="${c}" ?selected="${this.values[i.key]===c}">${c}</option>`)}</select>`:s`<input id="${d}" type="${this.htmlType(i.type)}" ?required="${i.required}" min="${i.min??""}" max="${i.max??""}" step="${i.type==="number"?"any":""}" .value="${this.values[i.key]??""}" @input="${c=>this.setValue(i.key,this.coerce(i.type,c.target.value))}">`} ${i.description?s`<small class="help">${i.description}</small>`:n}</div>`},t=[];for(let i of this.fields)t.includes(i.group)||t.push(i.group);let a=i=>this.groupHasLocation(i)?s`<div class="location-block"><label>${i?`${T(i)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(i)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:n,o=i=>s`${a(i)}<div class="fields">${this.fields.filter(d=>d.group===i).map(d=>e(d))}</div>`;return s`<form @submit="${this.onSubmit}"><h2 class="title">${T(this.endpoint.split("/").pop()??"")}</h2>${t.map(i=>i===void 0?o(void 0):s`<fieldset class="person-group"><legend>${T(i)}</legend>${o(i)}</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,t){if(t!==""){if(e==="number"){let a=Number(t);return Number.isFinite(a)?a:void 0}return t}}};F.styles=[x,h`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}`],g([k({type:String,attribute:"data-endpoint"})],F.prototype,"endpoint",2),g([k({type:String})],F.prototype,"method",2),g([k({type:String,attribute:"spec-url"})],F.prototype,"specUrl",2),g([k({type:String,attribute:"submit-label"})],F.prototype,"submitLabel",2),g([k({attribute:!1})],F.prototype,"initialValues",2),g([N()],F.prototype,"fields",2),g([N()],F.prototype,"values",2),g([N()],F.prototype,"loaded",2),g([N()],F.prototype,"specError",2),F=g([f("roxy-endpoint-form")],F);var Qe=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No fixed star data</div>`}renderData(r){let e=r.conjunctions??[],t=r.stars??[];return s`<div class="wrap"><header><h2 class="title">Fixed stars</h2>${typeof r.orb=="number"?s`<span class="badge"><b>Orb</b> ${w(r.orb,1)}°</span>`:n}</header>${r.summary?s`<p class="summary">${r.summary}</p>`:n} ${e.length?s`<section><p class="subhead">Conjunctions to the chart</p>${e.map((a,o)=>s`<details class="interp-card" name="fixed-star-contacts" ?open="${o===0}"><summary><span class="interp-lead"><span class="point">${a.point}</span> conjunct ${a.star}</span> ${G()} <span class="interp-aside"><small>orb ${w(a.orb,2)}°</small></span></summary>${a.interpretation?s`<div class="interp-body"><p>${a.interpretation}</p></div>`:n}</details>`)}</section>`:s`<p class="empty-note">No star sits within the orb of a natal point.</p>`} ${t.length?this.renderCatalog(t):n}</div>`}renderCatalog(r){return s`<details class="catalog"><summary>${G()} Star catalog (${r.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>${r.map(e=>{let t=H[v(e.sign)];return s`<tr><td>${e.name}</td><td>${t?s`<span class="sg">${t}</span>`:n}${Hr(e.degree)} ${e.sign}</td><td class="num">${w(e.magnitude,1)}</td><td>${e.nature}</td><td><div class="kw">${(e.keywords??[]).map(a=>s`<span>${a}</span>`)}</div></td></tr>`})}</tbody></table></div></details>`}};Qe.styles=[x,E,P,h`.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}`],Qe=g([f("roxy-fixed-stars")],Qe);var er=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No digest data</div>`}renderData(r){let e=r.windows??[];if(e.length===0)return this.renderEmpty();let t=[D(r.startDate),D(r.endDate)].filter(Boolean).join(" \u2013 ");return s`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${t?s`<p class="subtitle">${t}</p>`:n}</div>${e.map(a=>this.renderWindow(a))}</div>`}windowLabel(r){return r===1?"Next 24 hours":typeof r=="number"?`Next ${r} days`:"Window"}renderWindow(r){let e=r.top??[],t=r.byDomain??{},a=Object.entries(t);return s`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(r.days)}</span> <span class="window-count">${r.count??0} event${r.count===1?"":"s"}</span></div>${a.length>0?s`<div class="domains">${a.map(([o,i])=>s`<span class="domain-chip"><span class="swatch sw-${o}"></span>${T(o)} ${i}</span>`)}</div>`:n} ${e.length>0?s`<div role="list">${e.map(o=>this.renderEvent(o))}</div>`:s`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(r){let e=typeof r.significance=="number"?r.significance:0;return s`<div class="event" role="listitem"><span class="event-date">${D(r.date)}</span> <span class="event-desc">${r.description??T(r.type??"")}</span> <span class="sig" role="img" aria-label="significance ${w(e,0)} of 100"><span class="sig-fill ${r.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};er.styles=[x,h`.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}`],er=g([f("roxy-forecast-digest")],er);var Yo={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Uo=["western","vedic","biorhythm"],rr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(r){let e=r.events??[],t=this.groupByDate(e),a=Uo.filter(o=>e.some(i=>i.domain===o));return s`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${r.startDate&&r.endDate?s`<div class="range">${D(r.startDate)} - ${D(r.endDate)} · ${r.count??e.length} events</div>`:n}</header>${a.length?s`<div class="legend">${a.map(o=>s`<span><span class="swatch swatch-${o}"></span>${Yo[o]}</span>`)}</div>`:n} ${t.length?s`<div class="days" role="list">${t.map(([o,i])=>this.renderDay(o,i))}</div>`:s`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(r){let e=new Map;for(let t of r){let a=t.date??"",o=e.get(a)??[];o.push(t),e.set(a,o)}return[...e.entries()]}renderDay(r,e){return s`<div class="day" role="listitem"><div class="day-date">${D(r)}</div><div class="events">${e.map(t=>this.renderEvent(t))}</div></div>`}renderEvent(r){let e=typeof r.significance=="number"?r.significance:0,t=Math.max(0,Math.min(100,e));return s`<div class="event"><span class="dot dot-${r.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(r)}</div>${r.description?s`<p class="event-desc">${r.description}</p>`:n}<div class="sig" title="Significance ${t} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${r.domain}" style="width:${t}%"></span> </span><span class="sig-val">${t}</span></div></div></div>`}renderHeadline(r){let e=r.body?v(r.body):"",t=r.target?v(r.target):"",a=r.aspect?r.aspect.toLowerCase():"",o=Be[a]??"",i=a?Nr[a]??a:"",d=typeof r.orb=="number"?w(r.orb,1):"",c=this.typeQualifier(r);return a&&t?s`<strong>${e}</strong> <span class="${o}">${i}</span> <strong>${t}</strong>${d?s`<span class="kind">orb ${d}°</span>`:n}`:s`<strong>${e||T(r.type??"")}</strong>${c?s`<span class="kind">${c}</span>`:n}`}typeQualifier(r){return r.type==="sign-ingress"&&r.target?`enters ${v(r.target)}`:r.type==="retrograde-station"&&r.station?r.station:r.type==="eclipse"?[r.kind,"eclipse"].filter(Boolean).join(" "):r.type==="critical-day"?"critical day":r.type==="dasha-change"&&r.target?`dasha ${v(r.target)}`:T(r.type??"")}};rr.styles=[x,h`.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}`],rr=g([f("roxy-forecast-timeline")],rr);var Fo={varna:1,vashya:2,tara:3,yoni:4,"graha maitri":5,gana:6,bhakoot:7,nadi:8},tr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(r){let e=(r.breakdown??[]).filter(p=>p?.category!==void 0),t=r.total??0,a=r.maxScore??36,o=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",d=o>=70?"var(--roxy-success)":o>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=o*2.827,m=(100-o)*2.827;return s`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${w(r.total,1)}</span> <span class="over">/ ${r.maxScore}</span> ${typeof r.percentage=="number"?s`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Ea(r.percentage,1)}</small>`:n}</div><div class="verdict-wrap">${typeof r.isCompatible=="boolean"?s`<span class="verdict ${r.isCompatible?"yes":"no"}">${r.isCompatible?"Compatible":"Not compatible"}</span>`:n} ${r.recommendation?s`<span class="recommendation">${r.recommendation}</span>`:n}</div></div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${d}" stroke-width="8" stroke-dasharray="${c},${m}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${e.length>0?s`<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(p=>{let y=p.score??0,b=p.maxScore??Vo(p.category),$=b?y/b*100:0;return s`<tr><td>${p.category} ${p.description?s`<small>${p.description}</small>`:n}</td><td class="classification">${p.person1??""}</td><td class="classification">${p.person2??""}</td><td class="bar-cell bar-col"><div class="mini-bar"><span style="width:${$}%"></span></div></td><td class="score">${w(y,1)} / ${b}</td></tr>`})}</tbody></table>`:n} ${(r.doshas?.length??0)>0||(r.doshaCancellations?.length??0)>0?s`<div class="tags">${r.doshas?.map(p=>s`<span class="dosha">${p}</span>`)} ${r.doshaCancellations?.map(p=>s`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:n}</article>`}};tr.styles=[x,h`.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)}`],tr=g([f("roxy-guna-milan")],tr);function Vo(l){return l&&Fo[l.toLowerCase()]||1}var ar=class extends u{renderData(r){let e=r.channels??[],t=r.centers??[],a=t.filter(o=>o.defined).length;return s`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof r.totalChannels=="number"?s`<span class="count">${r.totalChannels} channels</span>`:n}</header>${le([{label:"Channels",value:r.totalChannels?.toString()},{label:"Combined definition",value:r.combinedDefinition?T(String(r.combinedDefinition)):void 0},{label:"Centers defined",value:t.length>0?`${a} of ${t.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(r.summary)} ${this.renderCenters(t)} ${this.renderChannels(e,t)}</div>`}renderDynamics(r){if(!r)return n;let e=[{label:"Electromagnetic",aside:ut(r.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:ut(r.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:ut(r.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:ut(r.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 M(e,"hd-connection-dynamic","Dynamics")}renderCenters(r){return r.length===0?n:s`<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>${r.map(e=>{let t=e.definedBy??[],a=t.includes("A"),o=t.includes("B"),i=!!e.defined&&!a&&!o;return s`<div class="row"><span class="cname">${e.name??T(String(e.id??""))}</span> <span class="badge ${e.defined?i?"together":"defined":"open"}">${e.defined?i?"Only together":"Defined":"Open"} </span><span class="who">${Zo(!!e.defined,a,o)}</span></div>`})}</section>`}renderChannels(r,e){if(r.length===0)return n;let t=new Map(e.map(o=>[String(o.id??""),o.name??""])),a=o=>t.get(o)||T(o);return s`<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>${r.map(o=>s`<tr><td>${o.name??""}</td><td class="gates">${o.gateA}-${o.gateB}</td><td>${(o.centers??[]).map(a).join(" to ")}</td><td>${o.circuit??""}</td><td>${o.dynamic?s`<span class="dyn">${o.dynamic}</span>`:n}</td><td class="held">${rs(o.personAGates)}</td><td class="held">${rs(o.personBGates)}</td></tr>`)}</tbody></table></div></section>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No connection data</div>`}};ar.styles=[x,E,P,ue,h`.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}`],ar=g([f("roxy-hd-connection")],ar);function ut(l){if(typeof l=="number")return l===0?"None":l===1?"1 channel":`${l} channels`}function rs(l){let r=l??[];return r.length>0?r.join(", "):"Neither"}function Zo(l,r,e){return r&&e?"Defined in both charts":r?"Defined by A":e?"Defined by B":l?"Defined by neither alone, only by the connection":"Open in both charts"}var sr=class extends u{renderData(r){let e=r.channels??[],t=r.gates??[],a=r.summary,o=a?.gapGates??[],i=e.some(d=>d.isCore);return s`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof r.memberCount=="number"?s`<span class="count">${r.memberCount} members</span>`:n}</header>${le([{label:"Members",value:r.memberCount?.toString()},{label:"Defined channels",value:typeof a?.definedChannels=="number"&&e.length>0?`${a.definedChannels} of ${e.length}`:void 0},{label:"Filled gates",value:typeof a?.filledGates=="number"&&t.length>0?`${a.filledGates} of ${t.length}`:void 0},{label:"Core",value:typeof a?.coreDefined=="boolean"?a.coreDefined?"Defined":"Open":void 0},{label:"Gap gates",value:o.length>0?o.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(d=>d.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(d=>d.position==="lower"),"Lower channels run from the G Center to the Sacral. They carry the managed, generative, resource work.")} ${this.renderGroup("Channels",e.filter(d=>d.position!=="upper"&&d.position!=="lower"))} ${i?s`<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>`:n} ${this.renderGates(t)} ${e.length>0||t.length>0?s`<p class="footnote">Members are lettered in the order they were sent, so A is the first member of the group.</p>`:n}</div>`}renderGroup(r,e,t){return e.length===0?n:s`<div class="section"><h3>${r}</h3>${t?s`<p class="note">${t}</p>`:n} ${e.map(a=>s`<div class="row"><span class="gates">${a.gateA}-${a.gateB}</span> <span class="cname">${a.name??""} ${a.circuit?s`<span class="circuit">${a.circuit} circuit</span>`:n} </span><span class="badge ${a.defined?"defined":"open"}">${a.defined?"Defined":"Open"}</span> ${a.isCore?s`<span class="badge core">Core</span>`:n} <span class="held">Gate ${a.gateA} held by ${Yt(a.gateAHeldBy)}. Gate ${a.gateB} held by ${Yt(a.gateBHeldBy)}.</span></div>`)}</div>`}renderGates(r){if(r.length===0)return n;let e=r.filter(t=>t.filled).length;return s`<div class="section"><h3>Gates (${e} of ${r.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>${r.map(t=>s`<div class="row"><span class="gate-id">${t.gate}</span> <span class="cname">${t.gateName??""}</span> ${t.filled?s`<span class="who">Held by ${Yt(t.heldBy)}</span>`:s`<span class="badge gap">Gap</span>`}</div>`)}</div>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No penta data</div>`}};sr.styles=[x,ue,h`.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}`],sr=g([f("roxy-hd-penta")],sr);var Wo="ABCDE";function Yt(l){let r=(l??[]).map(e=>Wo[e]??String(e+1));return r.length>0?r.join(", "):"nobody"}var or=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No Human Design data</div>`}renderData(r){return Jo(r)?this.renderType(r):this.renderProfile(r)}renderType(r){return s`<div class="wrap"><header class="head"><h2 class="title">Type</h2>${r.type||r.profile?s`<div class="type-line">${[r.type,r.profile?`Profile ${r.profile}`:""].filter(Boolean).join(" \xB7 ")}</div>`:n}</header>${le([{label:"Type",value:r.type},{label:"Strategy",value:r.strategy},{label:"Authority",value:r.authority},{label:"Profile",value:r.profile}])} ${r.typeDescription?s`<p class="lead">${r.typeDescription}</p>`:n} ${nt(r.signature,r.notSelf)} ${it([{label:"Strategy",aside:r.strategy,body:r.strategyDescription},{label:"Authority",aside:r.authority,body:r.authorityDescription},{label:"Aura",body:r.aura}],"hd-type-reading")}</div>`}renderProfile(r){return s`<div class="wrap"><header class="head"><h2 class="title">Profile</h2>${r.profile?s`<div class="type-line">${r.profile}</div>`:n}</header>${le([{label:"Profile",value:r.profile},{label:"Personality line",value:r.personalityLine?.toString()},{label:"Design line",value:r.designLine?.toString()}])}<section class="block"><h3>Lines</h3>${lt({personality:r.personalityKeynote,personalityLine:r.personalityLine,design:r.designKeynote,designLine:r.designLine})}</section></div>`}};or.styles=[x,E,P,ue,h`.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)}`],or=g([f("roxy-hd-type-card")],or);function Jo(l){return typeof l.type=="string"}var nr=class extends u{renderData(r){let e=[...r.arrows??[]].sort((t,a)=>ts(t.position)-ts(a.position));return s`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(t=>this.renderArrow(t))}</div>${r.confident===!1?s`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof r.confidenceMarginDeg=="number"?` (within ${r.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:n} ${this.renderReading(e,r.baseDescription)}</div>`}renderArrow(r){let e=r.direction==="left"?"\u2190":"\u2192";return s`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${r.name??""}</span></div>${r.layer?s`<span class="layer">${r.layer}</span>`:n} <span class="labels">${[r.directionLabel,r.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof r.color=="number"?s`<span class="ctb">Color ${r.color} · Tone ${r.tone} · Base ${r.base}${r.baseName?`, ${r.baseName}`:""}</span>`:n} ${r.activation?.planet?s`<span class="ctb">${[r.activation.planet,v(r.activation.side??"")].filter(Boolean).join(" \xB7 ")}</span>`:n} ${r.confident===!1?s`<span class="note" role="note">Knife-edge: could flip with a more precise birth time.</span>`:n}</div>`}renderReading(r,e){let t=r.filter(i=>i.description||i.colorMeaning);if(t.length===0)return n;let a=new Map;for(let i of t){let d=i.layer??"",c=a.get(d);c?c.push(i):a.set(d,[i])}let o=0;return s`<section class="block"><h3>Reading</h3>${[...a].map(([i,d])=>s`<div class="group">${i?s`<p class="group-head">${i}</p>`:n} ${d[0]?.layerDescription?s`<p class="group-note">${d[0].layerDescription}</p>`:n} ${d.map(c=>this.renderArrowReading(c,o++===0))}</div>`)} ${e?s`<p class="footnote">Base. ${e}</p>`:n}</section>`}renderArrowReading(r,e){let t=r.cognition,a=[{label:"Color",body:r.colorMeaning},{label:"Tone",body:r.toneMeaning},{label:"Direction",body:r.directionMeaning},{label:t?.label?`Cognition \xB7 ${t.label}`:"Cognition",body:t?.description}].filter(o=>!!o.body);return s`<details class="interp-card" name="hd-variable" ?open="${e}"><summary><span class="interp-lead">${r.name??""}</span> ${G()} ${r.position?s`<span class="interp-aside"><small>${r.position}</small></span>`:n}</summary><div class="interp-body">${r.description?s`<p>${r.description}</p>`:n} ${a.length>0?s`<dl class="facets">${a.map(o=>s`<dt>${o.label}</dt><dd>${o.body}</dd>`)}</dl>`:n}</div></details>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No variables data</div>`}};nr.styles=[x,E,P,h`.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}`],nr=g([f("roxy-hd-variables")],nr);function ts(l){switch(l){case"Top left":return 0;case"Top right":return 1;case"Bottom left":return 2;case"Bottom right":return 3;default:return 99}}var ke=class extends u{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 a=e;return{hex:a.hexagram,lines:a.lines,changingLinePositions:a.changingLinePositions,resultingHexagram:a.resultingHexagram}}let t=e;return{hex:t.hexagram,dailyMessage:t.dailyMessage}}return{hex:e}}renderEmpty(){return s`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:t,lines:a,changingLinePositions:o,dailyMessage:i,resultingHexagram:d}=e,c=a??this.derivedLines(t),m=new Set(o??[]);return s`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${t.symbol?s`<div class="symbol">${t.symbol}</div>`:n}<div class="lines" aria-hidden="true">${c.slice().reverse().map((p,y)=>{let b=c.length-1-y+1,$=m.has(b),R=p===6||p===8;return s`<div class="line ${`${R?"broken":"solid"}${$?" changing":""}`}">${R?L`<span class="seg"></span><span class="seg"></span>`:L`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${[t.number!=null?`${t.number}.`:"",t.english??t.chinese??"Hexagram"].filter(Boolean).join(" ")}</h2><p class="subtitle">${t.chinese?s`${t.chinese}`:n} ${t.pinyin?s`· ${t.pinyin}`:n}</p><div class="trigrams">${t.upperTrigram?s`<div>Upper <span class="tri-glyph">${Nt[t.upperTrigram]??""}</span>${t.upperTrigram}</div>`:n} ${t.lowerTrigram?s`<div>Lower <span class="tri-glyph">${Nt[t.lowerTrigram]??""}</span>${t.lowerTrigram}</div>`:n}</div>${t.judgment?s`<p class="judgment">${t.judgment}</p>`:n} ${t.image?s`<p class="image">${t.image}</p>`:n} ${i?s`<p class="message">${i}</p>`:n} ${t.interpretation?.general?s`<p>${t.interpretation.general}</p>`:n} ${m.size>0?s`<div class="changing">Changing lines: ${Array.from(m).sort((p,y)=>p-y).join(", ")}. ${d?.english?s`Becomes hexagram ${d.number} ${d.english}.`:n}</div>`:n} ${this.renderLines(t,m)}</div></article>`}renderLines(e,t){let a=e.changingLines??[];if(a.length===0)return n;let o=t.size>0,i=o?a.filter(c=>t.has(c.position)):a;if(i.length===0)return n;let d=i.map(c=>({label:`Line ${c.position}`,body:c.text??"",extra:c.meaning?s`<p class="line-meaning">${c.meaning}</p>`:n}));return M(d,"hexagram-lines",o?"Changing lines":"Lines")}derivedLines(e){let t=e.binary??"";return/^[01]{6}$/.test(t)?Array.from(t,a=>a==="1"?7:8):Array.from({length:6},()=>7)}};ke.styles=[x,E,P,h`.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)}`],g([k({type:String,reflect:!0})],ke.prototype,"mode",2),ke=g([f("roxy-hexagram")],ke);var ir=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No hora data</div>`}renderData(r){let e=r.dayHoras??[],t=r.nightHoras??[];return e.length===0&&t.length===0?this.renderEmpty():s`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${r.date?s`<p class="subtitle">${r.date}</p>`:n}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",t)}</div></div>`}renderColumn(r,e){return e.length===0?n:s`<div class="col"><p class="section-label">${r}</p>${e.map(t=>s`<div class="row"><span class="glyph" aria-hidden="true">${S[v(t.planet??"")]??"\xB7"}</span> <span class="planet">${t.planet}</span> <span class="time">${ye(t)}</span> ${typeof t.number=="number"?s`<span class="num">${t.number}</span>`:n}</div>`)}</div>`}};ir.styles=[x,h`.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}}`],ir=g([f("roxy-hora-table")],ir);var Se=class extends u{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return s`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let t=e.sign??"",a=t?H[v(t)]??"":"",o="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,i="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return s`<article class="card" aria-label="${`${this.period} horoscope for ${t}`}"><header class="head"><span class="glyph" aria-hidden="true">${a}</span><div><h2 class="title">${t} ${this.period}</h2>${i?s`<div class="date">${i}</div>`:n}</div>${o!==null?s`<span class="energy" aria-label="${`Energy ${o} of 10`}">Energy ${o}/10 <span class="energy-bar"><span style="width:${o/10*100}%"></span></span></span>`:n}</header>${e.overview?s`<p class="overview">${e.overview}</p>`:n} ${this.renderSky(e)}<div class="sections">${e.love?s`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:n} ${e.career?s`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:n} ${e.health?s`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:n} ${e.finance?s`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:n} ${"advice"in e&&e.advice?s`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:n}</div>${this.renderMonth(e)} ${(()=>{let d="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,c="luckyColor"in e&&e.luckyColor?e.luckyColor:"",m="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],y=e.compatibleSigns??[];return d===void 0&&!c&&m.length===0&&p.length===0&&y.length===0?n:s`<div class="lucky">${d!==void 0?s`<span>Lucky number <strong>${d}</strong></span>`:n} ${c?s`<span>Lucky color <strong>${c}</strong></span>`:n} ${m.length?s`<span>Lucky numbers <strong>${m.join(", ")}</strong></span>`:n} ${p.length?s`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:n} ${y.length?s`<span class="compat-wrap">Best with <span class="compat">${y.map(b=>s`<span>${b}</span>`)}</span></span>`:n}</div>`})()}</article>`}renderSky(e){let t="moonSign"in e?e.moonSign:"",a="moonPhase"in e?e.moonPhase:"",o=("activeTransits"in e?e.activeTransits:[])??[];if(!t&&!a&&o.length===0)return n;let i=t?H[v(t)]??"":"";return s`<div class="sky">${t||a?s`<div class="moon-line">${t?s`<span><span class="lbl">Moon</span> <span aria-hidden="true">${i}</span> <b>${t}</b></span>`:n} ${a?s`<span><span class="lbl">Phase</span> <b>${a}</b></span>`:n}</div>`:n} ${o.length?s`<ul class="transits" aria-label="Active transits">${o.map(d=>s`<li>${d}</li>`)}</ul>`:n}</div>`}renderMonth(e){let t=("weekByWeek"in e?e.weekByWeek:[])??[],a=("keyDates"in e?e.keyDates:[])??[];return t.length===0&&a.length===0?n:s`${t.length?s`<section><h3 class="block-title">Week by week</h3><div class="weeks">${t.map(o=>s`<div class="week"><span class="week-no">Week ${o.week}</span><div><div class="week-focus">${o.focus}</div>${o.advice?s`<p class="week-advice">${o.advice}</p>`:n}</div></div>`)}</div></section>`:n} ${a.length?s`<section><h3 class="block-title">Key dates</h3><dl class="dates">${a.map(o=>s`<div class="date-row"><dt>${D(o.date)||o.date}</dt><dd>${o.event}</dd></div>`)}</dl></section>`:n}`}};Se.styles=[x,h`.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}`],g([k({type:String,reflect:!0})],Se.prototype,"period",2),Se=g([f("roxy-horoscope-card")],Se);var Xo=[{id:"planets",label:"Planets"},{id:"cusps",label:"Cusps"},{id:"significators",label:"Significators"}],xt=[1,2,3,4];function Ut(l,r){return l?typeof r=="number"?`${l} ${r}`:l:""}function as(l){return[...new Set(l.map(String))].join(" > ")}var Re=class extends u{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let t=(e.planets??[]).map(o=>({name:o.planet,longitude:o.longitude,house:o.house,nakshatra:o.nakshatra,pada:o.pada,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,kpNumber:o.kpNumber,retrograde:o.retrograde})),a=e.nodes;for(let[o,i]of[["Rahu",a?.rahu],["Ketu",a?.ketu]])i&&t.push({name:o,longitude:i.longitude,house:i.house,nakshatra:i.nakshatra,starLord:i.starLord,subLord:i.subLord,subSubLord:i.subSubLord,kpNumber:i.kpNumber,retrograde:!0});return t}renderEmpty(){return s`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let t=e.ascendant;return s`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${t?s`<div class="asc">Ascendant: <strong>${typeof t.longitude=="number"?Q(t.longitude):t.sign??""} </strong>${t.nakshatra?s`· ${Ut(t.nakshatra,t.pada)}`:n} ${t.subLord?s`· sub lord ${t.subLord}`:n} ${typeof t.kpNumber=="number"?s`· KP ${t.kpNumber}`:n}</div>`:n} ${typeof e.meta?.ayanamsa=="number"?s`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${w(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?s`· ${e.meta.houseSystem} houses`:n}</div>`:n}</header>${Z({items:Xo,active:this.activeTab,onSelect:a=>{this.activeTab=a},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?s`<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(t=>s`<tr><td class="body">${t.name}${t.retrograde?s`<span class="retro">R</span>`:n}</td><td class="num">${typeof t.longitude=="number"?Q(t.longitude):""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${Ut(t.nakshatra,t.pada)}</td><td>${t.starLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?s`<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(t=>s`<tr><td class="body num">${t.house}</td><td class="num">${typeof t.longitude=="number"?Q(t.longitude):t.sign??""}</td><td>${t.signLord??""}</td><td>${Ut(t.nakshatra,t.pada)}</td><td>${t.starLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td class="num">${typeof t.kpNumber=="number"?t.kpNumber:""}</td></tr>`)}</tbody></table>`:s`<p class="roxy-empty" role="status">No cusps</p>`}renderSignificators(){let e=this.data?.significators,t=e?.houseWise??[],a=e?.planetWise??[];return!t.length&&!a.length?s`<p class="roxy-empty" role="status">No significators</p>`:s`${this.renderLevelLegend(t)} ${t.length?s`<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>${xt.map(o=>s`<th scope="col">L${o}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${t.map(o=>s`<tr><td class="body num">${o.house}</td>${xt.map(i=>this.renderCell(this.planetsAtLevel(o,i).join(", ")))}<td class="chain">${as(o.all??[])}</td></tr>`)}</tbody></table>`:n} ${a.length?s`<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>${xt.map(o=>s`<th scope="col">L${o}</th>`)}<th scope="col">Strength order</th></tr></thead><tbody>${a.map(o=>s`<tr><td class="body">${o.planet}</td>${xt.map(i=>this.renderCell(this.housesAtLevel(o,i).join(", ")))}<td class="chain">${as(o.allHouses??[])}</td></tr>`)}</tbody></table>`:n}`}renderCell(e){return e?s`<td>${e}</td>`:s`<td class="empty-cell">none</td>`}planetsAtLevel(e,t){return(e.significators??[]).filter(a=>a.level===t).flatMap(a=>a.planets??[])}housesAtLevel(e,t){return(e.signifies??[]).filter(a=>a.level===t).flatMap(a=>a.houses??[])}renderLevelLegend(e){let t=new Map;for(let a of e)for(let o of a.significators??[])o.description&&!t.has(o.level)&&t.set(o.level,o.description);return t.size===0?n:s`<ul class="legend" aria-label="Significator levels">${[...t.entries()].sort((a,o)=>a[0]-o[0]).map(([a,o])=>s`<li><b>L${a}</b>${o}</li>`)}</ul>`}};Re.styles=[x,Y,h`.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)}`],g([N()],Re.prototype,"activeTab",2),Re=g([f("roxy-kp-chart")],Re);var lr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No KP data</div>`}renderData(r){let e=r.planets??[];return s`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof r.ayanamsa=="number"?s`<span class="ayanamsa">Ayanamsa: ${w(r.ayanamsa,2)}°</span>`:n}</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(t=>s`<tr><td class="planet">${t.planet} ${t.retrograde?s`<span class="retro">R</span>`:n}</td><td>${t.sign??""}</td><td>${t.signLord??""}</td><td>${t.nakshatra??""}</td><td>${t.nakshatraLord??""}</td><td>${t.subLord??""}</td><td>${t.subSubLord??""}</td><td>${t.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};lr.styles=[x,h`.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}`],lr=g([f("roxy-kp-planets-table")],lr);var dr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(r){let e=r.significators??[];return s`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${r.dayLord?s`<div class="day-lord">Day lord: <strong>${r.dayLord}</strong></div>`:n}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${r.moonSignLord??""}</dd><dt>Star lord</dt><dd>${r.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${r.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${r.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${r.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${r.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${r.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${r.lagnaSubSublord??""}</dd></dl></div></div>${r.rulingPlanets?.length?s`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${r.rulingPlanets.map((t,a)=>s`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:n} ${e.length?s`<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(t=>s`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:n}</div>`}};dr.styles=[x,h`.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}`],dr=g([f("roxy-kp-ruling-planets")],dr);var Ft=320,ee=Ft/2,ce=128,Qo=118,en=140,rn=150;function pe(l,r){let e=l*Math.PI/180;return{x:ee+r*Math.sin(e),y:ee-r*Math.cos(e)}}var tn=[{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"}],cr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No local space data</div>`}renderData(r){let e=r.bodies??[],t=r.birthDetails;return s`<div class="wrap"><header><h2 class="title">Local space</h2>${t?s`<div class="meta">${[t.date,t.time].filter(Boolean).join(" \xB7 ")}</div>`:n}</header>${this.renderDial(e)} ${r.summary?s`<p class="summary">${r.summary}</p>`:n} ${this.renderList(e)}</div>`}renderDial(r){return s`<svg viewBox="0 0 ${Ft} ${Ft}" 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="${ee}" cy="${ee}" r="${ce}"/><circle class="dial" cx="${ee}" cy="${ee}" r="${ce*.66}" stroke-width="0.5"/><circle class="dial" cx="${ee}" cy="${ee}" r="${ce*.33}" stroke-width="0.5"/>${this.renderCompassRing()} ${this.renderSpokes(r)}<circle class="center-dot" cx="${ee}" cy="${ee}" r="2.5"/></svg>`}renderCompassRing(){let r=[];for(let d=0;d<360;d+=22.5){let c=pe(d,ce),m=pe(d,ce-(d%45===0?8:4));r.push(L`<line class="tick" x1=${m.x} y1=${m.y} x2=${c.x} y2=${c.y} />`)}let e=pe(0,ce),t=pe(180,ce),a=pe(90,ce),o=pe(270,ce),i=tn.map(({az:d,label:c})=>{let m=pe(d,rn),p=d%90===0;return L`<text class=${`compass-label${p?" cardinal":""}`} x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${c}</text>`});return L`
|
|
85
85
|
<line class="cardinal-axis" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} />
|
|
86
86
|
<line class="cardinal-axis" x1=${a.x} y1=${a.y} x2=${o.x} y2=${o.y} />
|
|
87
87
|
${r}${i}`}renderSpokes(r){return r.map((e,t)=>{let a=qe(e.planet,t),o=e.aboveHorizon===!1,i=pe(e.azimuth,Qo),d=pe(e.azimuth,en),c=e.symbol||e.planet.slice(0,2),m=`${e.altitude>0?"+":""}${Math.round(e.altitude)}\xB0`;return L`<g>
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
</g>`})}renderAscendants(r){let e=[],t=(a,o)=>{if(!a)return;let i=K.findIndex(b=>b.toLowerCase()===a.sign.toLowerCase());if(i===-1)return;let d=i*30+a.degree,c=this.toAngle(d),m=o===1?ta+14:Rr+14,p=_(j,j,m,c),y=_(j,j,ra+14,c);e.push(L`<g>
|
|
103
103
|
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${y.x} y2=${y.y} />
|
|
104
104
|
<text class="asc-label" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">Asc${o}</text>
|
|
105
|
-
</g>`)};return t(r.person1?.ascendant,1),t(r.person2?.ascendant,2),e}renderInterAspectLines(r,e,t){let a=(o,i)=>{let d=v(i);for(let c of o)if(v(c.name)===d&&typeof c.longitude=="number")return c.longitude};return t.map(o=>{let i=a(r,o.planet1),d=a(e,o.planet2);if(i===void 0||d===void 0)return n;let c=_(j,j,ta-12,this.toAngle(i)),m=_(j,j,Rr+8,this.toAngle(d)),p=ie(o),y=Be[p]??"aspect-other",b=w(o.orb,1);return L`<line class=${`aspect ${y}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${p} ${o.planet2}${b?` (orb ${b}\xB0)`:""}</title></line>`})}renderAspects(r){return s`<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>${r.map(e=>s`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${ie(e)||""}</td><td class="orb">${w(e.orb,1)}</td><td>${w(e.strength,0)}</td></tr>`)}</tbody></table>`}};ur.styles=[x,E,P,h`.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}`],ur=g([f("roxy-synastry-chart")],ur);var un=[["love","Love"],["career","Career"],["finances","Finances"],["health","Health"],["spirituality","Spirituality"]],Te=class extends u{constructor(){super(...arguments);this.orientation="upright"}renderEmpty(){return s`<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 t=e.card,a=!!t.reversed,o=t.keywords??[],i=[t.arcana?`${t.arcana} arcana`:"",t.suit??""].filter(Boolean).join(" \xB7 ");return s`<article class="card" aria-label="${t.name??"Tarot card"}">${this.renderImage(t.imageUrl,t.name,a)}<div><div class="meta">${i?`${i} \xB7 `:""}<span class="drawn">${a?"drawn reversed":"drawn upright"}</span></div><h2 class="title">${t.name??"Tarot card"}</h2>${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:n} ${t.meaning?s`<p class="reading">${t.meaning}</p>`:n} ${o.length>0?s`<div class="chips">${o.map(d=>s`<span>${d}</span>`)}</div>`:n} ${this.renderGuidance(t,"tarot-daily-guidance")}</div></article>`}renderFullCard(e){let t=this.orientation==="reversed",a=t?e.reversed:e.upright,o=(t?e.keywords?.reversed:e.keywords?.upright)??a?.keywords??[];return s`<article class="card" aria-label="${e.name??"Tarot card"}">${this.renderImage(e.imageUrl,e.name,t)}<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>${Z({items:[{id:"upright",label:"Upright"},{id:"reversed",label:"Reversed"}],active:this.orientation,onSelect:i=>{this.orientation=i},label:"Card orientation",idPrefix:"tarot"})} ${a?.description?s`<p class="reading">${a.description}</p>`:n} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:n} ${this.renderGuidance(a,`tarot-${this.orientation}-guidance`)}</div></article>`}renderImage(e,t,a){let o=`image ${a?"reversed":""}`;return e?s`<img class="${o}" src="${e}" alt="${t??"Tarot card"}">`:s`<div class="${o}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${t??"?"}</div>`}renderGuidance(e,t){if(!e)return n;let a=un.map(([o,i])=>({label:i,body:e[o]??""}));return M(a,t,"Guidance")}};Te.styles=[x,E,P,Y,h`.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}`],g([N()],Te.prototype,"orientation",2),Te=g([f("roxy-tarot-card")],Te);var Me=class extends u{constructor(){super(...arguments);this.heading=""}renderEmpty(){return s`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let t=e.cards??[];if(t.length===0)return this.renderEmpty();let a=this.heading||"Tarot deck",o=typeof e.total=="number"?e.total:t.length;return s`<section class="wrap" aria-label="${a}"><header class="head"><h2 class="title">${a}</h2><span class="count">${o} ${o===1?"card":"cards"}</span></header><ul class="grid">${t.map(i=>s`<li class="tile">${i.imageUrl?s`<img class="art" src="${i.imageUrl}" alt="${i.name??"Tarot card"}" loading="lazy">`:s`<div class="art" aria-hidden="true"></div>`}<p class="name">${i.name}</p><p class="meta">${xn(i)}</p></li>`)}</ul></section>`}};Me.styles=[x,h`.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}`],g([k({type:String,reflect:!0})],Me.prototype,"heading",2),Me=g([f("roxy-tarot-catalog")],Me);function xn(l){return l.suit?`${v(l.arcana)} \xB7 ${v(l.suit)}`:`${v(l.arcana)} Arcana`}var De=class extends u{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return s`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let t="answer"in e,a="cards"in e&&!("spread"in e),o=a?[]:"positions"in e?e.positions??[]:[],i=a&&"cards"in e?e.cards:[],d=t?e.answer:void 0,c=t?e.strength:void 0,m=t?e.card:void 0,p="spread"in e?e.spread:this.spread.replace(/-/g," "),y="question"in e?e.question:void 0,b="summary"in e?e.summary:void 0,$=t?e.interpretation:void 0,R=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${p}</h2>${y?s`<span class="question">"${y}"</span>`:n}</header>${t?s`<div class="verdict"><div class="card"><div class="image">${m?.imageUrl?s`<img src="${m.imageUrl}" alt="${m.name??"tarot card"}" class="${m.reversed?"reversed":""}">`:s`${m?.name??"?"}`}</div><p class="name">${m?.name??""} ${m?.reversed?s`<small>(reversed)</small>`:n}</p>${m?.arcana?s`<p class="arcana">${m.arcana} arcana</p>`:n}</div><div class="meta"><div><span class="${`answer ${R}`}">${d}</span> ${c?s`<small>· ${c}</small>`:n}</div>${m?.keywords&&m.keywords.length>0?s`<div class="chips">${m.keywords.map(C=>s`<span>${C}</span>`)}</div>`:n}</div></div>`:n} ${o.length>0?s`<div class="grid">${o.map(C=>s`<div class="card"><p class="label">${C.name??""}</p><div class="image">${C.card?.imageUrl?s`<img src="${C.card.imageUrl}" alt="${C.card.name??"tarot card"}" class="${C.card.reversed?"reversed":""}">`:s`${C.card?.name??"?"}`}</div><p class="name">${C.card?.name??""} ${C.card?.reversed?s`<small>(reversed)</small>`:n}</p>${C.interpretation?s`<p class="interp">${C.interpretation}</p>`:n}</div>`)}</div>`:n} ${i.length>0?s`<div class="grid">${i.map(C=>s`<div class="card"><div class="image">${C.imageUrl?s`<img src="${C.imageUrl}" alt="${C.name??"tarot card"}" class="${C.reversed?"reversed":""}">`:s`${C.name??"?"}`}</div><p class="name">${C.name??""} ${C.reversed?s`<small>(reversed)</small>`:n}</p>${C.meaning?s`<p class="interp">${C.meaning}</p>`:n}</div>`)}</div>`:n} ${b?s`<p class="reading">${b}</p>`:n} ${$?s`<p class="reading">${$}</p>`:n}</article>`}};De.styles=[x,h`.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}`],g([k({type:String,reflect:!0})],De.prototype,"spread",2),De=g([f("roxy-tarot-spread")],De);var ze=class extends u{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return s`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:t,transitTime:a,transitPlanets:o,transitAspects:i,summary:d}=e,c=[D(t),V(a)].filter(Boolean).join(" "),m=i?.length??0,p=this.tab;return s`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${c?s`<p class="subtitle">${c}</p>`:n}</div>${m>0?s`${Z({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${m})`}],active:p,onSelect:y=>{this.tab=y},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?s`<div class="overflow-scroll">${this.renderPlanetsTable(o)}</div>`:s`${d?this.renderSummaryPills(d):n}<div class="overflow-scroll">${this.renderAspectsList(i??[])}</div>`}</div>`:s`<div class="overflow-scroll">${this.renderPlanetsTable(o)}</div>`}</div>`}renderSummaryPills(e){return s`<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 s`<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(t=>{let a=S[v(t.name)]??"",o=H[v(t.sign)]??"",i=t.speed>=0?"\u2191":"\u2193";return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${t.name} ${t.isRetrograde?s`<span class="retro-badge" aria-label="retrograde">R</span>`:n}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${o}</span> ${t.sign}</div></td><td class="num">${w(t.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${i}</span> ${w(Math.abs(t.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return s`<div role="list" aria-label="Transit aspects">${e.map((t,a)=>{let o=S[v(t.transitPlanet)]??"",i=S[v(t.natalPlanet)]??"",d=(t.nature??"neutral").toLowerCase(),c=t.interpretation,m=(t.type??"").toLowerCase(),p=t.isApplying?"Applying":"Separating";return s`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${a===0}"><summary><span aria-hidden="true">${o}</span> ${t.transitPlanet} <span class="nature-badge ${d}">${m}</span> <span aria-hidden="true">${i}</span> ${t.natalPlanet} <span class="meta">${p} · orb ${w(t.orb,2)}° · strength ${w(t.strength,1)} </span>${G()}</summary><div class="interp-body">${c?.summary?s`<p>${c.summary}</p>`:n} ${c?.impact?s`<p><strong>Impact:</strong> ${c.impact}</p>`:n} ${c?.timing?s`<p><strong>Timing:</strong> ${c.timing}</p>`:n} ${c?.guidance?s`<p><strong>Guidance:</strong> ${c.guidance}</p>`:n} ${c?.keywords?.length?s`<div class="interp-keywords">${c.keywords.map(y=>s`<span class="kw">${y}</span>`)}</div>`:n}</div></details>`})}</div>`}};ze.styles=[x,Y,E,h`.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)}`],g([N()],ze.prototype,"tab",2),ze=g([f("roxy-transits-table")],ze);var xr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(r){let e=r.aspects??[],t=r.mutualAspects??[],a=r.planets??[];if(e.length===0&&t.length===0)return this.renderEmpty();let o=r.datetime?`${D(r.datetime)}, ${V(r.datetime)}`:"";return s`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${o?s`<p class="subtitle">Chart time ${o}</p>`:n}</div>${a.length>0?s`<div><p class="section-label">Sidereal positions</p><div class="mutual">${a.map(i=>s`<span class="position"><strong>${i.name}</strong> ${typeof i.longitude=="number"?Q(i.longitude):i.sign??""}</span>`)}</div></div>`:n} ${t.length>0?s`<div><p class="section-label">Mutual aspects</p><div class="mutual">${t.map(i=>s`<span class="mutual-pill">${i.planet1} ⟷ ${i.planet2} ${i.aspectType?s`<span class="rel">${i.aspectType}</span>`:n}</span>`)}</div></div>`:n} ${e.length>0?s`<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(i=>s`<tr><td>${i.aspectingPlanet}</td><td><span class="kind">${i.aspectType}</span></td><td>${i.aspectedPlanet}</td><td>${typeof i.strength=="number"?s`<span class="bar" style="width:${Math.max(4,Math.min(100,i.strength)*.4)}px"></span><span class="num">${w(i.strength,0)}</span>`:n}</td><td class="num">${typeof i.orb=="number"?`${w(i.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:n}</div>`}};xr.styles=[x,h`.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}`],xr=g([f("roxy-vedic-aspects")],xr);var se=class extends u{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?mt(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return s`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let t=this.viewModel();if(!t)return this.renderEmpty();let a=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return s`<div class="wrap"><div class="header"><h2 class="title">${a}</h2>${yt(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>${gt(t,this.chartStyle)}</svg></div>`}};se.styles=[x,ht,Y],g([k({type:String,reflect:!0,attribute:"chart-style"})],se.prototype,"chartStyle",2),g([k({type:String,reflect:!0,attribute:"chart-reference"})],se.prototype,"chartReference",2),g([k({type:String,reflect:!0,attribute:"lagna-override"})],se.prototype,"lagnaOverride",2),se=g([f("roxy-vedic-kundli")],se);var fn=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],fr=class extends u{orderedRows(){let r=this.data?.meta??{},e=new Set,t=[];for(let a of fn){let o=r[a];o&&(t.push([a,o]),e.add(a))}for(let[a,o]of Object.entries(r))e.has(a)||t.push([a,o]);return t}renderEmpty(){return s`<div class="roxy-empty" role="status">No chart data</div>`}renderData(r){if(!r.meta)return this.renderEmpty();let e=this.orderedRows();return s`<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(([t,a])=>{let o=(a.graha??t)==="Lagna",i=S[v(a.graha??t)]??"",d=H[v(a.rashi??"")]??"";return s`<tr class="${o?"lagna":""}"><td class="graha">${i?s`<span class="glyph">${i}</span>`:n}${a.graha??t}</td><td>${d?s`<span class="glyph">${d}</span>`:n}${a.rashi??""}</td><td class="num">${typeof a.longitude=="number"?Q(a.longitude):""}</td><td>${a.nakshatra?.name??""}</td><td class="num">${a.nakshatra?.pada??""}</td><td>${a.nakshatra?.lord??""}</td><td class="num">${typeof a.house=="number"?a.house:""}</td><td>${a.awastha??""}</td><td>${a.isRetrograde?s`<span class="retro">R</span>`:n}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let r=this.data?.combustion??[];return r.length===0?n:s`<details class="panel"><summary>Combust grahas<span class="summary-count">${r.length}</span>${G()}</summary><div class="panel-body">${r.map(e=>{let t=S[v(e.planet)]??"",a=w(e.distanceFromSun,2),o=w(e.orb,1);return s`<div class="condition"><span class="planet">${t?`${t} `:""}${e.planet}</span> <span class="detail">${a} deg from Sun, within ${o} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let r=this.data?.planetaryWar??[];return r.length===0?n:s`<details class="panel"><summary>Planetary wars<span class="summary-count">${r.length}</span>${G()}</summary><div class="panel-body">${r.map(e=>{let t=w(e.distance,2);return s`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let r=this.data?.interpretations??{},e=this.orderedRows().map(([t,a])=>[a.graha??t,r[a.graha??t]]).filter(([,t])=>t!=null);return e.length===0?n:s`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${G()}</summary><div class="panel-body">${e.map(([t,a])=>{let o=S[v(t)]??"";return s`<div class="interp"><span class="planet">${o?`${o} `:""}${t}</span> ${a.rashi?s`<p><span class="label">Rashi.</span> ${a.rashi}</p>`:n} ${a.nakshatra?s`<p><span class="label">Nakshatra.</span> ${a.nakshatra}</p>`:n}</div>`})}</div></details>`}renderHouses(){let r=(this.data?.houses??[]).filter(e=>e.name||e.description);return r.length===0?n:s`<details class="panel"><summary>Bhava significations<span class="summary-count">${r.length}</span>${G()}</summary><div class="panel-body">${r.map(e=>s`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?s`<p class="desc">${e.description}</p>`:n}</div>`)}</div></details>`}renderYogas(){let r=(this.data?.yogas??[]).filter(e=>e.present);return r.length===0?n:s`<details class="panel"><summary>Yogas<span class="summary-count">${r.length}</span>${G()}</summary><div class="panel-body">${r.map(e=>s`<div class="bhava"><span class="name">${e.name} ${e.quality?s`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:n}</span> ${e.result?s`<p class="desc">${e.result}</p>`:n}</div>`)}</div></details>`}};fr.styles=[x,E,h`.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)}`],fr=g([f("roxy-vedic-planets-table")],fr);var br=class extends u{rows(){let r=this.data;if(!r)return[];let e=(r.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,a]of[["Ascendant",r.ascendant],["Midheaven",r.midheaven],["Part of Fortune",r.partOfFortune],["Vertex",r.vertex]])a&&e.push({name:t,sign:a.sign,longitude:a.longitude,isPoint:!0});return e}renderEmpty(){return s`<div class="roxy-empty" role="status">No chart data</div>`}renderData(r){if(!r.planets)return this.renderEmpty();let e=this.rows();return s`<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(t=>{let a=S[v(t.name)]??"",o=H[v(t.sign??"")]??"",i=typeof t.speed=="number"?w(t.speed,3):"";return s`<tr class="${t.isPoint?"point":""}"><td class="body">${a?s`<span class="glyph">${a}</span>`:n}${t.name}</td><td>${o?s`<span class="glyph">${o}</span>`:n}${t.sign??""}</td><td class="num">${typeof t.longitude=="number"?Q(t.longitude):""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td class="num">${i?s`${i}°/day`:n} ${t.isRetrograde?s`<span class="retro">℞</span>`:n}</td></tr>`})}</tbody></table></div>`}};br.styles=[x,h`.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}`],br=g([f("roxy-western-planets-table")],br);var Ne=class extends u{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let t=`quality-chip quality-${e}`;return s`<span class="${t}">${e}</span>`}renderDetailCard(e){return s`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):n}</p>${e.description?s`<p class="description">${e.description}</p>`:n} ${e.result?s`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:n}</div>`}renderDetectCard(e){return s`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):n} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?s`<p class="description">${e.description}</p>`:n} ${e.present&&e.result?s`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:n} ${e.evidence?s`<p class="evidence">${e.evidence}</p>`:n}</div>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let t=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let a=e;return s`<div class="wrap">${this.renderDetailCard(a)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let a=e.yogas;if(a.length>0&&"present"in a[0]){let m=a,p=t?m.filter($=>$.name.toLowerCase().includes(t)):m,y=[...p.filter($=>$.present),...p.filter($=>!$.present)],b=e.total??m.filter($=>$.present).length;return s`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${b} of ${m.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">${y.length>0?y.map($=>this.renderDetectCard($)):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}if(a.length>0&&"description"in a[0]){let m=a,p=t?m.filter(b=>b.name.toLowerCase().includes(t)):m,y=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${y!==void 0?s`<span class="count">${y} total</span>`:n}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(b=>this.renderDetailCard(b)):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let i=a,d=t?i.filter(m=>m.name.toLowerCase().includes(t)):i,c=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${c!==void 0?s`<span class="count">${c} total</span>`:n}</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">${d.length>0?d.map(m=>s`<div class="yoga-chip">${m.name} <span class="yoga-id">${m.id}</span></div>`):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return s`<div class="roxy-empty" role="status">No yoga data</div>`}};Ne.styles=[x,h`.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}`],g([N()],Ne.prototype,"filter",2),Ne=g([f("roxy-yoga-list")],Ne);var bt=[{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 cs="0.15.0";var bn=bt.map(l=>l.slug);var ps=`/**
|
|
105
|
+
</g>`)};return t(r.person1?.ascendant,1),t(r.person2?.ascendant,2),e}renderInterAspectLines(r,e,t){let a=(o,i)=>{let d=v(i);for(let c of o)if(v(c.name)===d&&typeof c.longitude=="number")return c.longitude};return t.map(o=>{let i=a(r,o.planet1),d=a(e,o.planet2);if(i===void 0||d===void 0)return n;let c=_(j,j,ta-12,this.toAngle(i)),m=_(j,j,Rr+8,this.toAngle(d)),p=ie(o),y=Be[p]??"aspect-other",b=w(o.orb,1);return L`<line class=${`aspect ${y}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${o.planet1} ${p} ${o.planet2}${b?` (orb ${b}\xB0)`:""}</title></line>`})}renderAspects(r){return s`<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>${r.map(e=>s`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${ie(e)||""}</td><td class="orb">${w(e.orb,1)}</td><td>${w(e.strength,0)}</td></tr>`)}</tbody></table>`}};ur.styles=[x,E,P,h`.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}`],ur=g([f("roxy-synastry-chart")],ur);var un=[["love","Love"],["career","Career"],["finances","Finances"],["health","Health"],["spirituality","Spirituality"]],Te=class extends u{constructor(){super(...arguments);this.orientation="upright"}renderEmpty(){return s`<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 t=e.card,a=!!t.reversed,o=t.keywords??[],i=[t.arcana?`${t.arcana} arcana`:"",t.suit??""].filter(Boolean).join(" \xB7 ");return s`<article class="card" aria-label="${t.name??"Tarot card"}">${this.renderImage(t.imageUrl,t.name,a)}<div><div class="meta">${i?`${i} \xB7 `:""}<span class="drawn">${a?"drawn reversed":"drawn upright"}</span></div><h2 class="title">${t.name??"Tarot card"}</h2>${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:n} ${t.meaning?s`<p class="reading">${t.meaning}</p>`:n} ${o.length>0?s`<div class="chips">${o.map(d=>s`<span>${d}</span>`)}</div>`:n} ${this.renderGuidance(t,"tarot-daily-guidance")}</div></article>`}renderFullCard(e){let t=this.orientation==="reversed",a=t?e.reversed:e.upright,o=(t?e.keywords?.reversed:e.keywords?.upright)??a?.keywords??[];return s`<article class="card" aria-label="${e.name??"Tarot card"}">${this.renderImage(e.imageUrl,e.name,t)}<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>${Z({items:[{id:"upright",label:"Upright"},{id:"reversed",label:"Reversed"}],active:this.orientation,onSelect:i=>{this.orientation=i},label:"Card orientation",idPrefix:"tarot"})} ${a?.description?s`<p class="reading">${a.description}</p>`:n} ${o.length>0?s`<div class="chips">${o.map(i=>s`<span>${i}</span>`)}</div>`:n} ${this.renderGuidance(a,`tarot-${this.orientation}-guidance`)}</div></article>`}renderImage(e,t,a){let o=`image ${a?"reversed":""}`;return e?s`<img class="${o}" src="${e}" alt="${t??"Tarot card"}">`:s`<div class="${o}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${t??"?"}</div>`}renderGuidance(e,t){if(!e)return n;let a=un.map(([o,i])=>({label:i,body:e[o]??""}));return M(a,t,"Guidance")}};Te.styles=[x,E,P,Y,h`.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}`],g([N()],Te.prototype,"orientation",2),Te=g([f("roxy-tarot-card")],Te);var Me=class extends u{constructor(){super(...arguments);this.heading=""}renderEmpty(){return s`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let t=e.cards??[];if(t.length===0)return this.renderEmpty();let a=this.heading||"Tarot deck",o=typeof e.total=="number"?e.total:t.length;return s`<section class="wrap" aria-label="${a}"><header class="head"><h2 class="title">${a}</h2><span class="count">${o} ${o===1?"card":"cards"}</span></header><ul class="grid">${t.map(i=>s`<li class="tile">${i.imageUrl?s`<img class="art" src="${i.imageUrl}" alt="${i.name??"Tarot card"}" loading="lazy">`:s`<div class="art" aria-hidden="true"></div>`}<p class="name">${i.name}</p><p class="meta">${xn(i)}</p></li>`)}</ul></section>`}};Me.styles=[x,h`.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}`],g([k({type:String,reflect:!0})],Me.prototype,"heading",2),Me=g([f("roxy-tarot-catalog")],Me);function xn(l){return l.suit?`${v(l.arcana)} \xB7 ${v(l.suit)}`:`${v(l.arcana)} Arcana`}var De=class extends u{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return s`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let t="answer"in e,a="cards"in e&&!("spread"in e),o=a?[]:"positions"in e?e.positions??[]:[],i=a&&"cards"in e?e.cards:[],d=t?e.answer:void 0,c=t?e.strength:void 0,m=t?e.card:void 0,p="spread"in e?e.spread:this.spread.replace(/-/g," "),y="question"in e?e.question:void 0,b="summary"in e?e.summary:void 0,$=t?e.interpretation:void 0,R=d?d.toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${p}</h2>${y?s`<span class="question">"${y}"</span>`:n}</header>${t?s`<div class="verdict"><div class="card"><div class="image">${m?.imageUrl?s`<img src="${m.imageUrl}" alt="${m.name??"tarot card"}" class="${m.reversed?"reversed":""}">`:s`${m?.name??"?"}`}</div><p class="name">${m?.name??""} ${m?.reversed?s`<small>(reversed)</small>`:n}</p>${m?.arcana?s`<p class="arcana">${m.arcana} arcana</p>`:n}</div><div class="meta"><div><span class="${`answer ${R}`}">${d}</span> ${c?s`<small>· ${c}</small>`:n}</div>${m?.keywords&&m.keywords.length>0?s`<div class="chips">${m.keywords.map(C=>s`<span>${C}</span>`)}</div>`:n}</div></div>`:n} ${o.length>0?s`<div class="grid">${o.map(C=>s`<div class="card"><p class="label">${C.name??""}</p><div class="image">${C.card?.imageUrl?s`<img src="${C.card.imageUrl}" alt="${C.card.name??"tarot card"}" class="${C.card.reversed?"reversed":""}">`:s`${C.card?.name??"?"}`}</div><p class="name">${C.card?.name??""} ${C.card?.reversed?s`<small>(reversed)</small>`:n}</p>${C.interpretation?s`<p class="interp">${C.interpretation}</p>`:n}</div>`)}</div>`:n} ${i.length>0?s`<div class="grid">${i.map(C=>s`<div class="card"><div class="image">${C.imageUrl?s`<img src="${C.imageUrl}" alt="${C.name??"tarot card"}" class="${C.reversed?"reversed":""}">`:s`${C.name??"?"}`}</div><p class="name">${C.name??""} ${C.reversed?s`<small>(reversed)</small>`:n}</p>${C.meaning?s`<p class="interp">${C.meaning}</p>`:n}</div>`)}</div>`:n} ${b?s`<p class="reading">${b}</p>`:n} ${$?s`<p class="reading">${$}</p>`:n}</article>`}};De.styles=[x,h`.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}`],g([k({type:String,reflect:!0})],De.prototype,"spread",2),De=g([f("roxy-tarot-spread")],De);var ze=class extends u{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return s`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:t,transitTime:a,transitPlanets:o,transitAspects:i,summary:d}=e,c=[D(t),V(a)].filter(Boolean).join(" "),m=i?.length??0,p=this.tab;return s`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${c?s`<p class="subtitle">${c}</p>`:n}</div>${m>0?s`${Z({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${m})`}],active:p,onSelect:y=>{this.tab=y},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?s`<div class="overflow-scroll">${this.renderPlanetsTable(o)}</div>`:s`${d?this.renderSummaryPills(d):n}<div class="overflow-scroll">${this.renderAspectsList(i??[])}</div>`}</div>`:s`<div class="overflow-scroll">${this.renderPlanetsTable(o)}</div>`}</div>`}renderSummaryPills(e){return s`<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 s`<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(t=>{let a=S[v(t.name)]??"",o=H[v(t.sign)]??"",i=t.speed>=0?"\u2191":"\u2193";return s`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${t.name} ${t.isRetrograde?s`<span class="retro-badge" aria-label="retrograde">R</span>`:n}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${o}</span> ${t.sign}</div></td><td class="num">${w(t.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${i}</span> ${w(Math.abs(t.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return s`<div role="list" aria-label="Transit aspects">${e.map((t,a)=>{let o=S[v(t.transitPlanet)]??"",i=S[v(t.natalPlanet)]??"",d=(t.nature??"neutral").toLowerCase(),c=t.interpretation,m=(t.type??"").toLowerCase(),p=t.isApplying?"Applying":"Separating";return s`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${a===0}"><summary><span aria-hidden="true">${o}</span> ${t.transitPlanet} <span class="nature-badge ${d}">${m}</span> <span aria-hidden="true">${i}</span> ${t.natalPlanet} <span class="meta">${p} · orb ${w(t.orb,2)}° · strength ${w(t.strength,1)} </span>${G()}</summary><div class="interp-body">${c?.summary?s`<p>${c.summary}</p>`:n} ${c?.impact?s`<p><strong>Impact:</strong> ${c.impact}</p>`:n} ${c?.timing?s`<p><strong>Timing:</strong> ${c.timing}</p>`:n} ${c?.guidance?s`<p><strong>Guidance:</strong> ${c.guidance}</p>`:n} ${c?.keywords?.length?s`<div class="interp-keywords">${c.keywords.map(y=>s`<span class="kw">${y}</span>`)}</div>`:n}</div></details>`})}</div>`}};ze.styles=[x,Y,E,h`.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)}`],g([N()],ze.prototype,"tab",2),ze=g([f("roxy-transits-table")],ze);var xr=class extends u{renderEmpty(){return s`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(r){let e=r.aspects??[],t=r.mutualAspects??[],a=r.planets??[];if(e.length===0&&t.length===0)return this.renderEmpty();let o=r.datetime?`${D(r.datetime)}, ${V(r.datetime)}`:"";return s`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${o?s`<p class="subtitle">Chart time ${o}</p>`:n}</div>${a.length>0?s`<div><p class="section-label">Sidereal positions</p><div class="mutual">${a.map(i=>s`<span class="position"><strong>${i.name}</strong> ${typeof i.longitude=="number"?Q(i.longitude):i.sign??""}</span>`)}</div></div>`:n} ${t.length>0?s`<div><p class="section-label">Mutual aspects</p><div class="mutual">${t.map(i=>s`<span class="mutual-pill">${i.planet1} ⟷ ${i.planet2} ${i.aspectType?s`<span class="rel">${i.aspectType}</span>`:n}</span>`)}</div></div>`:n} ${e.length>0?s`<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(i=>s`<tr><td>${i.aspectingPlanet}</td><td><span class="kind">${i.aspectType}</span></td><td>${i.aspectedPlanet}</td><td>${typeof i.strength=="number"?s`<span class="bar" style="width:${Math.max(4,Math.min(100,i.strength)*.4)}px"></span><span class="num">${w(i.strength,0)}</span>`:n}</td><td class="num">${typeof i.orb=="number"?`${w(i.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:n}</div>`}};xr.styles=[x,h`.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}`],xr=g([f("roxy-vedic-aspects")],xr);var se=class extends u{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?mt(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return s`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let t=this.viewModel();if(!t)return this.renderEmpty();let a=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return s`<div class="wrap"><div class="header"><h2 class="title">${a}</h2>${yt(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>${gt(t,this.chartStyle)}</svg></div>`}};se.styles=[x,ht,Y],g([k({type:String,reflect:!0,attribute:"chart-style"})],se.prototype,"chartStyle",2),g([k({type:String,reflect:!0,attribute:"chart-reference"})],se.prototype,"chartReference",2),g([k({type:String,reflect:!0,attribute:"lagna-override"})],se.prototype,"lagnaOverride",2),se=g([f("roxy-vedic-kundli")],se);var fn=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],fr=class extends u{orderedRows(){let r=this.data?.meta??{},e=new Set,t=[];for(let a of fn){let o=r[a];o&&(t.push([a,o]),e.add(a))}for(let[a,o]of Object.entries(r))e.has(a)||t.push([a,o]);return t}renderEmpty(){return s`<div class="roxy-empty" role="status">No chart data</div>`}renderData(r){if(!r.meta)return this.renderEmpty();let e=this.orderedRows();return s`<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(([t,a])=>{let o=(a.graha??t)==="Lagna",i=S[v(a.graha??t)]??"",d=H[v(a.rashi??"")]??"";return s`<tr class="${o?"lagna":""}"><td class="graha">${i?s`<span class="glyph">${i}</span>`:n}${a.graha??t}</td><td>${d?s`<span class="glyph">${d}</span>`:n}${a.rashi??""}</td><td class="num">${typeof a.longitude=="number"?Q(a.longitude):""}</td><td>${a.nakshatra?.name??""}</td><td class="num">${a.nakshatra?.pada??""}</td><td>${a.nakshatra?.lord??""}</td><td class="num">${typeof a.house=="number"?a.house:""}</td><td>${a.awastha??""}</td><td>${a.isRetrograde?s`<span class="retro">R</span>`:n}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let r=this.data?.combustion??[];return r.length===0?n:s`<details class="panel"><summary>Combust grahas<span class="summary-count">${r.length}</span>${G()}</summary><div class="panel-body">${r.map(e=>{let t=S[v(e.planet)]??"",a=w(e.distanceFromSun,2),o=w(e.orb,1);return s`<div class="condition"><span class="planet">${t?`${t} `:""}${e.planet}</span> <span class="detail">${a} deg from Sun, within ${o} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let r=this.data?.planetaryWar??[];return r.length===0?n:s`<details class="panel"><summary>Planetary wars<span class="summary-count">${r.length}</span>${G()}</summary><div class="panel-body">${r.map(e=>{let t=w(e.distance,2);return s`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let r=this.data?.interpretations??{},e=this.orderedRows().map(([t,a])=>[a.graha??t,r[a.graha??t]]).filter(([,t])=>t!=null);return e.length===0?n:s`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${G()}</summary><div class="panel-body">${e.map(([t,a])=>{let o=S[v(t)]??"";return s`<div class="interp"><span class="planet">${o?`${o} `:""}${t}</span> ${a.rashi?s`<p><span class="label">Rashi.</span> ${a.rashi}</p>`:n} ${a.nakshatra?s`<p><span class="label">Nakshatra.</span> ${a.nakshatra}</p>`:n}</div>`})}</div></details>`}renderHouses(){let r=(this.data?.houses??[]).filter(e=>e.name||e.description);return r.length===0?n:s`<details class="panel"><summary>Bhava significations<span class="summary-count">${r.length}</span>${G()}</summary><div class="panel-body">${r.map(e=>s`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?s`<p class="desc">${e.description}</p>`:n}</div>`)}</div></details>`}renderYogas(){let r=(this.data?.yogas??[]).filter(e=>e.present);return r.length===0?n:s`<details class="panel"><summary>Yogas<span class="summary-count">${r.length}</span>${G()}</summary><div class="panel-body">${r.map(e=>s`<div class="bhava"><span class="name">${e.name} ${e.quality?s`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:n}</span> ${e.result?s`<p class="desc">${e.result}</p>`:n}</div>`)}</div></details>`}};fr.styles=[x,E,h`.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)}`],fr=g([f("roxy-vedic-planets-table")],fr);var br=class extends u{rows(){let r=this.data;if(!r)return[];let e=(r.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,a]of[["Ascendant",r.ascendant],["Midheaven",r.midheaven],["Part of Fortune",r.partOfFortune],["Vertex",r.vertex]])a&&e.push({name:t,sign:a.sign,longitude:a.longitude,isPoint:!0});return e}renderEmpty(){return s`<div class="roxy-empty" role="status">No chart data</div>`}renderData(r){if(!r.planets)return this.renderEmpty();let e=this.rows();return s`<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(t=>{let a=S[v(t.name)]??"",o=H[v(t.sign??"")]??"",i=typeof t.speed=="number"?w(t.speed,3):"";return s`<tr class="${t.isPoint?"point":""}"><td class="body">${a?s`<span class="glyph">${a}</span>`:n}${t.name}</td><td>${o?s`<span class="glyph">${o}</span>`:n}${t.sign??""}</td><td class="num">${typeof t.longitude=="number"?Q(t.longitude):""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td class="num">${i?s`${i}°/day`:n} ${t.isRetrograde?s`<span class="retro">℞</span>`:n}</td></tr>`})}</tbody></table></div>`}};br.styles=[x,h`.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}`],br=g([f("roxy-western-planets-table")],br);var Ne=class extends u{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let t=`quality-chip quality-${e}`;return s`<span class="${t}">${e}</span>`}renderDetailCard(e){return s`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):n}</p>${e.description?s`<p class="description">${e.description}</p>`:n} ${e.result?s`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:n}</div>`}renderDetectCard(e){return s`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):n} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?s`<p class="description">${e.description}</p>`:n} ${e.present&&e.result?s`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:n} ${e.evidence?s`<p class="evidence">${e.evidence}</p>`:n}</div>`}renderEmpty(){return s`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let t=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let a=e;return s`<div class="wrap">${this.renderDetailCard(a)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let a=e.yogas;if(a.length>0&&"present"in a[0]){let m=a,p=t?m.filter($=>$.name.toLowerCase().includes(t)):m,y=[...p.filter($=>$.present),...p.filter($=>!$.present)],b=e.total??m.filter($=>$.present).length;return s`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${b} of ${m.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">${y.length>0?y.map($=>this.renderDetectCard($)):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}if(a.length>0&&"description"in a[0]){let m=a,p=t?m.filter(b=>b.name.toLowerCase().includes(t)):m,y=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${y!==void 0?s`<span class="count">${y} total</span>`:n}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(b=>this.renderDetailCard(b)):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let i=a,d=t?i.filter(m=>m.name.toLowerCase().includes(t)):i,c=e.total;return s`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${c!==void 0?s`<span class="count">${c} total</span>`:n}</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">${d.length>0?d.map(m=>s`<div class="yoga-chip">${m.name} <span class="yoga-id">${m.id}</span></div>`):s`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return s`<div class="roxy-empty" role="status">No yoga data</div>`}};Ne.styles=[x,h`.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}`],g([N()],Ne.prototype,"filter",2),Ne=g([f("roxy-yoga-list")],Ne);var bt=[{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 cs="0.15.1";var bn=bt.map(l=>l.slug);var ps=`/**
|
|
106
106
|
* Roxy UI design tokens. ~30 CSS custom properties that every component reads. Light + dark defaults. Host page overrides at :root or per element. No Tailwind, no class-name overrides, no JS theme switcher.
|
|
107
107
|
*
|
|
108
108
|
* Delivery model: this file ships as a global light-DOM stylesheet (linked, or auto-injected by the CDN bundle). Custom properties inherit through the shadow boundary, so tokens set on a light-DOM ancestor reach every component shadow. The explicit theme blocks therefore target light-DOM selectors (:root, .dark, [data-theme="dark"], a wrapper element), NOT :host (a :host rule in a global sheet matches nothing). The :host([data-theme]) selectors are kept only for the case where this CSS is ever adopted directly into a shadow root; they are inert in global delivery.
|