@roxyapi/ui 0.11.0 → 0.12.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 +6 -0
- package/README.md +7 -1
- package/components-catalog.json +111 -1
- package/dist/cdn/components/astrocartography-map.js +58 -0
- package/dist/cdn/components/astrocartography-map.js.map +7 -0
- package/dist/cdn/components/divisional-chart.js +7 -7
- package/dist/cdn/components/divisional-chart.js.map +1 -1
- package/dist/cdn/components/dosha-card.js +2 -2
- package/dist/cdn/components/dosha-card.js.map +3 -3
- package/dist/cdn/components/fixed-stars.js +52 -0
- package/dist/cdn/components/fixed-stars.js.map +7 -0
- package/dist/cdn/components/hd-variables.js +2 -2
- package/dist/cdn/components/hd-variables.js.map +3 -3
- package/dist/cdn/components/hexagram.js +3 -3
- package/dist/cdn/components/hexagram.js.map +3 -3
- package/dist/cdn/components/local-space-compass.js +58 -0
- package/dist/cdn/components/local-space-compass.js.map +7 -0
- package/dist/cdn/components/moon-phase.js +3 -3
- package/dist/cdn/components/moon-phase.js.map +3 -3
- package/dist/cdn/components/natal-chart.js +8 -8
- package/dist/cdn/components/natal-chart.js.map +2 -2
- package/dist/cdn/components/positions-table.js +52 -0
- package/dist/cdn/components/positions-table.js.map +7 -0
- package/dist/cdn/components/profection-card.js +52 -0
- package/dist/cdn/components/profection-card.js.map +7 -0
- package/dist/cdn/components/reference-card.js +3 -3
- package/dist/cdn/components/reference-card.js.map +3 -3
- package/dist/cdn/components/relocation-wheel.js +61 -0
- package/dist/cdn/components/relocation-wheel.js.map +7 -0
- package/dist/cdn/components/synastry-chart.js +4 -4
- package/dist/cdn/components/synastry-chart.js.map +2 -2
- package/dist/cdn/components/vedic-kundli.js +5 -5
- package/dist/cdn/components/vedic-kundli.js.map +1 -1
- package/dist/cdn/components/vedic-planets-table.js +2 -2
- package/dist/cdn/components/vedic-planets-table.js.map +1 -1
- package/dist/cdn/components/western-planets-table.js +2 -2
- package/dist/cdn/components/western-planets-table.js.map +1 -1
- package/dist/cdn/components/yoga-list.js +3 -3
- package/dist/cdn/components/yoga-list.js.map +3 -3
- package/dist/cdn/roxy-ui.js +84 -72
- package/dist/cdn/roxy-ui.js.map +4 -4
- package/dist/components/astrocartography-map.d.ts +27 -0
- package/dist/components/astrocartography-map.d.ts.map +1 -0
- package/dist/components/astrocartography-map.js +8 -0
- package/dist/components/astrocartography-map.js.map +7 -0
- package/dist/components/divisional-chart.js +22 -22
- package/dist/components/divisional-chart.js.map +1 -1
- package/dist/components/dosha-card.d.ts.map +1 -1
- package/dist/components/dosha-card.js +1 -1
- package/dist/components/dosha-card.js.map +3 -3
- package/dist/components/fixed-stars.d.ts +21 -0
- package/dist/components/fixed-stars.d.ts.map +1 -0
- package/dist/components/fixed-stars.js +2 -0
- package/dist/components/fixed-stars.js.map +7 -0
- package/dist/components/hd-variables.d.ts.map +1 -1
- package/dist/components/hd-variables.js +1 -1
- package/dist/components/hd-variables.js.map +3 -3
- package/dist/components/hexagram.d.ts +3 -1
- package/dist/components/hexagram.d.ts.map +1 -1
- package/dist/components/hexagram.js +1 -1
- package/dist/components/hexagram.js.map +3 -3
- package/dist/components/local-space-compass.d.ts +23 -0
- package/dist/components/local-space-compass.d.ts.map +1 -0
- package/dist/components/local-space-compass.js +8 -0
- package/dist/components/local-space-compass.js.map +7 -0
- package/dist/components/moon-phase.d.ts.map +1 -1
- package/dist/components/moon-phase.js +1 -1
- package/dist/components/moon-phase.js.map +3 -3
- package/dist/components/natal-chart.d.ts +2 -0
- package/dist/components/natal-chart.d.ts.map +1 -1
- package/dist/components/natal-chart.js +6 -6
- package/dist/components/natal-chart.js.map +2 -2
- package/dist/components/positions-table.d.ts +34 -0
- package/dist/components/positions-table.d.ts.map +1 -0
- package/dist/components/positions-table.js +2 -0
- package/dist/components/positions-table.js.map +7 -0
- package/dist/components/profection-card.d.ts +18 -0
- package/dist/components/profection-card.d.ts.map +1 -0
- package/dist/components/profection-card.js +2 -0
- package/dist/components/profection-card.js.map +7 -0
- package/dist/components/reference-card.d.ts.map +1 -1
- package/dist/components/reference-card.js +1 -1
- package/dist/components/reference-card.js.map +3 -3
- package/dist/components/relocation-wheel.d.ts +21 -0
- package/dist/components/relocation-wheel.d.ts.map +1 -0
- package/dist/components/relocation-wheel.js +11 -0
- package/dist/components/relocation-wheel.js.map +7 -0
- package/dist/components/synastry-chart.js +3 -3
- package/dist/components/synastry-chart.js.map +2 -2
- package/dist/components/vedic-kundli.js +14 -14
- package/dist/components/vedic-kundli.js.map +1 -1
- package/dist/components/vedic-planets-table.js +1 -1
- package/dist/components/vedic-planets-table.js.map +1 -1
- package/dist/components/western-planets-table.js +1 -1
- package/dist/components/western-planets-table.js.map +1 -1
- package/dist/components/yoga-list.d.ts +5 -2
- package/dist/components/yoga-list.d.ts.map +1 -1
- package/dist/components/yoga-list.js +1 -1
- package/dist/components/yoga-list.js.map +3 -3
- package/dist/generated/endpoint-bindings.d.ts.map +1 -1
- package/dist/index.cjs +55 -43
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -51
- package/dist/index.js.map +4 -4
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.json +6 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.gen.d.ts +7864 -5381
- package/dist/types/types.gen.d.ts.map +1 -1
- package/dist/utils/degree.d.ts +2 -0
- package/dist/utils/degree.d.ts.map +1 -1
- package/dist/utils/planet-color.d.ts +3 -0
- package/dist/utils/planet-color.d.ts.map +1 -0
- package/dist/utils/world-map.d.ts +8 -0
- package/dist/utils/world-map.d.ts.map +1 -0
- package/dist/version.d.ts +1 -1
- package/package.json +2 -1
- package/src/components/astrocartography-map.ts +442 -0
- package/src/components/dosha-card.ts +48 -16
- package/src/components/fixed-stars.ts +254 -0
- package/src/components/hd-variables.ts +30 -2
- package/src/components/hexagram.ts +11 -11
- package/src/components/local-space-compass.ts +299 -0
- package/src/components/moon-phase.ts +21 -2
- package/src/components/natal-chart.ts +36 -24
- package/src/components/positions-table.ts +442 -0
- package/src/components/profection-card.ts +173 -0
- package/src/components/reference-card.ts +40 -8
- package/src/components/relocation-wheel.ts +170 -0
- package/src/components/yoga-list.ts +95 -2
- package/src/generated/endpoint-bindings.ts +62 -0
- package/src/index.ts +6 -0
- package/src/manifest.ts +79 -0
- package/src/types/index.ts +1 -1
- package/src/types/types.gen.ts +7814 -5263
- package/src/utils/degree.ts +11 -0
- package/src/utils/planet-color.ts +45 -0
- package/src/utils/world-map.ts +8 -0
- package/src/version.ts +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
"use strict";var Zr=Object.defineProperty;var Xa=Object.getOwnPropertyDescriptor;var Wt=Object.getOwnPropertyNames;var Jt=Object.prototype.hasOwnProperty;var Xt=(n,a)=>{for(var e in a)Zr(n,e,{get:a[e],enumerable:!0})},Zt=(n,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of Wt(a))!Jt.call(n,t)&&t!==e&&Zr(n,t,{get:()=>a[t],enumerable:!(r=Xa(a,t))||r.enumerable});return n};var Qt=n=>Zt(Zr({},"__esModule",{value:!0}),n),d=(n,a,e,r)=>{for(var t=r>1?void 0:r?Xa(a,e):a,s=n.length-1,o;s>=0;s--)(o=n[s])&&(t=(r?o(a,e,t):o(t))||t);return r&&t&&Zr(a,e,t),t};var lo={};Xt(lo,{ROXY_COMPONENTS:()=>Na,ROXY_UI_COMPONENTS:()=>io,ROXY_UI_VERSION:()=>Ut,RoxyAngelNumberCard:()=>cr,RoxyAngelNumberLookup:()=>pr,RoxyAshtakavargaGrid:()=>Ie,RoxyAspectsTable:()=>yr,RoxyBiorhythmChart:()=>_e,RoxyBodygraph:()=>xr,RoxyChoghadiyaGrid:()=>hr,RoxyCompatibilityCard:()=>Fe,RoxyCrystalCard:()=>fr,RoxyCrystalGrid:()=>qe,RoxyDashaTimeline:()=>Ve,RoxyData:()=>Ye,RoxyDivisionalChart:()=>We,RoxyDoshaCard:()=>Je,RoxyDreamCard:()=>$r,RoxyDreamSearch:()=>wr,RoxyEndpointForm:()=>ce,RoxyForecastDigest:()=>kr,RoxyForecastTimeline:()=>Sr,RoxyGunaMilan:()=>Rr,RoxyHdConnection:()=>Cr,RoxyHdPenta:()=>Tr,RoxyHdVariables:()=>Er,RoxyHexagram:()=>Xe,RoxyHoraTable:()=>Dr,RoxyHoroscopeCard:()=>Ze,RoxyKpChart:()=>Qe,RoxyKpPlanetsTable:()=>Pr,RoxyKpRulingPlanets:()=>zr,RoxyLocationSearch:()=>ie,RoxyMoonPhase:()=>er,RoxyNakshatraCard:()=>Ar,RoxyNatalChart:()=>je,RoxyNumerologyCard:()=>rr,RoxyPanchangTable:()=>ar,RoxyReferenceCard:()=>Nr,RoxyShadbalaTable:()=>Lr,RoxySynastryChart:()=>Mr,RoxyTarotCard:()=>tr,RoxyTarotCatalog:()=>sr,RoxyTarotSpread:()=>nr,RoxyTransitsTable:()=>ir,RoxyVedicAspects:()=>Gr,RoxyVedicKundli:()=>Ge,RoxyVedicPlanetsTable:()=>Hr,RoxyWesternPlanetsTable:()=>Or,RoxyYogaList:()=>lr,roxyDataScript:()=>rt,serializeRoxyData:()=>La});module.exports=Qt(lo);var G=require("lit"),tt=require("lit/decorators.js");var es=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"money",label:"Money"},{key:"twinFlame",label:"Twin flame"}];function Qr(n,a,e){let r=[];if(n)for(let t of es){let s=n[t.key];s&&r.push({label:t.label,body:s})}return a&&r.push({label:"Biblical",body:a}),e&&r.push({label:"Shadow",body:e}),r}var Be=require("lit"),Se=require("lit/decorators.js"),at=require("lit/directives/if-defined.js");var Za=require("lit"),g=Za.css`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}:host([bare]){--roxy-surface:transparent;--roxy-shadow-sm:none;--roxy-shadow-md:none}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}.roxy-error{gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-lg,1.5rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}.roxy-surface{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var rs="https://roxyapi.com/api/v2",ea=class{constructor(a){this.baseUrl=rs;this.host=a,a.addController(this)}hostDisconnected(){this.abort?.abort(),this.abort=void 0}async run(a){if(!this.submitUrl&&this.secretKeyRefused())return;this.abort?.abort();let e=new AbortController;this.abort=e,this.host.loading=!0,this.host.error=null;try{let r=this.submitUrl?await fetch(this.submitUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a),signal:e.signal}):await this.callApi(a,e.signal);if(!r.ok)throw new Error(await this.readError(r));let t=await r.json();if(e.signal.aborted)return;this.host.data=t}catch(r){if(r?.name==="AbortError")return;this.host.error=r instanceof Error?r.message:String(r)}finally{this.abort===e&&(this.abort=void 0),e.signal.aborted||(this.host.loading=!1)}}callApi(a,e){let r=new URL(`${this.baseUrl}${a.path}`);for(let[s,o]of Object.entries(a.query??{}))o!=null&&r.searchParams.set(s,String(o));let t={Accept:"application/json"};return this.publishableKey&&(t["X-API-Key"]=this.publishableKey),a.body!=null&&(t["Content-Type"]="application/json"),fetch(r,{method:a.method??"GET",headers:t,body:a.body!=null?JSON.stringify(a.body):void 0,signal:e})}secretKeyRefused(){let a=this.publishableKey;return!a||a.startsWith("pk_")?!1:(this.host.error="Client-side components accept a pk_ publishable key only. Use a publishable key with an origin allowlist, or render server-side.",this.host.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key"},bubbles:!0,composed:!0})),!0)}async readError(a){try{let e=await a.json();if(e?.error)return e.error}catch{}return`Request failed (${a.status})`}};function Qa(n,a,e){let r={...e},t=`/${n.replace(/^\//,"")}`.replace(/\{([^}]+)\}/g,(i,l)=>{let c=r[l];return delete r[l],encodeURIComponent(String(c??""))}),s={},o={};for(let[i,l]of Object.entries(r))l===void 0||l===""||(a==="GET"?s[i]=l:o[i]=l);return{path:t,method:a,query:s,body:a==="POST"?o:void 0}}var et="roxy-data";function La(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function rt(n){return`<script type="application/json" class="${et}">${La(n)}</script>`}function as(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var ra=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(as(a)&&a.classList.contains(et))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var m=class extends Be.LitElement{constructor(){super();this.data=null;this.endpoint="";this.method="POST";this.remember=!1;this.loading=!1;this.error=null;this.onFormSubmit=e=>{let r=e.detail;this.remember&&this.writeRemembered(r.values),this.fetcher.run(Qa(this.endpoint,this.method,r.values))};new ra(this),this.fetcher=new ea(this)}static{this.styles=[g]}willUpdate(e){e.has("publishableKey")&&(this.fetcher.publishableKey=this.publishableKey),e.has("baseUrl")&&this.baseUrl&&(this.fetcher.baseUrl=this.baseUrl),e.has("submitUrl")&&(this.fetcher.submitUrl=this.submitUrl)}render(){return this.loading?this.renderLoading():this.error!=null?this.renderError(this.error):this.data!=null?this.renderData(this.data):this.renderNoData()}renderNoData(){return this.endpoint?this.renderForm():this.renderEmpty()}renderForm(){return Be.html`<roxy-endpoint-form data-endpoint="${this.endpoint}" method="${this.method}" spec-url="${(0,at.ifDefined)(this.specUrl)}" .initialValues="${this.remember?this.readRemembered():void 0}" @roxy-submit="${this.onFormSubmit}"></roxy-endpoint-form>`}rememberKey(){return`roxy-ui:form:${this.endpoint}`}readRemembered(){try{let e=sessionStorage.getItem(this.rememberKey());return e?JSON.parse(e):void 0}catch{return}}writeRemembered(e){try{sessionStorage.setItem(this.rememberKey(),JSON.stringify(e))}catch{}}renderEmpty(){return Be.html`<div class="roxy-empty" role="status">No data</div>`}renderLoading(){return Be.html`<div class="roxy-skeleton" style="height:8rem" role="status" aria-label="Loading"></div>`}renderError(e){let r=Be.html`<div class="roxy-error" role="alert">${e}</div>`;return this.endpoint?Be.html`${r}${this.renderForm()}`:r}};d([(0,Se.property)({attribute:!1})],m.prototype,"data",2),d([(0,Se.property)({type:String,attribute:"data-endpoint"})],m.prototype,"endpoint",2),d([(0,Se.property)({type:String})],m.prototype,"method",2),d([(0,Se.property)({type:String,attribute:"publishable-key"})],m.prototype,"publishableKey",2),d([(0,Se.property)({type:String,attribute:"base-url"})],m.prototype,"baseUrl",2),d([(0,Se.property)({type:String,attribute:"spec-url"})],m.prototype,"specUrl",2),d([(0,Se.property)({type:String,attribute:"submit-url"})],m.prototype,"submitUrl",2),d([(0,Se.property)({type:Boolean})],m.prototype,"remember",2),d([(0,Se.state)()],m.prototype,"loading",2),d([(0,Se.state)()],m.prototype,"error",2);var cr=class extends m{renderData(a){let e=(a.energy??"").toLowerCase(),r=e==="positive"||e==="cautionary"||e==="neutral"?e:"",t=a.keywords??[],s=a.actionSteps??[];return G.html`<article class="card" aria-label="${`Angel number ${a.number??""}`}"><div class="hero">${a.number?G.html`<div class="numeral">${a.number}</div>`:G.nothing}<div><p class="label">Angel number</p>${a.title?G.html`<h2 class="title">${a.title}</h2>`:G.nothing}</div></div>${a.coreMessage?G.html`<p class="core">${a.coreMessage}</p>`:G.nothing}<div class="badges">${a.type?G.html`<span class="badge">${a.type}</span>`:G.nothing} ${typeof a.digitRoot=="number"?G.html`<span class="badge">Digit root ${a.digitRoot}</span>`:G.nothing} ${a.energy?G.html`<span class="${`badge ${r}`}">${a.energy}</span>`:G.nothing}</div>${t.length>0?G.html`<div class="chips">${t.map(o=>G.html`<span>${o}</span>`)}</div>`:G.nothing} ${this.renderSections(a)} ${a.affirmation?G.html`<p class="affirmation">${a.affirmation}</p>`:G.nothing} ${s.length>0?G.html`<div class="steps"><h3>Action steps</h3><ul>${s.map(o=>G.html`<li>${o}</li>`)}</ul></div>`:G.nothing}</article>`}renderEmpty(){return G.html`<div class="roxy-empty" role="status">No angel number</div>`}renderSections(a){let e=Qr(a.meaning,a.biblical,a.shadow);return e.length===0?G.nothing:G.html`<div class="sections">${e.map((r,t)=>G.html`<details name="angel-meaning" ?open="${t===0}"><summary>${r.label}</summary><p>${r.body}</p></details>`)}</div>`}};cr.styles=[g,G.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.core{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.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);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;padding:3px 10px;display:inline-flex}.badge.positive{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.cautionary{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.badge.neutral{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.sections{gap:var(--roxy-space-xs,.25rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);display:grid}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.affirmation{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);border-left:3px solid var(--roxy-accent,#f59e0b);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-sm,4px);color:var(--roxy-fg,#0a0a0a);margin:0;font-style:italic}.steps 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}.steps ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);gap:2px;margin:0;display:grid}`],cr=d([(0,tt.customElement)("roxy-angel-number-card")],cr);var $=require("lit"),st=require("lit/decorators.js");var pr=class extends m{renderEmpty(){return $.html`<div class="roxy-empty" role="status">No number analysis</div>`}renderData(a){let e=a.knownMeaning,r=a.digitRootMeaning,t=e?.title??"Number analysis";return $.html`<article class="card" aria-label="${`Number ${a.number??""}`}"><div class="hero">${a.number?$.html`<div class="numeral">${a.number}</div>`:$.nothing}<div><p class="label">Number analysis</p><h2 class="title">${t}</h2></div></div><div class="badges">${a.type?$.html`<span class="badge">${a.type}</span>`:$.nothing} ${typeof a.digits=="number"?$.html`<span class="badge">${a.digits} digits</span>`:$.nothing} ${typeof a.uniqueDigits=="number"?$.html`<span class="badge">${a.uniqueDigits} unique</span>`:$.nothing} ${typeof a.digitRoot=="number"?$.html`<span class="badge">Digit root ${a.digitRoot}</span>`:$.nothing} ${a.isPalindrome?$.html`<span class="badge flag">Palindrome</span>`:$.nothing} ${a.isRepeating?$.html`<span class="badge flag">Repeating</span>`:$.nothing}</div>${e?$.html`<div class="section"><p class="label">Known angel number</p>${e.coreMessage?$.html`<p>${e.coreMessage}</p>`:$.nothing} ${e.keywords&&e.keywords.length>0?$.html`<div class="chips">${e.keywords.map(s=>$.html`<span>${s}</span>`)}</div>`:$.nothing} ${this.renderMeaning(e.meaning,e.biblical,e.shadow)} ${e.affirmation?$.html`<p><em>${e.affirmation}</em></p>`:$.nothing}</div>`:$.nothing} ${r?$.html`<div class="section"><p class="label">Foundational digit root${r.number?` (${r.number})`:""}</p>${r.title?$.html`<h3>${r.title}</h3>`:$.nothing} ${r.coreMessage?$.html`<p>${r.coreMessage}</p>`:$.nothing} ${e?$.nothing:this.renderRootMeaning(r)}</div>`:$.nothing}</article>`}renderMeaning(a,e,r){let t=Qr(a,e,r);return t.length===0?$.nothing:$.html`${t.map((s,o)=>$.html`<details name="lookup-meaning" ?open="${o===0}"><summary>${s.label}</summary><p>${s.body}</p></details>`)}`}renderRootMeaning(a){return $.html`${a.keywords&&a.keywords.length>0?$.html`<div class="chips">${a.keywords.map(e=>$.html`<span>${e}</span>`)}</div>`:$.nothing}${this.renderMeaning(a.meaning)}${a.affirmation?$.html`<p><em>${a.affirmation}</em></p>`:$.nothing}`}};pr.styles=[g,$.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{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) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;align-items:center;padding:3px 10px;display:inline-flex}.badge.flag{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.section>.label{margin:0}.section h3{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.section p{color:var(--roxy-fg,#0a0a0a);line-height:1.6;font-size:var(--roxy-text-sm,.875rem);margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem)}`],pr=d([(0,st.customElement)("roxy-angel-number-lookup")],pr);var re=require("lit"),ta=require("lit/decorators.js");var N={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},ot={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},pe={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},aa={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},te=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],Po=te.map(n=>n.toLowerCase()),Yr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},Ma={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},nt={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var ts={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},mr=["sarva","bhinna","pinda"],Ie=class extends m{constructor(){super(...arguments);this.activeTab="sarva"}renderEmpty(){return re.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`}renderData(e){let r=e.signs??[];return re.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${r.length?re.html`<p class="subtitle">${r.length} signs</p>`:re.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${mr.map(t=>re.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${ts[t]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(r):this.activeTab==="bhinna"?this.renderBhinna(r):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=mr.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=mr[(r+1)%mr.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=mr[(r-1+mr.length)%mr.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?re.html`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,s)=>{let o=r.bindus[s]??0,i=this.sarvaHeat(o);return re.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${pe[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${o}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:re.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?re.html`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>re.html`<th scope="col" title="${t}">${pe[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>re.html`<tr><td>${t.planet}</td>${t.bindus.map(s=>{let o=this.bhinnaHeat(s);return re.html`<td class="${`heat-cell ${o}`}">${s}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:re.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?re.html`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>re.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:re.html`<p class="roxy-empty">No shodhya pinda data</p>`}};Ie.styles=[g,re.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([(0,ta.state)()],Ie.prototype,"activeTab",2),Ie=d([(0,ta.customElement)("roxy-ashtakavarga-grid")],Ie);var v=require("lit"),lt=require("lit/decorators.js");var sa=require("lit");function Re(){return sa.html`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var Ke=sa.css`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;function Ne(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,r=new Date(e);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Ce(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Ga(n){if(!n)return"";let a=Ne(n.start),e=Ne(n.end);return a&&e?`${a} - ${e}`:a||e||""}function f(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function it(n,a=1){let e=f(n,a);return e?`${e}%`:""}var gr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function jr(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}function h(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function Y(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var yr=class extends m{renderEmpty(){return v.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e="aspects"in a?a.aspects??[]:[],r="patterns"in a?a.patterns??[]:[],t="summary"in a?a.summary:void 0;return e.length===0&&r.length===0?this.renderEmpty():v.html`<div class="wrap" aria-label="Aspects"><div class="head"><h2 class="title">Aspects</h2>${e.length>0?v.html`<p class="subtitle">${e.length} aspects</p>`:v.nothing}</div>${t?this.renderSummary(t):v.nothing} ${e.length>0?v.html`<div role="list" aria-label="Aspect list">${e.map((s,o)=>this.renderAspect(s,o))}</div>`:v.nothing} ${r.length>0?v.html`<div><p class="section-label">Patterns</p>${r.map(s=>this.renderPattern(s))}</div>`:v.nothing}</div>`}renderSummary(a){let e="totalAspects"in a?a.totalAspects:a.total;return v.html`<div class="summary-pills" role="region" aria-label="Aspect summary">${typeof e=="number"?v.html`<span class="pill pill--muted">Total: ${e}</span>`:v.nothing} <span class="pill pill--success">Harmonious: ${a.harmonious}</span> <span class="pill pill--danger">Challenging: ${a.challenging}</span> <span class="pill pill--muted">Neutral: ${a.neutral}</span></div>`}renderAspect(a,e){let r=N[h(a.planet1)]??"",t=N[h(a.planet2)]??"",s=(a.interpretation??"neutral").toLowerCase(),o=(a.type??"").toLowerCase().replace(/_/g," "),i=a.isApplying?"Applying":"Separating",l="meaning"in a?a.meaning:void 0,c="transitInterpretation"in a?a.transitInterpretation:void 0,p=!!(l||c),y=v.html`<span aria-hidden="true" class="glyph">${r}</span>${a.planet1} <span class="nature-badge ${s}">${o}</span> <span aria-hidden="true" class="glyph">${t}</span>${a.planet2} <span class="meta">${i} · orb ${f(a.orb,2)}° · str ${f(a.strength,0)}</span>`;return p?v.html`<details class="aspect-card" role="listitem" name="aspects" ?open="${e===0}"><summary>${y}${Re()}</summary><div class="interp-body">${l?this.renderMeaning(l):v.nothing} ${c?this.renderTransit(c):v.nothing}</div></details>`:v.html`<div class="aspect-card" role="listitem"><div class="summary" style="cursor:default">${y}</div></div>`}renderMeaning(a){let e=a.description?.short??a.description?.long;return v.html`${e?v.html`<p>${e}</p>`:v.nothing} ${a.keywords?.length?v.html`<div class="interp-keywords">${a.keywords.map(r=>v.html`<span class="kw">${r}</span>`)}</div>`:v.nothing}`}renderTransit(a){return v.html`${a.summary?v.html`<p>${a.summary}</p>`:v.nothing} ${a.impact?v.html`<p><strong>Impact:</strong> ${a.impact}</p>`:v.nothing} ${a.timing?v.html`<p><strong>Timing:</strong> ${a.timing}</p>`:v.nothing} ${a.guidance?v.html`<p><strong>Guidance:</strong> ${a.guidance}</p>`:v.nothing} ${a.keywords?.length?v.html`<div class="interp-keywords">${a.keywords.map(e=>v.html`<span class="kw">${e}</span>`)}</div>`:v.nothing}`}renderPattern(a){let e=a.planets??[];return v.html`<div class="pattern"><div class="pattern-head"><span class="pattern-name">${a.name??a.kind??"Pattern"}</span> ${e.length?v.html`<span class="pattern-planets">${e.join(", ")}</span>`:v.nothing} ${typeof a.tightness=="number"?v.html`<span class="pattern-tight">${f(a.tightness,0)}% tight</span>`:v.nothing}</div>${a.interpretation?v.html`<p class="pattern-interp">${a.interpretation}</p>`:v.nothing}</div>`}};yr.styles=[g,Ke,v.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.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)}.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}.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}.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}.interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.glyph{font-size:1.1em;line-height:1}.nature-badge{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;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)}.pattern{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);gap:.35rem;display:grid}.pattern-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.pattern-name{font-weight:var(--roxy-weight-bold,600)}.pattern-planets{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}.pattern-tight{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.pattern-interp{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0;line-height:1.45}`],yr=d([(0,lt.customElement)("roxy-aspects-table")],yr);var ee=require("lit"),oa=require("lit/decorators.js");var dt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},_e=class extends m{constructor(){super(...arguments);this.mode="daily"}renderEmpty(){return ee.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderData(e){return this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e)}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([s,o])=>{let i=typeof o=="number"?o:0,l=Math.abs(i)>1?i/100:i;return[s,l]});return ee.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?ee.html`<span class="energy">Energy ${e.energyRating}/10</span>`:ee.nothing}</header><div class="bars" role="list">${t.map(([s,o])=>{let i=(o+1)/2*100,l=dt[s]??"var(--roxy-accent, #f59e0b)";return ee.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${s}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(o*100)}%</span></div>`})}</div>${e.dailyMessage?ee.html`<p class="advice">${e.dailyMessage}</p>`:ee.nothing} ${e.advice?ee.html`<p class="advice">${e.advice}</p>`:ee.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return ee.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,s=160,o=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return ee.html`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${s}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${s/2}" x2="${t}" y2="${s/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((y,x)=>{let j=y[l]??0,b=x*o,dr=s/2-j/100*(s/2-8);return`${b.toFixed(2)},${dr.toFixed(2)}`}).join(" "),p=dt[l]??"#475569";return ee.svg`<polyline points=${c} fill="none" stroke=${p} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?ee.html`<p class="advice">${e.summary.periodAdvice}</p>`:ee.nothing}</section>`}renderCritical(e){return ee.html`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>ee.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};_e.styles=[g,ee.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,600px);height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([(0,oa.property)({type:String,reflect:!0})],_e.prototype,"mode",2),_e=d([(0,oa.customElement)("roxy-biorhythm-chart")],_e);var U=require("lit"),xt=require("lit/decorators.js");var Te=require("lit"),la=4,da=9,pt=(100+2*da)*la,ss=(100+2*da)*la;function fe(n,a){return{x:(n+da)*la,y:(a+da)*la}}var Ur=50,Ba=n=>2*Ur-n,Ha={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},os={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function ns(){let n={},a={};for(let[e,[r,t]]of Object.entries(Ha.spleen))Ha["solar-plexus"][os[Number(e)]]=[Ba(r),t];for(let[e,r]of Object.entries(Ha))for(let[t,[s,o]]of Object.entries(r))n[Number(t)]=fe(s,o),a[Number(t)]=e;return{points:n,centerOf:a}}var{points:ja,centerOf:Zo}=ns(),Qo=pt/2;function ur(n){return n.map(([a,e])=>fe(a,e))}function Oa(n,a,e){return ur([[Ur-n,a],[Ur+n,a],[Ur+n,e],[Ur-n,e]])}var ct=[[18.4,68],[18.4,81.8],[34.7,74.9]],is=[{id:"head",label:"Head",color:"gold",points:ur([[40,14.3],[60,14.3],[50,6]]),labelAnchor:fe(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:ur([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:fe(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Oa(9.5,30.4,43.6),labelAnchor:fe(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:ur([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:fe(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:ur([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:fe(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:ur(ct),labelAnchor:fe(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Oa(9.5,70.6,83.6),labelAnchor:fe(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:ur(ct.map(([n,a])=>[Ba(n),a])),labelAnchor:fe(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Oa(9.5,87.9,99.9),labelAnchor:fe(50,103),labelAlign:"middle"}],ls=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],ds=cs();function cs(){let n=Ba,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${na(a[0])}`];for(let r=1;r+2<a.length;r+=3)e.push(`C ${na(a[r])} ${na(a[r+1])} ${na(a[r+2])}`);e.push(`L ${ia(a[a.length-1],n)}`);for(let r=a.length-3;r>=1;r-=3)e.push(`C ${ia(a[r+1],n)} ${ia(a[r],n)} ${ia(a[r-1],n)}`);return e.push("Z"),e.join(" ")}function na([n,a]){let e=fe(n,a);return`${e.x} ${e.y}`}function ia([n,a],e){let r=fe(e(n),a);return`${r.x} ${r.y}`}function ps(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function mt(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function ms(){return Te.svg`<path class="bg-body" d=${ds} />`}function gs(n,a){let e=[];for(let[r,t]of ls){let s=ja[r],o=ja[t];if(!s||!o)continue;if(e.push(Te.svg`<line class="bg-channel" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`),n.has(mt(r,t))){e.push(Te.svg`<line class="bg-channel on" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`);continue}let i={x:(s.x+o.x)/2,y:(s.y+o.y)/2};a.has(r)&&e.push(Te.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`),a.has(t)&&e.push(Te.svg`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`)}return e}function ys(n,a,e){let r=e.x-a.x,t=e.y-a.y,s=r*r+t*t;if(s===0)return a;let o=Math.max(0,Math.min(1,((n.x-a.x)*r+(n.y-a.y)*t)/s));return{x:a.x+o*r,y:a.y+o*t}}function us(n,a){let e=a[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<a.length;t++){let s=ys(n,a[t],a[(t+1)%a.length]),o=(s.x-n.x)**2+(s.y-n.y)**2;o<r&&(r=o,e=s)}return e}function xs(n){return is.map(a=>{let e=n.has(a.id),r=`bg-center bg-${a.color}${e?" defined":""}`,t=us(a.labelAnchor,a.points);return Te.svg`<g>
|
|
1
|
+
"use strict";var fa=Object.defineProperty;var vt=Object.getOwnPropertyDescriptor;var As=Object.getOwnPropertyNames;var Ps=Object.prototype.hasOwnProperty;var Ds=(n,a)=>{for(var e in a)fa(n,e,{get:a[e],enumerable:!0})},Ns=(n,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of As(a))!Ps.call(n,t)&&t!==e&&fa(n,t,{get:()=>a[t],enumerable:!(r=vt(a,t))||r.enumerable});return n};var Gs=n=>Ns(fa({},"__esModule",{value:!0}),n),d=(n,a,e,r)=>{for(var t=r>1?void 0:r?vt(a,e):a,s=n.length-1,o;s>=0;s--)(o=n[s])&&(t=(r?o(a,e,t):o(t))||t);return r&&t&&fa(a,e,t),t};var Qo={};Ds(Qo,{ROXY_COMPONENTS:()=>at,ROXY_UI_COMPONENTS:()=>Xo,ROXY_UI_VERSION:()=>Es,RoxyAngelNumberCard:()=>br,RoxyAngelNumberLookup:()=>vr,RoxyAshtakavargaGrid:()=>Je,RoxyAspectsTable:()=>kr,RoxyAstrocartographyMap:()=>Rr,RoxyBiorhythmChart:()=>Xe,RoxyBodygraph:()=>Mr,RoxyChoghadiyaGrid:()=>zr,RoxyCompatibilityCard:()=>Qe,RoxyCrystalCard:()=>Tr,RoxyCrystalGrid:()=>er,RoxyDashaTimeline:()=>rr,RoxyData:()=>ar,RoxyDivisionalChart:()=>sr,RoxyDoshaCard:()=>or,RoxyDreamCard:()=>Pr,RoxyDreamSearch:()=>Dr,RoxyEndpointForm:()=>Le,RoxyFixedStars:()=>Nr,RoxyForecastDigest:()=>Gr,RoxyForecastTimeline:()=>Hr,RoxyGunaMilan:()=>Or,RoxyHdConnection:()=>jr,RoxyHdPenta:()=>Br,RoxyHdVariables:()=>Ir,RoxyHexagram:()=>nr,RoxyHoraTable:()=>_r,RoxyHoroscopeCard:()=>ir,RoxyKpChart:()=>lr,RoxyKpPlanetsTable:()=>Kr,RoxyKpRulingPlanets:()=>Fr,RoxyLocalSpaceCompass:()=>Zr,RoxyLocationSearch:()=>ue,RoxyMoonPhase:()=>dr,RoxyNakshatraCard:()=>Yr,RoxyNatalChart:()=>Fe,RoxyNumerologyCard:()=>cr,RoxyPanchangTable:()=>pr,RoxyPositionsTable:()=>mr,RoxyProfectionCard:()=>qr,RoxyReferenceCard:()=>Ur,RoxyRelocationWheel:()=>Wr,RoxyShadbalaTable:()=>Jr,RoxySynastryChart:()=>Xr,RoxyTarotCard:()=>gr,RoxyTarotCatalog:()=>yr,RoxyTarotSpread:()=>xr,RoxyTransitsTable:()=>hr,RoxyVedicAspects:()=>Qr,RoxyVedicKundli:()=>Ze,RoxyVedicPlanetsTable:()=>ea,RoxyWesternPlanetsTable:()=>ra,RoxyYogaList:()=>Lr,roxyDataScript:()=>St,serializeRoxyData:()=>tt});module.exports=Gs(Qo);var B=require("lit"),Ct=require("lit/decorators.js");var Hs=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"money",label:"Money"},{key:"twinFlame",label:"Twin flame"}];function ba(n,a,e){let r=[];if(n)for(let t of Hs){let s=n[t.key];s&&r.push({label:t.label,body:s})}return a&&r.push({label:"Biblical",body:a}),e&&r.push({label:"Shadow",body:e}),r}var We=require("lit"),Ae=require("lit/decorators.js"),Rt=require("lit/directives/if-defined.js");var $t=require("lit"),y=$t.css`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}:host([bare]){--roxy-surface:transparent;--roxy-shadow-sm:none;--roxy-shadow-md:none}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}.roxy-error{gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-lg,1.5rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}.roxy-surface{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var Os="https://roxyapi.com/api/v2",va=class{constructor(a){this.baseUrl=Os;this.host=a,a.addController(this)}hostDisconnected(){this.abort?.abort(),this.abort=void 0}async run(a){if(!this.submitUrl&&this.secretKeyRefused())return;this.abort?.abort();let e=new AbortController;this.abort=e,this.host.loading=!0,this.host.error=null;try{let r=this.submitUrl?await fetch(this.submitUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a),signal:e.signal}):await this.callApi(a,e.signal);if(!r.ok)throw new Error(await this.readError(r));let t=await r.json();if(e.signal.aborted)return;this.host.data=t}catch(r){if(r?.name==="AbortError")return;this.host.error=r instanceof Error?r.message:String(r)}finally{this.abort===e&&(this.abort=void 0),e.signal.aborted||(this.host.loading=!1)}}callApi(a,e){let r=new URL(`${this.baseUrl}${a.path}`);for(let[s,o]of Object.entries(a.query??{}))o!=null&&r.searchParams.set(s,String(o));let t={Accept:"application/json"};return this.publishableKey&&(t["X-API-Key"]=this.publishableKey),a.body!=null&&(t["Content-Type"]="application/json"),fetch(r,{method:a.method??"GET",headers:t,body:a.body!=null?JSON.stringify(a.body):void 0,signal:e})}secretKeyRefused(){let a=this.publishableKey;return!a||a.startsWith("pk_")?!1:(this.host.error="Client-side components accept a pk_ publishable key only. Use a publishable key with an origin allowlist, or render server-side.",this.host.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key"},bubbles:!0,composed:!0})),!0)}async readError(a){try{let e=await a.json();if(e?.error)return e.error}catch{}return`Request failed (${a.status})`}};function wt(n,a,e){let r={...e},t=`/${n.replace(/^\//,"")}`.replace(/\{([^}]+)\}/g,(i,l)=>{let c=r[l];return delete r[l],encodeURIComponent(String(c??""))}),s={},o={};for(let[i,l]of Object.entries(r))l===void 0||l===""||(a==="GET"?s[i]=l:o[i]=l);return{path:t,method:a,query:s,body:a==="POST"?o:void 0}}var kt="roxy-data";function tt(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function St(n){return`<script type="application/json" class="${kt}">${tt(n)}</script>`}function js(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var $a=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(js(a)&&a.classList.contains(kt))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var m=class extends We.LitElement{constructor(){super();this.data=null;this.endpoint="";this.method="POST";this.remember=!1;this.loading=!1;this.error=null;this.onFormSubmit=e=>{let r=e.detail;this.remember&&this.writeRemembered(r.values),this.fetcher.run(wt(this.endpoint,this.method,r.values))};new $a(this),this.fetcher=new va(this)}static{this.styles=[y]}willUpdate(e){e.has("publishableKey")&&(this.fetcher.publishableKey=this.publishableKey),e.has("baseUrl")&&this.baseUrl&&(this.fetcher.baseUrl=this.baseUrl),e.has("submitUrl")&&(this.fetcher.submitUrl=this.submitUrl)}render(){return this.loading?this.renderLoading():this.error!=null?this.renderError(this.error):this.data!=null?this.renderData(this.data):this.renderNoData()}renderNoData(){return this.endpoint?this.renderForm():this.renderEmpty()}renderForm(){return We.html`<roxy-endpoint-form data-endpoint="${this.endpoint}" method="${this.method}" spec-url="${(0,Rt.ifDefined)(this.specUrl)}" .initialValues="${this.remember?this.readRemembered():void 0}" @roxy-submit="${this.onFormSubmit}"></roxy-endpoint-form>`}rememberKey(){return`roxy-ui:form:${this.endpoint}`}readRemembered(){try{let e=sessionStorage.getItem(this.rememberKey());return e?JSON.parse(e):void 0}catch{return}}writeRemembered(e){try{sessionStorage.setItem(this.rememberKey(),JSON.stringify(e))}catch{}}renderEmpty(){return We.html`<div class="roxy-empty" role="status">No data</div>`}renderLoading(){return We.html`<div class="roxy-skeleton" style="height:8rem" role="status" aria-label="Loading"></div>`}renderError(e){let r=We.html`<div class="roxy-error" role="alert">${e}</div>`;return this.endpoint?We.html`${r}${this.renderForm()}`:r}};d([(0,Ae.property)({attribute:!1})],m.prototype,"data",2),d([(0,Ae.property)({type:String,attribute:"data-endpoint"})],m.prototype,"endpoint",2),d([(0,Ae.property)({type:String})],m.prototype,"method",2),d([(0,Ae.property)({type:String,attribute:"publishable-key"})],m.prototype,"publishableKey",2),d([(0,Ae.property)({type:String,attribute:"base-url"})],m.prototype,"baseUrl",2),d([(0,Ae.property)({type:String,attribute:"spec-url"})],m.prototype,"specUrl",2),d([(0,Ae.property)({type:String,attribute:"submit-url"})],m.prototype,"submitUrl",2),d([(0,Ae.property)({type:Boolean})],m.prototype,"remember",2),d([(0,Ae.state)()],m.prototype,"loading",2),d([(0,Ae.state)()],m.prototype,"error",2);var br=class extends m{renderData(a){let e=(a.energy??"").toLowerCase(),r=e==="positive"||e==="cautionary"||e==="neutral"?e:"",t=a.keywords??[],s=a.actionSteps??[];return B.html`<article class="card" aria-label="${`Angel number ${a.number??""}`}"><div class="hero">${a.number?B.html`<div class="numeral">${a.number}</div>`:B.nothing}<div><p class="label">Angel number</p>${a.title?B.html`<h2 class="title">${a.title}</h2>`:B.nothing}</div></div>${a.coreMessage?B.html`<p class="core">${a.coreMessage}</p>`:B.nothing}<div class="badges">${a.type?B.html`<span class="badge">${a.type}</span>`:B.nothing} ${typeof a.digitRoot=="number"?B.html`<span class="badge">Digit root ${a.digitRoot}</span>`:B.nothing} ${a.energy?B.html`<span class="${`badge ${r}`}">${a.energy}</span>`:B.nothing}</div>${t.length>0?B.html`<div class="chips">${t.map(o=>B.html`<span>${o}</span>`)}</div>`:B.nothing} ${this.renderSections(a)} ${a.affirmation?B.html`<p class="affirmation">${a.affirmation}</p>`:B.nothing} ${s.length>0?B.html`<div class="steps"><h3>Action steps</h3><ul>${s.map(o=>B.html`<li>${o}</li>`)}</ul></div>`:B.nothing}</article>`}renderEmpty(){return B.html`<div class="roxy-empty" role="status">No angel number</div>`}renderSections(a){let e=ba(a.meaning,a.biblical,a.shadow);return e.length===0?B.nothing:B.html`<div class="sections">${e.map((r,t)=>B.html`<details name="angel-meaning" ?open="${t===0}"><summary>${r.label}</summary><p>${r.body}</p></details>`)}</div>`}};br.styles=[y,B.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.core{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.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);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;padding:3px 10px;display:inline-flex}.badge.positive{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.cautionary{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.badge.neutral{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.sections{gap:var(--roxy-space-xs,.25rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);display:grid}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.affirmation{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);border-left:3px solid var(--roxy-accent,#f59e0b);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-sm,4px);color:var(--roxy-fg,#0a0a0a);margin:0;font-style:italic}.steps 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}.steps ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);gap:2px;margin:0;display:grid}`],br=d([(0,Ct.customElement)("roxy-angel-number-card")],br);var v=require("lit"),Mt=require("lit/decorators.js");var vr=class extends m{renderEmpty(){return v.html`<div class="roxy-empty" role="status">No number analysis</div>`}renderData(a){let e=a.knownMeaning,r=a.digitRootMeaning,t=e?.title??"Number analysis";return v.html`<article class="card" aria-label="${`Number ${a.number??""}`}"><div class="hero">${a.number?v.html`<div class="numeral">${a.number}</div>`:v.nothing}<div><p class="label">Number analysis</p><h2 class="title">${t}</h2></div></div><div class="badges">${a.type?v.html`<span class="badge">${a.type}</span>`:v.nothing} ${typeof a.digits=="number"?v.html`<span class="badge">${a.digits} digits</span>`:v.nothing} ${typeof a.uniqueDigits=="number"?v.html`<span class="badge">${a.uniqueDigits} unique</span>`:v.nothing} ${typeof a.digitRoot=="number"?v.html`<span class="badge">Digit root ${a.digitRoot}</span>`:v.nothing} ${a.isPalindrome?v.html`<span class="badge flag">Palindrome</span>`:v.nothing} ${a.isRepeating?v.html`<span class="badge flag">Repeating</span>`:v.nothing}</div>${e?v.html`<div class="section"><p class="label">Known angel number</p>${e.coreMessage?v.html`<p>${e.coreMessage}</p>`:v.nothing} ${e.keywords&&e.keywords.length>0?v.html`<div class="chips">${e.keywords.map(s=>v.html`<span>${s}</span>`)}</div>`:v.nothing} ${this.renderMeaning(e.meaning,e.biblical,e.shadow)} ${e.affirmation?v.html`<p><em>${e.affirmation}</em></p>`:v.nothing}</div>`:v.nothing} ${r?v.html`<div class="section"><p class="label">Foundational digit root${r.number?` (${r.number})`:""}</p>${r.title?v.html`<h3>${r.title}</h3>`:v.nothing} ${r.coreMessage?v.html`<p>${r.coreMessage}</p>`:v.nothing} ${e?v.nothing:this.renderRootMeaning(r)}</div>`:v.nothing}</article>`}renderMeaning(a,e,r){let t=ba(a,e,r);return t.length===0?v.nothing:v.html`${t.map((s,o)=>v.html`<details name="lookup-meaning" ?open="${o===0}"><summary>${s.label}</summary><p>${s.body}</p></details>`)}`}renderRootMeaning(a){return v.html`${a.keywords&&a.keywords.length>0?v.html`<div class="chips">${a.keywords.map(e=>v.html`<span>${e}</span>`)}</div>`:v.nothing}${this.renderMeaning(a.meaning)}${a.affirmation?v.html`<p><em>${a.affirmation}</em></p>`:v.nothing}`}};vr.styles=[y,v.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{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) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;align-items:center;padding:3px 10px;display:inline-flex}.badge.flag{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.section>.label{margin:0}.section h3{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.section p{color:var(--roxy-fg,#0a0a0a);line-height:1.6;font-size:var(--roxy-text-sm,.875rem);margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem)}`],vr=d([(0,Mt.customElement)("roxy-angel-number-lookup")],vr);var ie=require("lit"),ka=require("lit/decorators.js");var C={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},zt={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},ae={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},wa={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},de=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],vn=de.map(n=>n.toLowerCase()),pa={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},st={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},ma={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var Bs={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},$r=["sarva","bhinna","pinda"],Je=class extends m{constructor(){super(...arguments);this.activeTab="sarva"}renderEmpty(){return ie.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`}renderData(e){let r=e.signs??[];return ie.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${r.length?ie.html`<p class="subtitle">${r.length} signs</p>`:ie.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${$r.map(t=>ie.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${Bs[t]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(r):this.activeTab==="bhinna"?this.renderBhinna(r):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=$r.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=$r[(r+1)%$r.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=$r[(r-1+$r.length)%$r.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?ie.html`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,s)=>{let o=r.bindus[s]??0,i=this.sarvaHeat(o);return ie.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${ae[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${o}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:ie.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?ie.html`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>ie.html`<th scope="col" title="${t}">${ae[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>ie.html`<tr><td>${t.planet}</td>${t.bindus.map(s=>{let o=this.bhinnaHeat(s);return ie.html`<td class="${`heat-cell ${o}`}">${s}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:ie.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?ie.html`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>ie.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:ie.html`<p class="roxy-empty">No shodhya pinda data</p>`}};Je.styles=[y,ie.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([(0,ka.state)()],Je.prototype,"activeTab",2),Je=d([(0,ka.customElement)("roxy-ashtakavarga-grid")],Je);var b=require("lit"),Et=require("lit/decorators.js");var Sa=require("lit");function le(){return Sa.html`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var we=Sa.css`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;function _e(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,r=new Date(e);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Pe(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function ot(n){if(!n)return"";let a=_e(n.start),e=_e(n.end);return a&&e?`${a} - ${e}`:a||e||""}function L(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function Tt(n,a=1){let e=L(n,a);return e?`${e}%`:""}var wr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function aa(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}function u(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function W(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var kr=class extends m{renderEmpty(){return b.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e="aspects"in a?a.aspects??[]:[],r="patterns"in a?a.patterns??[]:[],t="summary"in a?a.summary:void 0;return e.length===0&&r.length===0?this.renderEmpty():b.html`<div class="wrap" aria-label="Aspects"><div class="head"><h2 class="title">Aspects</h2>${e.length>0?b.html`<p class="subtitle">${e.length} aspects</p>`:b.nothing}</div>${t?this.renderSummary(t):b.nothing} ${e.length>0?b.html`<div role="list" aria-label="Aspect list">${e.map((s,o)=>this.renderAspect(s,o))}</div>`:b.nothing} ${r.length>0?b.html`<div><p class="section-label">Patterns</p>${r.map(s=>this.renderPattern(s))}</div>`:b.nothing}</div>`}renderSummary(a){let e="totalAspects"in a?a.totalAspects:a.total;return b.html`<div class="summary-pills" role="region" aria-label="Aspect summary">${typeof e=="number"?b.html`<span class="pill pill--muted">Total: ${e}</span>`:b.nothing} <span class="pill pill--success">Harmonious: ${a.harmonious}</span> <span class="pill pill--danger">Challenging: ${a.challenging}</span> <span class="pill pill--muted">Neutral: ${a.neutral}</span></div>`}renderAspect(a,e){let r=C[u(a.planet1)]??"",t=C[u(a.planet2)]??"",s=(a.interpretation??"neutral").toLowerCase(),o=(a.type??"").toLowerCase().replace(/_/g," "),i=a.isApplying?"Applying":"Separating",l="meaning"in a?a.meaning:void 0,c="transitInterpretation"in a?a.transitInterpretation:void 0,p=!!(l||c),g=b.html`<span aria-hidden="true" class="glyph">${r}</span>${a.planet1} <span class="nature-badge ${s}">${o}</span> <span aria-hidden="true" class="glyph">${t}</span>${a.planet2} <span class="meta">${i} · orb ${L(a.orb,2)}° · str ${L(a.strength,0)}</span>`;return p?b.html`<details class="aspect-card" role="listitem" name="aspects" ?open="${e===0}"><summary>${g}${le()}</summary><div class="interp-body">${l?this.renderMeaning(l):b.nothing} ${c?this.renderTransit(c):b.nothing}</div></details>`:b.html`<div class="aspect-card" role="listitem"><div class="summary" style="cursor:default">${g}</div></div>`}renderMeaning(a){let e=a.description?.short??a.description?.long;return b.html`${e?b.html`<p>${e}</p>`:b.nothing} ${a.keywords?.length?b.html`<div class="interp-keywords">${a.keywords.map(r=>b.html`<span class="kw">${r}</span>`)}</div>`:b.nothing}`}renderTransit(a){return b.html`${a.summary?b.html`<p>${a.summary}</p>`:b.nothing} ${a.impact?b.html`<p><strong>Impact:</strong> ${a.impact}</p>`:b.nothing} ${a.timing?b.html`<p><strong>Timing:</strong> ${a.timing}</p>`:b.nothing} ${a.guidance?b.html`<p><strong>Guidance:</strong> ${a.guidance}</p>`:b.nothing} ${a.keywords?.length?b.html`<div class="interp-keywords">${a.keywords.map(e=>b.html`<span class="kw">${e}</span>`)}</div>`:b.nothing}`}renderPattern(a){let e=a.planets??[];return b.html`<div class="pattern"><div class="pattern-head"><span class="pattern-name">${a.name??a.kind??"Pattern"}</span> ${e.length?b.html`<span class="pattern-planets">${e.join(", ")}</span>`:b.nothing} ${typeof a.tightness=="number"?b.html`<span class="pattern-tight">${L(a.tightness,0)}% tight</span>`:b.nothing}</div>${a.interpretation?b.html`<p class="pattern-interp">${a.interpretation}</p>`:b.nothing}</div>`}};kr.styles=[y,we,b.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.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)}.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}.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}.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}.interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.glyph{font-size:1.1em;line-height:1}.nature-badge{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;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)}.pattern{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);gap:.35rem;display:grid}.pattern-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.pattern-name{font-weight:var(--roxy-weight-bold,600)}.pattern-planets{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}.pattern-tight{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.pattern-interp{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0;line-height:1.45}`],kr=d([(0,Et.customElement)("roxy-aspects-table")],kr);var E=require("lit"),jt=require("lit/decorators.js");var Is={Sun:"var(--roxy-accent)",Moon:"var(--roxy-secondary)",Mercury:"var(--roxy-info)",Venus:"var(--roxy-success)",Mars:"var(--roxy-danger)",Jupiter:"var(--roxy-warning)",Saturn:"var(--roxy-muted)",Uranus:"var(--roxy-info-fg)",Neptune:"var(--roxy-success-fg)",Pluto:"var(--roxy-danger-fg)"},At=["var(--roxy-accent)","var(--roxy-info)","var(--roxy-success)","var(--roxy-danger)","var(--roxy-warning)","var(--roxy-secondary)","var(--roxy-info-fg)","var(--roxy-success-fg)","var(--roxy-danger-fg)","var(--roxy-accent-ink)","var(--roxy-warning-fg)","var(--roxy-primary)"];function Sr(n,a=0){return Is[u(n)]??At[a%At.length]??"var(--roxy-accent)"}var Pt="M120 170L120 171L118 171L116 171L114 171L114 170L116 170L118 170L119 170L120 170ZM21 169L19 170L18 169L17 169L16 169L17 168L19 168L20 169L21 169ZM135 168L136 168L137 169L137 170L135 170L133 171L132 171L130 171L127 171L126 171L126 170L128 170L129 170L130 169L131 168L132 168L133 168L135 168ZM59 164L60 164L61 163L61 164L60 164L58 164L57 164L58 163L59 164ZM54 163L56 164L55 164L54 164L53 163L54 163ZM81 162L82 162L83 162L84 163L83 162L82 162L81 162L79 163L78 162L80 162L81 162ZM112 161L111 162L110 162L109 163L108 162L107 162L106 162L105 162L106 161L107 161L108 161L108 160L109 159L110 159L111 160L111 161L112 161ZM121 154L120 154L119 154L119 155L118 155L117 155L117 156L118 156L117 156L116 157L115 157L114 158L115 158L115 159L116 159L117 159L117 160L118 160L118 161L119 162L119 163L119 164L118 164L117 165L116 165L114 166L113 166L112 166L110 166L109 167L108 167L106 167L104 167L103 167L105 167L106 168L105 168L104 168L102 168L102 169L103 170L105 170L107 170L109 171L110 171L112 171L114 171L117 172L118 172L120 172L121 173L122 173L123 173L125 173L126 172L128 172L130 172L133 172L135 172L137 172L138 172L139 171L142 171L144 171L146 171L148 171L150 171L151 170L150 170L150 169L148 169L146 169L144 169L144 168L145 168L146 168L148 168L149 167L150 167L151 167L152 166L154 166L155 166L156 166L158 166L159 166L160 166L161 165L162 165L163 165L164 164L165 164L164 164L164 163L165 163L166 163L167 163L168 162L169 162L170 161L171 161L171 162L173 162L173 161L174 161L176 161L177 161L178 161L179 161L180 162L181 161L182 161L183 161L184 161L185 161L186 160L187 160L188 160L190 160L191 161L192 161L192 160L193 160L195 160L196 160L197 160L198 160L199 160L200 160L201 160L202 160L203 161L204 161L205 160L206 160L207 160L208 160L209 160L210 160L211 160L212 160L213 159L214 159L215 159L216 159L217 159L218 160L219 160L220 160L220 159L221 159L222 159L223 158L224 158L225 158L226 158L227 158L228 157L229 157L230 157L231 157L232 156L233 156L234 156L235 156L236 156L237 156L237 157L238 157L239 157L240 157L241 158L242 158L243 158L244 157L245 158L246 158L247 158L248 158L249 158L250 159L250 160L249 160L248 160L248 161L249 161L248 161L248 162L249 162L250 162L251 162L252 162L252 161L253 161L253 160L254 160L256 160L257 160L258 159L259 158L260 158L261 158L262 157L263 157L264 157L265 157L266 157L267 157L268 156L269 157L270 157L271 157L272 157L273 157L274 157L275 157L276 157L277 157L278 157L279 157L280 157L281 157L282 156L283 156L284 156L285 156L286 157L287 157L288 157L289 157L290 157L291 156L292 156L293 156L294 156L295 156L296 157L297 157L299 157L300 157L301 157L302 157L303 156L304 157L305 157L306 157L307 157L308 157L309 157L310 157L311 156L312 156L313 156L314 156L315 156L315 155L316 156L317 157L319 157L320 157L321 157L322 157L323 157L324 157L325 157L326 157L326 158L327 158L328 158L329 158L330 159L331 159L333 159L334 159L335 159L336 159L337 159L338 159L339 160L340 160L341 160L342 161L343 161L344 161L345 161L346 161L347 161L348 161L349 161L351 161L351 162L350 163L349 164L348 164L347 164L346 164L346 165L345 165L344 165L344 166L343 167L344 167L344 168L345 168L347 168L347 169L345 169L344 169L342 169L341 170L340 171L341 171L342 172L344 172L345 173L347 173L349 173L349 174L352 174L353 174L356 174L358 174L360 175L360 180L0 180L0 175L1 174L3 174L4 174L6 175L7 174L10 174L11 174L13 175L16 175L18 175L22 175L25 175L29 175L31 176L34 175L37 175L33 175L30 174L29 174L26 174L27 173L27 172L25 172L25 171L23 171L26 171L28 171L29 171L31 171L33 171L34 170L33 170L32 170L30 169L28 169L27 169L25 169L24 169L23 168L22 168L22 167L23 167L25 167L26 167L27 167L29 167L30 167L31 167L32 167L34 166L34 165L35 165L36 166L37 165L38 165L40 165L41 165L42 165L44 165L45 164L46 164L48 164L49 164L50 164L52 164L53 164L55 165L56 164L57 164L59 165L60 164L61 164L63 164L64 164L65 164L66 164L67 164L68 165L69 164L70 165L71 165L72 165L74 165L75 165L77 165L78 165L79 165L80 165L79 165L79 164L77 164L77 163L76 163L77 163L78 163L80 163L81 163L82 163L82 164L84 164L85 163L86 163L88 163L89 163L90 163L91 163L92 163L93 163L94 163L95 163L96 164L97 164L99 164L99 163L100 163L101 164L102 163L103 164L104 164L105 164L106 164L107 163L108 163L110 163L111 163L112 163L113 162L112 161L112 160L111 160L112 159L113 158L112 158L112 157L113 157L114 156L115 156L116 155L117 155L118 155L119 154L120 154L121 154L121 153L122 153L123 154L122 154L121 154ZM112 144L114 144L115 145L114 145L113 145L112 146L111 145L110 145L109 145L108 144L107 144L105 143L106 143L108 144L109 144L110 143L111 143L112 143L112 144ZM121 141L122 142L121 142L120 142L119 142L120 141L121 142L121 141ZM250 140L249 140L249 139L250 139L251 139L250 140ZM325 131L326 131L327 131L328 131L328 132L328 133L327 134L326 134L325 133L325 132L325 131ZM353 131L354 131L354 132L353 133L353 134L352 134L351 134L351 135L351 136L350 136L349 137L348 137L348 136L347 136L347 135L348 134L349 134L350 134L351 133L352 132L352 131L353 130L353 131ZM355 126L355 127L356 127L356 128L357 128L358 128L359 128L358 129L357 129L357 130L357 131L356 131L355 132L355 131L355 130L354 130L354 129L355 129L355 128L355 127L354 127L354 126L353 125L353 124L354 125L355 126ZM347 112L346 112L345 112L345 111L344 110L345 110L345 111L346 111L347 112ZM358 107L359 108L358 108L357 108L358 107L358 108L358 107ZM359 107L359 106L360 106L360 107L359 107ZM230 104L230 105L230 106L230 105L230 106L230 107L229 107L229 108L229 109L229 110L228 112L228 114L227 115L226 115L225 116L225 115L224 115L224 114L223 113L223 112L223 111L224 111L224 110L224 109L224 108L224 107L224 106L225 106L226 106L227 105L228 105L228 104L229 103L229 102L230 102L230 103L230 104ZM324 104L324 105L325 104L325 105L325 106L326 107L326 108L326 109L327 109L328 110L329 110L329 111L330 112L330 113L331 112L331 113L332 114L333 115L333 116L333 117L334 118L334 119L333 119L333 120L333 121L333 122L332 123L331 124L331 125L330 126L330 127L329 128L328 128L327 128L327 129L326 129L325 129L325 128L324 128L324 129L323 129L322 128L321 128L320 127L320 126L319 126L318 126L318 125L318 124L318 125L317 125L318 124L318 123L317 124L316 124L316 125L315 124L315 123L314 123L313 122L312 122L311 121L310 122L308 122L307 122L306 122L305 123L304 123L304 124L303 124L302 124L301 124L300 124L299 125L299 124L299 125L298 125L297 125L296 124L295 124L296 123L296 122L295 121L295 120L295 119L294 118L294 117L293 117L293 116L294 117L293 116L294 116L294 115L293 114L294 114L294 113L294 112L294 113L295 112L295 111L296 111L297 111L298 110L299 110L300 110L301 110L301 109L302 109L302 108L302 107L303 106L303 107L304 107L304 106L305 105L306 105L306 104L307 104L308 104L308 105L309 105L310 105L309 104L310 104L310 103L311 103L311 102L312 102L313 102L312 101L313 101L314 102L315 102L316 102L317 102L317 103L316 103L316 104L315 105L316 105L316 106L317 106L318 106L318 107L319 107L320 108L321 107L321 106L322 105L322 104L322 103L322 102L322 101L323 101L323 102L324 103L324 104ZM301 100L300 100L299 100L300 99L300 100L301 100ZM341 100L340 100L340 99L341 100ZM342 100L341 99L341 98L341 99L342 100ZM304 100L303 100L304 100L304 99L305 99L306 98L307 98L307 99L306 99L305 99L304 100ZM298 98L299 98L299 99L298 99L297 99L297 98L298 98ZM303 98L303 99L301 99L300 99L300 98L301 98L301 99L302 98L303 98ZM340 98L340 99L339 98L338 97L339 98L340 98ZM289 97L291 97L291 96L293 97L293 98L294 98L296 98L295 99L293 98L292 98L291 98L289 98L288 98L286 97L285 97L286 96L287 96L288 96L289 97ZM315 96L314 97L314 96L314 95L315 96ZM336 97L335 97L335 96L335 95L335 96L336 96L336 97ZM332 95L331 96L330 96L329 96L328 96L328 95L329 96L330 96L330 95L330 96L331 95L332 95L332 94L332 95ZM307 93L307 94L306 94L306 93L307 93ZM310 93L311 94L310 93L309 93L308 93L309 93L310 93ZM333 94L333 95L333 94L332 94L332 93L331 93L332 93L333 94ZM314 91L314 93L315 93L316 92L317 92L318 92L319 92L320 92L321 93L323 93L325 94L326 95L328 96L328 97L327 97L328 98L329 99L329 100L330 100L331 100L331 101L330 101L330 100L329 100L328 100L327 99L326 98L325 98L324 98L323 98L323 99L322 99L321 99L320 98L319 98L318 98L319 97L318 96L318 95L316 95L315 94L314 94L313 94L313 93L312 93L313 92L314 92L312 92L311 91L312 91L312 90L314 91ZM305 89L304 90L303 90L301 90L300 90L300 91L301 91L303 91L302 92L302 93L302 94L303 95L303 96L302 95L303 94L302 95L301 95L302 94L301 94L301 93L300 93L300 94L300 96L299 95L300 94L299 93L299 92L299 91L300 90L300 89L301 89L302 89L303 89L304 89L305 88L305 89ZM309 89L309 90L308 90L308 91L308 90L307 89L308 88L309 88L309 89ZM286 96L285 96L284 95L283 94L282 94L281 93L281 92L280 91L279 90L279 89L279 88L278 88L277 87L276 86L275 85L276 85L277 85L278 86L279 86L280 87L281 88L282 88L282 89L283 89L284 90L283 91L284 91L285 92L286 92L286 93L286 94L286 96ZM298 88L299 89L298 89L297 90L298 91L297 91L297 92L296 94L295 94L294 93L293 93L292 93L291 93L290 93L290 92L290 91L289 90L289 89L290 88L291 88L291 87L292 87L293 87L294 86L294 85L295 85L296 84L297 83L298 84L299 85L298 85L299 86L298 86L297 87L298 88ZM306 82L307 83L306 84L306 83L305 83L306 84L305 84L304 84L304 83L304 82L303 83L302 83L302 82L303 82L303 81L304 82L305 81L305 80L306 81L306 82ZM261 84L260 84L260 83L260 82L260 80L261 81L262 82L262 84L261 84ZM304 80L303 81L302 80L303 80L303 79L303 80L304 79L304 80ZM299 81L297 82L298 81L298 80L299 80L300 79L299 80L299 81ZM302 78L303 78L303 79L302 80L302 79L302 78ZM306 78L306 79L305 79L305 80L305 79L304 79L305 79L305 78L304 77L305 77L306 78ZM302 77L301 78L301 77L300 77L301 77L302 77ZM301 71L302 72L303 73L302 74L302 75L302 76L303 76L304 76L304 77L303 77L303 76L303 77L302 76L301 76L301 75L301 76L300 75L300 74L300 72L301 71ZM114 72L113 72L113 71L114 71L114 72ZM103 72L102 72L102 71L102 72L103 72L104 72L103 72ZM107 70L108 70L109 70L110 70L110 71L111 71L112 71L111 72L110 72L109 72L108 72L107 72L106 72L106 71L107 71L107 72L108 71L107 71L107 70ZM290 71L289 72L289 71L289 70L290 70L291 70L291 71L290 71ZM24 71L24 70L25 70L25 71L24 71ZM100 67L101 68L102 67L102 68L103 68L103 69L104 69L105 69L106 70L105 70L104 70L102 70L103 70L103 69L102 69L101 68L100 68L99 68L98 68L98 67L97 67L97 68L96 68L95 68L96 68L96 67L97 67L98 67L99 67L100 67ZM102 66L102 65L102 66ZM301 67L301 68L300 67L300 66L301 65L302 65L302 66L301 67ZM315 56L314 57L314 56L313 57L312 57L313 56L314 56L315 56ZM215 54L214 55L213 55L212 55L213 55L214 55L215 54ZM204 54L204 55L205 55L206 55L205 55L204 55L204 54ZM196 52L195 53L194 53L192 52L193 52L194 52L195 52L196 52ZM189 49L190 49L190 51L189 51L188 51L188 50L188 49L189 49ZM321 53L321 54L320 55L319 55L317 55L316 57L315 56L315 55L313 56L312 56L311 56L312 57L311 59L310 59L310 58L310 57L309 57L310 56L311 56L312 55L313 55L315 54L316 54L317 53L319 52L320 51L320 49L321 49L322 50L322 51L321 52L321 53ZM190 48L189 49L189 48L189 47L190 48ZM324 46L325 46L326 47L324 47L323 48L322 47L321 48L320 48L320 47L321 47L322 45L322 44L323 45L324 46ZM116 43L117 44L118 44L117 44L116 44L116 43ZM118 41L116 41L115 40L116 40L117 40L118 41ZM56 41L56 42L54 41L53 40L52 40L52 39L53 39L53 40L54 40L55 40L55 41L56 41ZM124 39L123 40L124 40L125 40L124 40L125 41L126 40L127 41L126 41L127 41L127 42L127 43L126 43L126 42L125 43L124 43L125 43L124 42L123 42L121 42L121 41L122 41L123 39L124 38L125 38L124 39ZM47 36L48 36L48 37L49 38L48 38L48 37L47 37L47 36ZM324 39L325 41L323 41L323 42L324 43L324 44L323 43L322 44L322 43L322 42L322 41L322 40L322 39L322 38L322 37L323 36L322 36L323 36L323 37L323 38L324 39ZM173 38L171 38L170 38L171 37L170 36L172 35L173 35L174 35L174 36L174 37L173 38ZM193 34L192 35L191 35L191 34L192 34L193 34ZM27 33L26 33L25 33L26 32L27 32L28 32L27 33ZM177 31L176 32L177 32L178 32L178 33L177 34L178 34L179 35L180 36L180 37L182 37L182 38L181 38L181 39L179 39L178 39L177 39L176 40L175 40L174 40L176 39L177 39L175 38L176 38L175 37L177 37L177 36L176 35L175 35L175 34L174 35L174 34L174 33L174 32L175 31L176 31L177 31ZM14 30L13 30L14 30ZM98 27L97 28L96 28L97 27L98 27ZM8 26L9 26L10 26L10 27L11 27L10 27L9 27L8 27L8 26ZM95 24L95 25L96 25L97 25L98 26L99 26L100 26L99 27L97 26L96 26L94 27L94 26L93 26L94 26L94 25L94 24L95 24ZM165 24L166 25L165 26L162 26L161 27L160 26L157 26L158 26L156 25L158 25L156 24L158 24L159 24L161 24L162 24L164 23L165 24ZM104 23L103 23L103 22L104 22L105 22L105 23L104 23ZM5 23L6 24L5 23L8 23L10 24L9 24L7 25L7 26L6 26L5 25L4 25L3 24L2 25L1 24L0 24L1 25L0 25L0 21L2 22L5 23ZM84 21L82 21L80 21L81 20L82 20L83 20L84 21ZM360 19L359 19L360 18L360 19ZM1 19L0 19L0 18L1 18L2 19L1 19ZM89 21L89 22L91 21L92 21L92 22L93 23L94 22L94 21L94 20L96 20L97 20L99 21L98 22L99 22L99 23L97 24L95 24L94 23L94 24L93 25L92 26L90 26L89 26L89 27L88 27L87 28L86 29L85 30L85 31L87 31L87 32L88 33L89 33L91 33L92 34L93 34L94 34L95 35L97 35L98 35L98 36L98 37L99 38L100 39L101 38L101 37L101 36L100 35L102 35L103 34L103 33L103 32L101 31L103 30L102 29L102 28L103 27L104 28L105 28L106 28L107 28L108 28L109 29L110 29L110 30L111 31L112 31L112 32L114 31L115 30L116 31L117 32L119 33L118 34L120 34L120 35L122 35L123 35L123 36L124 36L124 37L124 38L123 39L121 39L120 40L118 40L116 40L115 40L114 40L113 40L111 41L110 42L109 43L110 43L111 42L113 41L115 41L116 41L115 42L115 43L116 44L117 44L118 44L119 43L120 44L119 45L117 45L116 46L115 46L114 46L116 45L114 45L113 45L112 46L111 46L110 46L109 47L109 48L110 48L109 49L108 49L107 49L106 49L108 49L107 49L106 49L106 50L105 51L104 51L105 51L105 52L104 53L104 52L104 51L103 51L104 52L103 52L104 52L104 53L104 54L104 55L103 55L102 56L101 56L101 57L100 57L99 58L99 59L99 60L99 61L99 62L100 63L100 64L100 65L99 65L99 64L98 64L98 63L97 63L97 62L97 61L96 60L95 60L94 60L92 60L91 60L90 60L91 60L91 61L90 61L89 61L88 60L87 60L86 60L85 61L84 61L83 62L83 63L83 64L82 65L82 66L82 67L82 68L83 69L83 70L84 71L85 71L86 72L87 71L88 71L89 71L89 70L90 69L91 69L92 69L93 68L93 69L93 70L92 70L93 71L92 71L92 72L92 71L92 72L92 73L91 74L92 74L93 74L94 74L95 74L96 74L96 75L97 75L97 76L96 76L96 77L97 77L97 78L96 78L96 79L97 80L98 81L99 81L100 81L100 80L101 80L101 81L102 81L103 81L104 81L104 80L105 79L106 79L107 79L107 78L108 78L109 78L108 79L108 80L108 81L109 81L109 80L109 79L110 79L110 78L110 79L111 79L112 79L113 79L114 79L114 80L115 80L116 80L116 79L117 79L118 79L117 80L118 80L119 81L120 81L120 82L121 82L122 83L122 84L123 84L124 84L125 84L126 84L127 85L128 85L128 86L129 86L129 88L130 88L130 89L129 90L130 90L131 90L131 91L132 91L133 91L135 92L136 92L135 93L137 92L139 93L140 93L141 94L143 95L144 95L145 95L145 97L145 99L144 100L143 101L142 102L142 103L141 103L141 104L141 106L141 107L141 108L140 108L140 110L139 111L139 112L138 112L138 113L137 113L135 113L135 114L134 114L132 115L132 116L131 117L132 117L131 118L131 119L130 119L129 121L128 122L127 123L127 124L126 124L125 125L124 125L123 124L122 124L123 125L123 126L123 127L122 128L121 129L119 129L118 129L118 130L118 131L117 131L116 131L115 131L115 132L116 132L117 133L116 133L115 133L115 135L114 135L113 135L113 136L112 136L113 137L114 137L114 138L113 139L112 140L111 140L111 141L111 142L112 142L111 142L110 143L109 143L109 144L107 144L106 143L105 142L105 141L105 140L104 139L105 138L106 137L104 137L105 136L106 134L107 134L107 132L106 133L106 132L106 130L107 129L106 128L106 127L107 127L107 126L108 124L109 122L108 121L109 120L109 119L109 118L109 116L110 114L110 111L110 110L110 108L109 108L109 107L107 106L105 105L104 105L104 104L103 102L102 100L101 98L100 97L99 97L99 96L99 95L99 94L100 93L100 92L100 93L99 92L99 91L100 90L100 89L101 89L101 88L102 87L103 86L103 85L102 84L103 84L103 83L102 83L102 82L101 81L100 81L100 82L100 83L99 83L99 82L98 82L97 82L96 82L96 81L95 80L94 80L94 79L93 78L92 77L93 77L92 77L91 77L90 76L89 76L88 76L88 75L87 74L86 74L85 74L84 74L83 74L82 74L81 73L80 73L79 73L78 72L76 72L76 71L75 71L75 70L74 70L75 69L74 69L75 69L74 68L74 67L73 66L72 65L71 64L70 63L69 62L68 62L68 61L67 60L67 59L66 58L65 58L65 59L65 60L66 60L66 61L67 61L67 62L68 62L68 63L69 64L69 65L69 66L70 66L71 67L70 67L69 66L68 66L68 65L68 64L67 64L67 63L66 63L65 62L66 62L66 61L65 61L64 60L64 59L63 58L63 57L62 56L61 56L60 56L59 55L58 54L57 52L56 51L56 50L56 49L56 48L55 47L56 46L56 44L56 43L56 42L55 42L57 42L57 43L58 43L58 42L57 41L55 40L54 40L53 39L52 38L51 37L51 36L49 36L49 35L48 35L48 34L46 33L46 32L45 32L43 32L42 31L40 30L39 30L37 30L36 30L34 30L33 29L32 29L32 30L31 30L30 30L29 31L28 31L28 30L29 29L30 29L29 29L28 29L27 30L26 31L27 31L26 32L25 32L24 33L23 33L22 34L20 34L19 35L18 35L17 35L15 36L15 35L16 35L17 35L18 34L19 34L20 34L21 33L22 33L22 32L23 31L22 31L21 31L21 32L20 31L19 31L18 31L18 30L17 30L16 30L15 30L15 29L14 28L15 27L16 27L17 27L18 26L18 27L19 26L18 26L19 25L18 25L17 26L16 25L15 26L14 25L13 25L12 24L13 24L16 23L16 24L18 24L18 23L16 23L16 22L15 22L13 22L14 21L16 21L17 21L17 20L18 20L19 20L21 19L22 19L23 19L25 19L26 19L28 19L29 20L30 19L32 20L34 20L35 20L36 20L38 20L39 20L41 21L42 21L43 21L44 21L46 20L47 20L49 20L50 20L51 20L52 20L53 20L54 21L56 20L56 21L57 20L59 20L60 21L62 21L64 21L65 21L66 22L65 22L67 22L69 22L70 22L71 23L72 22L71 22L72 21L73 21L74 21L75 21L76 22L77 22L79 22L80 22L82 22L81 22L82 21L84 22L84 23L85 22L86 21L85 20L84 20L84 19L85 18L86 18L87 19L88 20L89 21ZM66 17L65 17L68 17L69 18L70 17L71 17L72 18L72 17L73 17L75 17L75 18L76 19L77 20L79 20L77 20L78 21L76 21L74 21L73 21L71 21L68 21L67 21L66 21L65 21L64 21L63 20L65 20L66 20L68 20L66 19L64 19L62 19L64 19L62 19L61 18L62 17L65 17L66 17ZM76 17L75 17L73 17L73 16L75 16L76 17ZM104 17L103 17L102 17L101 17L100 17L99 17L99 16L100 16L102 16L104 17ZM93 17L94 17L95 17L98 16L99 17L99 18L101 18L102 17L104 18L106 18L106 19L108 18L109 19L111 19L112 20L113 21L111 21L114 22L115 22L117 23L118 23L118 24L116 25L115 25L113 24L112 24L113 25L114 25L115 26L115 27L114 27L111 26L113 27L114 28L111 28L109 27L108 27L108 26L107 26L105 25L105 26L102 26L101 25L102 25L104 25L106 25L106 24L107 23L107 22L105 21L103 21L104 21L103 20L102 20L101 20L99 20L95 20L93 20L91 20L90 19L92 19L90 19L90 18L91 17L92 16L94 16L93 17ZM80 16L81 16L83 16L83 17L82 17L83 17L83 18L82 19L81 19L80 18L78 17L80 17L78 17L80 16ZM324 17L322 17L320 17L321 16L322 16L323 17L324 17ZM87 17L86 18L85 18L84 17L85 16L88 16L89 16L88 17L87 17ZM60 19L57 19L56 19L54 18L55 17L56 16L55 16L58 16L60 16L62 16L63 16L64 17L63 17L61 17L60 18L60 19ZM331 15L330 15L328 15L326 15L328 15L331 15ZM86 15L84 15L83 15L84 15L85 14L86 15ZM325 14L324 15L321 15L319 15L317 15L318 14L319 14L321 14L325 14ZM82 13L82 14L82 15L80 15L79 15L79 14L77 14L79 14L80 13L81 13L82 13ZM72 14L73 14L74 14L74 15L70 15L68 16L66 16L66 15L68 15L64 15L62 15L64 14L65 14L67 14L69 14L71 15L70 14L70 13L71 13L72 14ZM238 19L237 19L234 19L233 19L232 19L231 18L232 18L232 17L234 16L236 15L238 14L241 14L244 14L246 13L248 13L249 13L248 14L245 14L242 15L238 16L237 17L235 18L236 18L238 19ZM85 13L86 13L88 13L89 14L90 14L91 14L92 14L94 15L95 14L97 14L99 14L100 15L98 16L97 15L94 16L92 16L90 15L88 15L87 15L87 14L86 14L84 14L83 13L85 13ZM64 12L64 13L63 13L62 14L60 14L59 14L57 14L59 13L61 12L62 13L64 12ZM287 13L287 14L288 13L291 13L293 14L294 14L294 15L293 15L290 16L289 16L291 16L292 16L293 16L294 17L294 16L296 16L299 16L299 17L303 17L303 16L305 16L307 16L309 17L309 18L308 18L310 19L311 19L312 18L314 19L316 18L317 19L318 18L320 19L319 18L320 17L330 18L333 19L337 19L339 19L340 20L341 21L342 20L344 20L346 21L348 20L350 21L351 21L350 20L354 20L356 20L359 21L360 21L360 25L359 25L357 25L358 26L359 27L359 28L357 27L355 28L354 28L352 29L351 30L350 30L349 29L346 30L345 30L344 30L343 31L342 32L343 32L343 34L342 34L342 35L340 36L340 37L339 37L338 38L337 39L336 38L336 37L335 35L336 33L337 33L337 32L338 32L340 31L342 30L344 29L344 27L343 28L340 29L339 28L337 29L334 30L335 31L333 31L331 31L331 30L330 30L329 31L325 31L322 31L319 33L315 35L317 35L317 36L318 36L319 36L320 36L321 37L321 38L321 39L321 40L320 42L319 43L318 44L317 45L316 46L315 47L314 47L313 47L312 47L311 47L311 48L310 48L310 49L309 49L309 50L308 50L308 51L307 51L308 51L309 53L309 54L309 55L308 55L307 56L306 56L306 55L307 54L306 53L307 53L306 52L305 52L305 51L305 50L304 50L303 50L302 51L301 51L302 51L301 50L302 50L302 49L301 49L300 50L299 51L298 51L298 52L299 52L299 53L300 53L301 52L302 53L303 53L301 53L301 54L300 54L299 55L300 56L301 57L301 58L302 58L302 59L301 59L302 60L302 61L302 62L301 62L300 63L300 64L299 65L297 66L296 67L295 67L294 68L294 67L293 68L292 68L291 69L290 70L290 69L289 68L288 68L287 69L286 70L286 71L286 72L287 73L288 74L289 75L289 77L289 78L288 79L287 80L286 80L285 81L285 80L284 80L283 79L283 78L282 77L281 77L280 77L280 78L279 79L279 80L279 81L280 81L280 82L280 83L281 83L282 83L282 84L283 84L283 85L283 86L283 87L284 87L284 88L284 89L283 88L281 87L281 86L281 85L280 85L280 84L280 83L279 82L278 82L278 81L279 80L278 79L279 79L278 78L279 77L278 76L278 75L278 74L277 73L277 74L275 74L274 74L275 73L274 72L274 71L274 70L273 70L272 69L272 68L271 67L270 67L271 68L270 68L269 68L268 68L267 69L266 70L265 71L264 72L263 72L262 73L262 74L261 74L260 74L260 75L260 76L260 77L260 78L260 80L259 80L259 81L258 81L258 82L257 81L256 80L256 79L255 78L255 77L255 76L254 75L254 74L253 72L253 71L253 70L253 69L251 69L250 69L249 68L250 68L249 67L248 66L247 66L247 65L246 65L245 65L243 65L241 65L240 65L239 64L237 64L237 63L236 63L235 64L233 63L232 62L231 61L230 60L229 60L228 60L228 61L229 62L229 63L230 63L230 64L231 65L231 64L232 64L232 65L231 65L232 66L233 66L234 66L235 65L236 64L236 65L237 66L238 66L239 66L239 67L240 67L240 68L239 68L239 69L238 70L238 71L237 71L237 72L236 72L235 72L235 73L234 73L233 73L232 74L231 75L230 75L229 76L228 76L227 76L227 77L226 77L225 77L224 77L223 77L223 76L223 75L223 74L223 73L222 73L222 72L221 71L220 70L219 69L219 68L219 67L218 66L217 66L217 65L217 64L216 63L215 62L215 61L215 60L215 61L214 62L213 62L212 60L213 61L213 62L214 64L215 65L216 66L215 66L216 67L217 68L217 69L217 70L217 71L218 72L219 73L219 74L220 75L221 76L222 76L222 77L223 77L223 78L223 79L224 79L224 80L225 80L226 79L227 79L228 79L229 79L230 78L231 78L231 79L231 80L231 81L230 82L229 83L229 85L228 86L227 87L226 88L224 89L223 90L222 91L222 92L221 92L220 93L220 94L219 95L219 96L219 97L219 98L220 99L220 100L220 101L220 102L221 103L221 104L221 105L220 105L220 106L219 107L217 108L216 109L215 110L215 111L215 112L216 112L216 113L215 114L216 114L215 114L214 115L213 115L213 116L213 117L212 118L212 119L211 119L211 120L210 121L209 122L208 123L207 123L206 124L205 124L204 124L203 124L202 124L201 124L200 125L199 124L198 124L198 123L198 122L198 121L197 120L196 119L196 118L195 117L195 116L195 115L194 114L194 113L194 112L193 111L193 110L193 109L192 108L192 107L192 106L192 105L192 104L193 104L193 103L193 102L194 102L194 101L193 100L193 99L193 98L193 97L192 96L192 95L191 94L190 93L189 92L189 91L189 90L189 89L190 88L190 87L189 86L188 86L189 85L187 86L186 86L185 85L185 84L184 84L183 84L182 84L181 84L179 85L178 85L177 85L176 85L175 85L174 85L173 85L172 86L171 85L170 84L169 84L169 83L168 83L167 82L167 81L166 81L166 80L165 80L165 79L164 79L164 78L163 78L163 77L163 76L162 75L163 75L163 74L164 74L163 73L164 73L164 72L164 71L164 70L163 69L163 68L164 67L164 66L165 66L165 65L165 64L166 64L166 63L167 62L168 62L169 61L170 61L170 60L170 59L171 58L171 57L172 56L173 56L174 55L174 54L175 54L175 55L176 55L177 55L178 55L179 54L180 54L181 54L181 53L183 53L185 53L186 53L187 53L188 53L190 53L191 53L191 54L191 55L190 56L191 56L191 57L193 57L194 57L195 58L196 59L197 59L198 59L199 60L200 59L200 58L201 57L202 57L203 57L203 58L204 58L205 58L206 58L207 59L208 59L209 59L210 59L211 58L212 59L213 59L214 59L215 58L214 58L215 58L215 57L215 56L216 55L216 54L216 53L215 53L214 54L213 54L212 53L211 53L210 54L209 53L208 53L207 52L206 52L207 51L206 51L207 50L209 50L209 49L211 49L212 48L214 48L215 48L217 49L218 49L220 49L222 48L221 47L220 47L219 46L218 45L217 45L218 44L218 43L219 43L218 43L217 43L216 43L215 44L216 45L217 45L216 45L215 45L214 46L213 45L214 45L212 45L213 44L214 44L213 44L212 44L212 43L211 43L210 44L210 45L209 45L209 46L208 47L208 48L209 49L208 49L207 49L206 50L206 49L205 49L204 49L204 50L203 50L203 51L204 51L204 52L203 52L203 53L203 54L202 54L202 53L201 52L201 51L200 51L200 50L199 50L199 49L200 48L199 48L198 48L198 47L197 47L196 46L195 46L195 45L194 45L194 44L193 44L192 45L193 46L194 46L194 47L195 48L196 48L197 49L198 49L198 50L197 50L196 50L197 51L196 52L196 51L196 50L195 50L195 49L194 49L193 49L192 48L191 48L191 47L190 46L189 46L188 46L187 46L187 47L185 47L183 47L183 48L182 49L181 49L180 50L180 51L180 52L179 52L179 53L178 53L177 53L176 53L175 54L174 54L173 53L172 53L171 53L171 52L170 51L171 51L171 50L171 49L171 48L171 47L172 46L173 46L175 46L176 47L178 47L179 46L179 44L178 43L177 42L176 42L175 41L177 41L178 41L178 40L179 41L181 40L182 39L183 39L184 38L185 37L186 36L187 37L187 36L188 36L189 36L189 35L188 34L188 33L189 33L190 33L191 32L191 33L190 33L191 34L190 34L190 35L191 36L192 36L193 36L194 36L195 36L196 35L198 35L199 35L199 36L200 36L200 35L201 35L201 34L201 33L202 33L203 32L203 33L204 33L204 32L203 31L205 31L206 30L207 31L208 31L209 30L208 29L206 30L204 30L203 30L202 30L201 29L202 28L201 27L202 27L202 26L205 25L205 24L204 24L202 24L201 25L201 26L200 26L198 27L197 29L198 29L199 30L198 31L197 31L196 33L196 34L195 34L194 35L193 35L193 34L192 33L191 31L190 31L188 32L187 32L186 31L185 30L185 28L186 27L189 27L191 26L192 24L195 22L196 21L199 20L201 20L203 20L205 19L206 19L208 19L211 20L210 20L211 20L212 20L214 21L217 21L220 22L221 23L220 24L218 24L214 23L213 23L215 24L215 26L216 26L217 26L217 25L220 25L222 24L223 24L224 24L225 23L224 23L224 22L223 21L226 22L227 22L226 22L226 23L228 23L228 22L230 22L234 21L233 22L235 22L237 22L239 21L240 22L241 21L240 20L241 20L244 20L245 21L249 22L249 21L248 21L247 21L247 20L247 19L249 18L249 17L250 17L253 17L253 18L252 19L253 20L253 21L254 22L253 22L251 24L252 24L253 23L254 23L255 22L254 22L255 21L254 21L254 20L254 19L253 19L255 18L255 17L256 18L255 19L256 19L256 18L258 18L260 18L262 18L261 17L261 16L262 16L265 16L267 16L266 16L267 15L268 15L270 14L273 14L276 14L277 14L279 14L281 14L281 13L282 13L284 12L286 13L285 13L287 13ZM229 49L230 49L230 50L229 51L229 52L230 53L231 53L232 53L234 53L234 52L234 51L233 51L233 50L233 49L234 49L235 49L234 48L233 48L233 49L233 48L232 48L233 48L233 47L231 47L231 46L230 46L230 45L231 45L232 45L233 45L233 44L233 43L232 43L231 43L230 43L229 44L228 44L227 45L228 46L227 47L229 48L229 49ZM86 12L86 13L84 12L86 12ZM70 12L68 13L66 12L67 12L69 12L70 12ZM205 12L202 13L201 12L203 12L205 12ZM70 11L69 12L67 12L67 11L68 11L69 11L70 11ZM84 12L83 12L82 12L81 12L81 11L83 11L84 12ZM80 12L79 12L77 12L75 12L76 11L75 11L76 11L79 11L80 12ZM285 12L279 12L281 11L282 11L283 11L285 11L285 12ZM198 10L202 11L199 11L198 12L197 13L196 13L194 13L195 12L193 12L191 11L190 10L193 10L194 10L195 10L196 10L197 10L198 10ZM205 10L207 10L206 10L203 11L200 10L198 10L197 10L200 9L202 10L203 9L205 10ZM231 9L230 10L229 10L228 10L227 10L227 9L225 9L227 9L228 9L229 9L230 9L232 9L231 9ZM280 11L278 11L275 11L273 11L273 10L271 10L274 9L276 9L278 9L280 10L280 11ZM93 10L94 11L93 11L91 12L89 12L87 12L86 11L87 11L85 11L84 10L83 10L84 9L85 9L86 9L85 9L88 9L89 9L91 9L92 10L93 10ZM112 7L114 7L116 7L118 7L118 8L116 8L113 8L112 8L115 8L112 9L111 9L109 10L107 10L106 11L103 11L104 11L105 11L104 12L102 12L100 13L102 13L99 14L97 14L94 14L92 14L91 14L90 13L92 13L92 12L95 12L94 12L92 12L93 11L95 11L93 10L96 10L97 10L98 10L96 9L92 9L91 9L90 9L89 8L88 8L90 8L91 8L93 8L95 7L96 7L97 8L98 7L99 7L101 7L104 7L107 7L109 7L112 7ZM153 6L159 7L157 8L153 8L148 8L149 8L152 8L155 8L157 8L158 8L157 9L159 8L164 8L167 8L168 9L164 9L163 10L160 10L162 10L161 11L160 11L160 12L162 13L160 13L158 13L160 14L160 15L159 15L161 16L158 16L160 16L159 17L158 17L156 17L158 17L158 18L156 17L155 18L157 18L158 19L156 20L156 19L154 19L155 19L154 20L156 20L158 20L155 21L152 22L149 22L148 22L147 22L146 23L144 24L143 24L142 24L140 25L139 25L139 26L139 27L137 27L138 28L137 29L137 30L135 30L134 29L132 29L131 29L130 28L128 26L128 25L126 24L127 23L126 23L127 22L129 21L129 20L128 20L127 21L125 20L126 19L127 19L129 19L127 19L126 18L125 19L124 18L125 17L124 16L123 15L121 15L121 14L119 14L117 14L114 14L111 14L110 14L109 13L111 13L113 13L109 12L107 12L111 11L114 11L115 10L112 10L113 9L116 9L118 9L117 8L120 8L123 8L126 8L127 8L130 8L132 8L133 8L135 8L133 8L133 7L137 7L140 7L141 6L145 6L153 6Z";var Ra=360,ta=180,ga=n=>n+180,sa=n=>90-n,Dt=23.44,Nt=66.56,Gt=n=>n===0?"0":`${Math.abs(n)}\xB0${n>0?"E":"W"}`,Ht=n=>n===0?"0":`${Math.abs(n)}\xB0${n>0?"N":"S"}`;function _s(n){let a=[],e=[],r=null;for(let t of n)r!==null&&Math.abs(t.longitude-r)>180&&(e.length&&a.push(e),e=[]),e.push(`${ga(t.longitude)},${sa(t.latitude)}`),r=t.longitude;return e.length&&a.push(e),a.filter(t=>t.length>1).map(t=>t.join(" "))}var Ot={mc:"MC",ic:"IC",ascendant:"AC",descendant:"DC"},Rr=class extends m{renderEmpty(){return E.html`<div class="roxy-empty" role="status">No astrocartography data</div>`}renderData(a){let e=a.lines??[],r=a.birthDetails;return E.html`<div class="wrap"><header><h2 class="title">Astrocartography</h2>${r?E.html`<div class="meta">${[r.date,r.time].filter(Boolean).join(" \xB7 ")} · ${Ht(Math.round(r.latitude))} ${Gt(Math.round(r.longitude))}</div>`:E.nothing}</header>${this.renderMap(e,r)} ${this.renderLegend(e)} ${a.summary?E.html`<p class="summary">${a.summary}</p>`:E.nothing} ${this.renderInterpretations(e)}</div>`}renderMap(a,e){return E.html`<svg viewBox="0 0 ${Ra} ${ta}" role="img" aria-label="World map of planetary astrocartography lines"><title>Astrocartography world map</title><desc>Equirectangular world map. Each body has a Midheaven and Imum Coeli meridian and a curved Ascendant and Descendant line, colored per body.</desc><rect class="map-frame" x="0" y="0" width="${Ra}" height="${ta}"/><path class="land" d="${Pt}" fill-rule="evenodd"/>${this.renderGraticule()} ${a.map((r,t)=>this.renderBodyLines(r,t))} ${e?E.svg`<text class="birthplace" x=${ga(e.longitude)} y=${sa(e.latitude)} text-anchor="middle" dominant-baseline="central"><title>Birthplace</title>★</text>`:E.nothing}</svg>`}renderGraticule(){let a=[];for(let t=-150;t<=150;t+=30){let s=ga(t),o=t===0;a.push(E.svg`<line class=${o?"grat-axis":"grat"} x1=${s} y1="0" x2=${s} y2=${ta} />`),a.push(E.svg`<text class="axis-label" x=${s} y=${ta-2} text-anchor="middle">${Gt(t)}</text>`)}let e=[];for(let t=-60;t<=60;t+=30){let s=sa(t),o=t===0;e.push(E.svg`<line class=${o?"grat-axis":"grat"} x1="0" y1=${s} x2=${Ra} y2=${s} />`),e.push(E.svg`<text class="axis-label" x="2" y=${s-1}>${Ht(t)}</text>`)}let r=[Dt,-Dt,Nt,-Nt].map(t=>E.svg`<line class="grat-ref" x1="0" y1=${sa(t)} x2=${Ra} y2=${sa(t)} />`);return E.svg`${a}${e}${r}`}renderBodyLines(a,e){let r=Sr(a.planet,e),t=a.symbol||a.planet.slice(0,2),s=[this.renderMeridian(a.mc.longitude,r,t,a.planet,"mc",!1),this.renderMeridian(a.ic.longitude,r,t,a.planet,"ic",!0),this.renderCurve(a.ascendant.points,r,t,a.planet,"ascendant",!1),this.renderCurve(a.descendant.points,r,t,a.planet,"descendant",!0)];return E.svg`${s}`}renderMeridian(a,e,r,t,s,o){let i=ga(a),l=s==="ic"?ta-7:9;return E.svg`<g>
|
|
2
|
+
<line class=${`acg-line${o?" dashed":""}`} stroke=${e} x1=${i} y1="0" x2=${i} y2=${ta}><title>${t} ${Ot[s]} line</title></line>
|
|
3
|
+
<text class="acg-glyph" fill=${e} x=${i} y=${l} text-anchor="middle" dominant-baseline="central">${r}</text>
|
|
4
|
+
</g>`}renderCurve(a,e,r,t,s,o){let i=_s(a??[]);if(i.length===0)return E.nothing;let l=(a??[]).reduce((c,p)=>Math.abs(p.latitude)<Math.abs(c.latitude)?p:c,a[0]??{latitude:0,longitude:0});return E.svg`<g>
|
|
5
|
+
${i.map(c=>E.svg`<polyline class=${`acg-line${o?" dashed":""}`} stroke=${e} points=${c}><title>${t} ${Ot[s]} line</title></polyline>`)}
|
|
6
|
+
<text class="acg-glyph" fill=${e} x=${ga(l.longitude)} y=${sa(l.latitude)} text-anchor="middle" dominant-baseline="central">${r}</text>
|
|
7
|
+
</g>`}renderLegend(a){return a.length===0?E.nothing:E.html`<div class="legend">${a.map((e,r)=>{let t=Sr(e.planet,r);return E.html`<span class="legend-item"><span class="legend-swatch" style="${`border-top-color: ${t}`}"></span> ${e.symbol?E.html`${e.symbol}`:E.nothing}${e.planet}</span>`})} <span class="legend-note">Solid lines are the Ascendant and Midheaven, dashed are the Descendant and IC.</span></div>`}renderInterpretations(a){return a.length===0?E.nothing:E.html`<section class="interpretations"><h3>Planetary lines</h3>${a.map((e,r)=>{let t=Sr(e.planet,r),s=[["MC",e.mc.interpretation],["IC",e.ic.interpretation],["AC",e.ascendant.interpretation],["DC",e.descendant.interpretation]];return E.html`<details class="interp-card" name="acg-lines" ?open="${r===0}"><summary><span class="interp-head"><span class="interp-dot" style="${`background: ${t}`}"></span> ${e.symbol?E.html`${e.symbol}`:E.nothing}${e.planet} </span>${le()}</summary><div class="interp-body">${s.filter(([,o])=>o).map(([o,i])=>E.html`<p class="interp-line"><span class="code">${o}</span>${i}</p>`)}</div></details>`})}</section>`}};Rr.styles=[y,we,E.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{border-radius:var(--roxy-radius-sm,4px);width:100%;height:auto;display:block}.map-frame{fill:color-mix(in srgb, var(--roxy-border,#e4e4e7) 12%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:.8px}.land{fill:var(--roxy-secondary,#475569);opacity:.13}.grat{stroke:var(--roxy-border,#e4e4e7);stroke-width:.4px;fill:none}.grat-axis{stroke:var(--roxy-muted,#71717a);stroke-width:.6px;opacity:.6}.grat-ref{stroke:var(--roxy-secondary,#475569);stroke-width:.4px;stroke-dasharray:2 2;opacity:.5;fill:none}.axis-label{fill:var(--roxy-muted,#71717a);font-size:5px;font-family:var(--roxy-font-sans)}.acg-line{fill:none;stroke-width:1px;opacity:.95}.acg-line.dashed{stroke-dasharray:4 2.5}.acg-glyph{font-size:8px;font-family:var(--roxy-font-sans);font-weight:600}.birthplace{fill:var(--roxy-fg,#0a0a0a);font-size:9px}.legend{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-item{align-items:center;gap:.3rem;display:inline-flex}.legend-swatch{border-top-style:solid;border-top-width:2px;width:14px;height:0}.legend-note{width:100%;color:var(--roxy-muted,#71717a)}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-head{align-items:center;gap:.5rem;display:inline-flex}.interp-dot{border-radius:50%;width:10px;height:10px}.interp-body{margin-top:var(--roxy-space-sm,.5rem);gap:var(--roxy-space-xs,.25rem);display:grid}.interp-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.interp-line .code{color:var(--roxy-accent-ink,#b45309);margin-right:.4rem;font-weight:600}`],Rr=d([(0,jt.customElement)("roxy-astrocartography-map")],Rr);var se=require("lit"),Ca=require("lit/decorators.js");var Bt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},Xe=class extends m{constructor(){super(...arguments);this.mode="daily"}renderEmpty(){return se.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderData(e){return this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e)}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([s,o])=>{let i=typeof o=="number"?o:0,l=Math.abs(i)>1?i/100:i;return[s,l]});return se.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?se.html`<span class="energy">Energy ${e.energyRating}/10</span>`:se.nothing}</header><div class="bars" role="list">${t.map(([s,o])=>{let i=(o+1)/2*100,l=Bt[s]??"var(--roxy-accent, #f59e0b)";return se.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${s}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(o*100)}%</span></div>`})}</div>${e.dailyMessage?se.html`<p class="advice">${e.dailyMessage}</p>`:se.nothing} ${e.advice?se.html`<p class="advice">${e.advice}</p>`:se.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return se.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,s=160,o=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return se.html`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${s}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${s/2}" x2="${t}" y2="${s/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((g,h)=>{let k=g[l]??0,f=h*o,fr=s/2-k/100*(s/2-8);return`${f.toFixed(2)},${fr.toFixed(2)}`}).join(" "),p=Bt[l]??"#475569";return se.svg`<polyline points=${c} fill="none" stroke=${p} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?se.html`<p class="advice">${e.summary.periodAdvice}</p>`:se.nothing}</section>`}renderCritical(e){return se.html`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>se.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};Xe.styles=[y,se.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,600px);height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([(0,Ca.property)({type:String,reflect:!0})],Xe.prototype,"mode",2),Xe=d([(0,Ca.customElement)("roxy-biorhythm-chart")],Xe);var J=require("lit"),Vt=require("lit/decorators.js");var De=require("lit"),Ta=4,Ea=9,_t=(100+2*Ea)*Ta,Ks=(100+2*Ea)*Ta;function Ce(n,a){return{x:(n+Ea)*Ta,y:(a+Ea)*Ta}}var ya=50,dt=n=>2*ya-n,nt={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},Fs={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function Zs(){let n={},a={};for(let[e,[r,t]]of Object.entries(nt.spleen))nt["solar-plexus"][Fs[Number(e)]]=[dt(r),t];for(let[e,r]of Object.entries(nt))for(let[t,[s,o]]of Object.entries(r))n[Number(t)]=Ce(s,o),a[Number(t)]=e;return{points:n,centerOf:a}}var{points:lt,centerOf:Qn}=Zs(),ei=_t/2;function Cr(n){return n.map(([a,e])=>Ce(a,e))}function it(n,a,e){return Cr([[ya-n,a],[ya+n,a],[ya+n,e],[ya-n,e]])}var It=[[18.4,68],[18.4,81.8],[34.7,74.9]],Ys=[{id:"head",label:"Head",color:"gold",points:Cr([[40,14.3],[60,14.3],[50,6]]),labelAnchor:Ce(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:Cr([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:Ce(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:it(9.5,30.4,43.6),labelAnchor:Ce(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:Cr([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:Ce(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:Cr([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:Ce(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:Cr(It),labelAnchor:Ce(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:it(9.5,70.6,83.6),labelAnchor:Ce(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:Cr(It.map(([n,a])=>[dt(n),a])),labelAnchor:Ce(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:it(9.5,87.9,99.9),labelAnchor:Ce(50,103),labelAlign:"middle"}],Vs=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],qs=Us();function Us(){let n=dt,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${Ma(a[0])}`];for(let r=1;r+2<a.length;r+=3)e.push(`C ${Ma(a[r])} ${Ma(a[r+1])} ${Ma(a[r+2])}`);e.push(`L ${za(a[a.length-1],n)}`);for(let r=a.length-3;r>=1;r-=3)e.push(`C ${za(a[r+1],n)} ${za(a[r],n)} ${za(a[r-1],n)}`);return e.push("Z"),e.join(" ")}function Ma([n,a]){let e=Ce(n,a);return`${e.x} ${e.y}`}function za([n,a],e){let r=Ce(e(n),a);return`${r.x} ${r.y}`}function Ws(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function Kt(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function Js(){return De.svg`<path class="bg-body" d=${qs} />`}function Xs(n,a){let e=[];for(let[r,t]of Vs){let s=lt[r],o=lt[t];if(!s||!o)continue;if(e.push(De.svg`<line class="bg-channel" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`),n.has(Kt(r,t))){e.push(De.svg`<line class="bg-channel on" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`);continue}let i={x:(s.x+o.x)/2,y:(s.y+o.y)/2};a.has(r)&&e.push(De.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`),a.has(t)&&e.push(De.svg`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`)}return e}function Qs(n,a,e){let r=e.x-a.x,t=e.y-a.y,s=r*r+t*t;if(s===0)return a;let o=Math.max(0,Math.min(1,((n.x-a.x)*r+(n.y-a.y)*t)/s));return{x:a.x+o*r,y:a.y+o*t}}function eo(n,a){let e=a[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<a.length;t++){let s=Qs(n,a[t],a[(t+1)%a.length]),o=(s.x-n.x)**2+(s.y-n.y)**2;o<r&&(r=o,e=s)}return e}function ro(n){return Ys.map(a=>{let e=n.has(a.id),r=`bg-center bg-${a.color}${e?" defined":""}`,t=eo(a.labelAnchor,a.points);return De.svg`<g>
|
|
2
8
|
<line class="bg-leader" x1=${a.labelAnchor.x} y1=${a.labelAnchor.y} x2=${t.x} y2=${t.y} />
|
|
3
|
-
<polygon class=${r} points=${
|
|
9
|
+
<polygon class=${r} points=${Ws(a.points)}><title>${a.label}: ${e?"defined":"open"}</title></polygon>
|
|
4
10
|
<text class="bg-center-label" x=${a.labelAnchor.x} y=${a.labelAnchor.y} text-anchor=${a.labelAlign} dominant-baseline="central">${a.label}</text>
|
|
5
|
-
</g>`})}function
|
|
6
|
-
${
|
|
7
|
-
${
|
|
8
|
-
${
|
|
9
|
-
${
|
|
10
|
-
`}var xr=class extends m{renderEmpty(){return U.html`<div class="roxy-empty" role="status">No bodygraph data</div>`}renderData(a){let e=new Set((a.centers??[]).filter(o=>o.defined).map(o=>o.id)),r=new Set((a.gates??[]).map(o=>o.gate).filter(o=>o!=null)),t=new Set((a.channels??[]).map(o=>gt(o.gateA,o.gateB))),s=this.buildGateTitles(a.gates??[]);return U.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${a.type?U.html`<div class="type-line">${a.type}${a.profile?U.html`· Profile ${a.profile}`:U.nothing}</div>`:U.nothing}</header><div class="layout"><svg viewBox="${yt}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${ut({definedCenters:e,activeChannels:t,activeGates:r,gateTitles:s})}</svg> ${this.renderSummary(a)}</div></div>`}buildGateTitles(a){let e=new Map;for(let r of a){if(r.gate==null)continue;let t=[`Gate ${r.gate}`];r.line!=null&&(t[0]+=`.${r.line}`),r.gateName&&t.push(r.gateName);let s=r.planet?h(r.planet):"",o=s?N[s]??s:"";o&&t.push(`${o} ${r.side??""}`.trim()),e.set(r.gate,t.join(" \xB7 "))}return e}renderSummary(a){let e=[{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile},{label:"Definition",value:a.definition}],r=a.incarnationCross;return U.html`<div class="summary"><div class="facts">${e.map(t=>t.value?U.html`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:U.nothing)}</div>${r?.name?U.html`<p class="cross">${r.name} ${r.gates?.length?U.html`<span class="gates">(${r.gates.join(", ")})</span>`:U.nothing}</p>`:U.nothing} ${a.signature||a.notSelf?U.html`<div class="themes">${a.signature?U.html`<span class="pill pill--good">Signature: ${a.signature}</span>`:U.nothing} ${a.notSelf?U.html`<span class="pill pill--shadow">Not-self: ${a.notSelf}</span>`:U.nothing}</div>`:U.nothing}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};xr.styles=[g,U.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:var(--roxy-chart-max-width,340px);height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],xr=d([(0,xt.customElement)("roxy-bodygraph")],xr);var me=require("lit"),ft=require("lit/decorators.js");function ht(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var hr=class extends m{isCurrent(a){let e=Date.now(),r=Date.parse(a.start),t=Date.parse(a.end);return Number.isNaN(r)||Number.isNaN(t)?!1:e>=r&&e<t}renderTile(a){let e=a.effect==="Good"?"good":a.effect==="Bad"?"bad":"neutral",r=this.isCurrent(a),t=N[h(a.lord)]??"",s=`${ht(a.start)} - ${ht(a.end)}`;return me.html`<div class="cho-tile ${e}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${a.name}${r?me.html`<span class="now-badge">Now</span>`:me.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?me.html`<span aria-hidden="true">${t}</span>`:me.nothing} ${a.lord}</span></div>`}renderEmpty(){return me.html`<div class="roxy-empty" role="status">No choghadiya data</div>`}renderData(a){let{date:e,dayChoghadiya:r,nightChoghadiya:t}=a;return me.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?me.html`<p class="subtitle">${e}</p>`:me.nothing}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(s=>this.renderTile(s)):me.html`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(s=>this.renderTile(s)):me.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};hr.styles=[g,me.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],hr=d([(0,ft.customElement)("roxy-choghadiya-grid")],hr);var D=require("lit"),ca=require("lit/decorators.js");var Fe=class extends m{constructor(){super(...arguments);this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,s]of Object.entries(e.categories))typeof s=="number"&&Number.isFinite(s)&&(r[t]=s);return r}return{}}renderEmpty(){return D.html`<div class="roxy-empty" role="status">No compatibility data</div>`}renderData(e){let r=e.overallScore,t=this.getBreakdown(),s="rating"in e?e.rating:void 0,o="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,p="strengths"in e?e.strengths:void 0,y="challenges"in e?e.challenges:void 0,x="keyAspects"in e?e.keyAspects:void 0;return D.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?D.html`<div class="score">${f(r,0)}</div>`:D.nothing} ${s?D.html`<div class="rating">${s}</div>`:D.nothing}</div></div>${Object.keys(t).length>0?D.html`<div role="list">${Object.entries(t).map(([j,b])=>D.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${j}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,b))}%"></span></span> <span>${f(b,0)}</span></div>`)}</div>`:D.nothing} ${o?D.html`<p><span class="archetype">${o.label}</span> ${o.description?D.html`· ${o.description}`:D.nothing}</p>`:D.nothing} ${l?D.html`<p>${l}</p>`:D.nothing} ${c&&!l?D.html`<p>${c}</p>`:D.nothing} ${i?D.html`<p>${i}</p>`:D.nothing} ${(p?.length??0)>0||(y?.length??0)>0?D.html`<div class="lists">${p?.length?D.html`<div><h3>Strengths</h3><ul>${p.map(j=>D.html`<li>${j}</li>`)}</ul></div>`:D.nothing} ${y?.length?D.html`<div><h3>Challenges</h3><ul>${y.map(j=>D.html`<li>${j}</li>`)}</ul></div>`:D.nothing}</div>`:D.nothing} ${x?.length?D.html`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${x.slice(0,6).map(j=>D.html`<li>${fs(j)}</li>`)}</ul></div>`:D.nothing}</article>`}};Fe.styles=[g,D.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([(0,ca.property)({type:String,reflect:!0})],Fe.prototype,"mode",2),Fe=d([(0,ca.customElement)("roxy-compatibility-card")],Fe);function fs(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${f(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}var H=require("lit"),bt=require("lit/decorators.js");var bs=["January","February","March","April","May","June","July","August","September","October","November","December"],fr=class extends m{renderEmpty(){return H.html`<div class="roxy-empty" role="status">No crystal data</div>`}renderData(a){let e=a.colors??[],r=a.keywords??[],t=a.pairsWith??[],s=typeof a.birthMonth=="number"?bs[a.birthMonth-1]:void 0;return H.html`<article class="wrap" aria-label="${a.name??"Crystal"}"><div class="hero">${a.imageUrl?H.html`<img class="photo" src="${a.imageUrl}" alt="${a.name??"Crystal"}" loading="lazy">`:H.nothing}<div><h2 class="title">${a.name}</h2>${a.description?H.html`<p class="desc">${a.description}</p>`:H.nothing}</div></div><dl class="attrs">${this.attr("Planet",a.planet)} ${this.attr("Hardness",typeof a.hardness=="number"?`${a.hardness} Mohs`:void 0)} ${this.attr("Vibration",a.numericalVibration)} ${this.attr("Birthstone",s)} ${this.list("Chakras",a.chakras)} ${this.list("Zodiac",a.zodiacSigns)} ${this.list("Elements",a.elements)} ${e.length?H.html`<div class="attr"><dt>Colors</dt><dd><div class="colors">${e.map(o=>H.html`<span class="color"><span class="dot" style="background:${o}"></span>${o}</span>`)}</div></dd></div>`:H.nothing}</dl>${this.renderMeaning(a.meaning)} ${r.length?H.html`<div><p class="section-label">Keywords</p><div class="chips">${r.map(o=>H.html`<span class="chip">${o}</span>`)}</div></div>`:H.nothing} ${a.affirmation?H.html`<p class="affirmation">${a.affirmation}</p>`:H.nothing} ${t.length?H.html`<div><p class="section-label">Pairs with</p><div class="chips">${t.map(o=>H.html`<span class="chip">${String(o).replace(/-/g," ")}</span>`)}</div></div>`:H.nothing}</article>`}attr(a,e){return e==null||e===""?H.nothing:H.html`<div class="attr"><dt>${a}</dt><dd>${e}</dd></div>`}list(a,e){return e?.length?H.html`<div class="attr"><dt>${a}</dt><dd>${e.join(", ")}</dd></div>`:H.nothing}renderMeaning(a){if(!a)return H.nothing;let r=[["Spiritual",a.spiritual],["Emotional",a.emotional],["Physical",a.physical]].filter(([,t])=>!!t);return r.length===0?H.nothing:H.html`<div class="meaning">${r.map(([t,s])=>H.html`<h3>${t}</h3><p>${s}</p>`)}</div>`}};fr.styles=[g,H.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{gap:var(--roxy-space-md,1rem);align-items:flex-start;display:flex}.photo{border-radius:var(--roxy-radius-md,8px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);flex:none;width:96px;height:96px}.title{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600)}.desc{line-height:1.55;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.attrs{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));display:grid}.attr{gap:2px;display:grid}.attr dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.attr dd{font-size:var(--roxy-text-sm,.875rem);margin:0;font-weight:500}.colors{flex-wrap:wrap;gap:.4rem;display:flex}.color{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;align-items:center;gap:.3rem;display:inline-flex}.dot{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:.7rem;height:.7rem}.meaning h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.meaning p{margin:0 0 var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);line-height:1.55}.chips{flex-wrap:wrap;gap:.3rem;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:1px 8px}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.affirmation{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-left:3px solid var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);font-style:italic;font-size:var(--roxy-text-sm,.875rem);border-radius:0 var(--roxy-radius-sm,4px) var(--roxy-radius-sm,4px) 0;margin:0}`],fr=d([(0,bt.customElement)("roxy-crystal-card")],fr);var Ee=require("lit"),pa=require("lit/decorators.js");var vs=["January","February","March","April","May","June","July","August","September","October","November","December"],qe=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Ee.html`<div class="roxy-empty" role="status">No crystals</div>`}renderData(e){let r=e.crystals??[];if(r.length===0)return this.renderEmpty();let t=this.heading||this.deriveHeading(e),s="total"in e&&typeof e.total=="number"?e.total:r.length;return Ee.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(o=>Ee.html`<li class="tile">${o.imageUrl?Ee.html`<img class="photo" src="${o.imageUrl}" alt="${o.name??"Crystal"}" loading="lazy">`:Ee.html`<div class="photo" aria-hidden="true"></div>`}<p class="name">${o.name}</p>${o.colors&&o.colors.length>0?Ee.html`<div class="colors" aria-label="${`Colours: ${o.colors.join(", ")}`}">${o.colors.map(i=>Ee.html`<span class="swatch" style="${`background:${$s(i)}`}" title="${i}"></span>`)}</div>`:Ee.nothing}</li>`)}</ul></section>`}deriveHeading(e){return"chakra"in e&&e.chakra?`${e.chakra} chakra crystals`:"element"in e&&e.element?`${e.element} element crystals`:"sign"in e&&e.sign?`Crystals for ${e.sign}`:"month"in e&&typeof e.month=="number"?`${vs[e.month-1]??""} birthstones`.trim():"Crystals"}};qe.styles=[g,Ee.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.photo{aspect-ratio:1;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.colors{flex-wrap:wrap;gap:4px;display:flex}.swatch{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:10px;height:10px}`],d([(0,pa.property)({type:String,reflect:!0})],qe.prototype,"heading",2),qe=d([(0,pa.customElement)("roxy-crystal-grid")],qe);function $s(n){return n.trim().toLowerCase().replace(/\s+/g,"")}var R=require("lit"),ma=require("lit/decorators.js");var Ve=class extends m{constructor(){super(...arguments);this.period="current"}renderEmpty(){return R.html`<div class="roxy-empty" role="status">No dasha data</div>`}renderData(e){let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(s=>s.durationYears)):0;return R.html`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?R.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?R.html`(lord ${e.nakshatraLord})`:R.nothing}</div>`:R.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):R.nothing} ${r.length>0?R.html`<div class="timeline" role="list">${r.map(s=>this.renderBar(s,t))}</div>`:R.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return R.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",s=r.years??0,o=r.months??0,i=r.days??0,l=[];s&&l.push(`${s}y`),o&&l.push(`${o}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return R.html`<p class="balance">Birth dasha balance: ${c} of ${t?R.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?R.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:R.nothing}renderCurrent(e){return"mahadasha"in e?R.html`<div class="current">${"mahadasha"in e&&e.mahadasha?R.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?R.html`<small>${f(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing} ${"antardasha"in e&&e.antardasha?R.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?R.html`<small>${f(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?R.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?R.html`<small>${f(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing}</div>`:R.nothing}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),s=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(s)?!1:r>=t&&r<s}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),s=Date.now();return Number.isNaN(r)||Number.isNaN(t)||s<r||s>=t||t<=r?-1:(s-r)/(t-r)}renderBar(e,r){let t=e.durationYears,s=r>0?t/r*100:0,o=this.isCurrent(e),i=o?this.progressIn(e):-1,l=o?"bar-track bar-now":"bar-track";return R.html`<div class="${o?"bar now":"bar"}" role="listitem" aria-current="${o?"time":"false"}"><span><strong>${e.planet}</strong>${o?R.html`<span class="now-badge">Now</span>`:R.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${s}%"></span> ${i>=0?R.html`<span class="bar-progress" style="left:${i*s}%" aria-hidden="true"></span>`:R.nothing} </span><span class="dates">${e.startDate?vt(e.startDate):""} ${e.endDate?R.html`- ${vt(e.endDate)}`:""}</span></div>`}};Ve.styles=[g,R.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([(0,ma.property)({type:String,reflect:!0})],Ve.prototype,"period",2),Ve=d([(0,ma.customElement)("roxy-dasha-timeline")],Ve);function vt(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var L=require("lit"),ga=require("lit/decorators.js");var ws=["title","name","label","heading","overview","summary"],ks=["imageUrl","image","icon","symbol"],Ss=["imageUrl","image"],Rs=6,Ye=class extends m{constructor(){super(...arguments);this.depth=0}renderData(e){return this.depth>=Rs?L.html`<div class="roxy-empty" role="status">…</div>`:L.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(e)}</div>`}renderValue(e){return e==null?L.nothing:typeof e=="string"?L.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?L.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?L.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(s=>s===null||["string","number","boolean"].includes(typeof s))?L.html`<ul class="roxy-chips">${e.map(s=>L.html`<li>${String(s)}</li>`)}</ul>`:e.every(s=>s!==null&&typeof s=="object"&&!Array.isArray(s))?this.renderTable(e):L.html`<ol>${e.map(s=>L.html`<li>${this.renderValue(s)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return L.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>L.html`<th>${Y(t)}</th>`)}</tr></thead><tbody>${e.map(t=>L.html`<tr>${r.map(s=>L.html`<td>${this.formatPrimitive(t[s])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=ws.find(i=>typeof e[i]=="string"),t=ks.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),s=r!=="summary"&&typeof e.summary=="string"?"summary":null,o=Object.entries(e).filter(([i,l])=>i!==r&&i!==s&&!Ss.includes(i)&&l!==null&&l!==void 0);return L.html`${t?L.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:L.nothing} ${r?L.html`<h3 class="roxy-title">${e[r]}</h3>`:L.nothing} ${s?L.html`<p class="roxy-summary">${e[s]}</p>`:L.nothing} ${o.length>0?L.html`<dl class="roxy-rows">${o.map(([i,l])=>L.html`<dt>${Y(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:L.nothing}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?L.html`<ul class="roxy-chips">${e.map(t=>L.html`<li>${String(t)}</li>`)}</ul>`:L.html`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let s of Object.keys(t))r.add(s);return Array.from(r)}};Ye.styles=[g,L.css`.roxy-card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([(0,ga.property)({attribute:!1})],Ye.prototype,"depth",2),Ye=d([(0,ga.customElement)("roxy-data")],Ye);var be=require("lit"),va=require("lit/decorators.js");var T=require("lit");function Le(n){let a=n%360;return a<0?a+360:a}function Me(n){let a=Le(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),s=(r-t)*60,o=Math.floor(s),i=Math.round((s-o)*60);return{sign:te[e]??"Aries",signIndex:e,degree:t,minute:o,second:i}}function ya(n){let{sign:a,degree:e,minute:r}=Me(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function Ia(n){return Le(n+180)}function $t(n,a){let e=Le(n),r=Le(a)-e;return r<0&&(r+=360),Le(e+r/2)}function B(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}var br=require("lit"),Ue=br.css`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function Br(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:s,controls:o=!1}=n;return br.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=a.findIndex(j=>j.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,y=a[(c+p+a.length)%a.length];if(!y)return;r(y.id);let x=l.currentTarget.getRootNode();requestAnimationFrame(()=>{x.querySelector(`#${s}-tab-${y.id}`)?.focus()})}}">${a.map(l=>br.html`<button type="button" class="roxy-tab" role="tab" id="${s}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${o&&e===l.id?`${s}-panel-${l.id}`:br.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ze=400,I=20,de=ze-2*I,W=ze/2,wt=Object.fromEntries(te.map(n=>[n.toLowerCase(),n])),Cs=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Ts="\u02B3";function kt(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:Me(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function Es(n,a){let e=ot[h(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?Ts:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||kt(n,a))return`${e}${r}`;let{degree:t}=Me(n.longitude);return`${e} ${t}\xB0${r}`}function Ds(n,a){let e=[h(n.graha)],r=kt(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=Me(n.longitude),s=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${s}' ${t.sign}`:`${t.degree}\xB0${s}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Ka(n,a,e,r,t){let s=r-(n.length-1)*t/2;return n.map((o,i)=>{let l=s+i*t;return T.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${Es(o,a)}<title>${Ds(o,a)}</title></text>`})}function xa(n,a,e){let r={};for(let o of te)r[o.toLowerCase()]=[];let t=e?wt[e.toLowerCase()]??"":"",s=t;for(let[o,i]of Object.entries(n??{})){let l=(i?.rashi??"").toLowerCase();if(o==="Lagna"||i?.graha==="Lagna"){t||(s=wt[l]??"");continue}!l||!(l in r)||r[l]?.push({graha:i.graha??o,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:s,placements:r,divisionLabel:a}}var vr=de/4,Ps={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function zs(n){let a=Ps[n]??{col:0,row:0};return{x:I+a.col*vr,y:I+a.row*vr,w:vr,h:vr}}function As(n){let a=I,e=I+vr,r=I+2*vr,t=I+3*vr,s=ze-I;return T.svg`
|
|
11
|
-
<rect class="line" x=${a} y=${a} width=${
|
|
11
|
+
</g>`})}function ao(n,a){let e=[];for(let[r,t]of Object.entries(lt)){let s=Number(r);if(!n.has(s))continue;let o=a.get(s);e.push(De.svg`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${s}${o?De.svg`<title>${o}</title>`:De.nothing}</text>`)}return e}function Ft(n,a){return Kt(n,a)}var Zt=`0 0 ${_t} ${Ks}`;function Yt(n){return De.svg`
|
|
12
|
+
${Js()}
|
|
13
|
+
${Xs(n.activeChannels,n.activeGates)}
|
|
14
|
+
${ro(n.definedCenters)}
|
|
15
|
+
${ao(n.activeGates,n.gateTitles)}
|
|
16
|
+
`}var Mr=class extends m{renderEmpty(){return J.html`<div class="roxy-empty" role="status">No bodygraph data</div>`}renderData(a){let e=new Set((a.centers??[]).filter(o=>o.defined).map(o=>o.id)),r=new Set((a.gates??[]).map(o=>o.gate).filter(o=>o!=null)),t=new Set((a.channels??[]).map(o=>Ft(o.gateA,o.gateB))),s=this.buildGateTitles(a.gates??[]);return J.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${a.type?J.html`<div class="type-line">${a.type}${a.profile?J.html`· Profile ${a.profile}`:J.nothing}</div>`:J.nothing}</header><div class="layout"><svg viewBox="${Zt}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Yt({definedCenters:e,activeChannels:t,activeGates:r,gateTitles:s})}</svg> ${this.renderSummary(a)}</div></div>`}buildGateTitles(a){let e=new Map;for(let r of a){if(r.gate==null)continue;let t=[`Gate ${r.gate}`];r.line!=null&&(t[0]+=`.${r.line}`),r.gateName&&t.push(r.gateName);let s=r.planet?u(r.planet):"",o=s?C[s]??s:"";o&&t.push(`${o} ${r.side??""}`.trim()),e.set(r.gate,t.join(" \xB7 "))}return e}renderSummary(a){let e=[{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile},{label:"Definition",value:a.definition}],r=a.incarnationCross;return J.html`<div class="summary"><div class="facts">${e.map(t=>t.value?J.html`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:J.nothing)}</div>${r?.name?J.html`<p class="cross">${r.name} ${r.gates?.length?J.html`<span class="gates">(${r.gates.join(", ")})</span>`:J.nothing}</p>`:J.nothing} ${a.signature||a.notSelf?J.html`<div class="themes">${a.signature?J.html`<span class="pill pill--good">Signature: ${a.signature}</span>`:J.nothing} ${a.notSelf?J.html`<span class="pill pill--shadow">Not-self: ${a.notSelf}</span>`:J.nothing}</div>`:J.nothing}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};Mr.styles=[y,J.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:var(--roxy-chart-max-width,340px);height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],Mr=d([(0,Vt.customElement)("roxy-bodygraph")],Mr);var fe=require("lit"),Ut=require("lit/decorators.js");function qt(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var zr=class extends m{isCurrent(a){let e=Date.now(),r=Date.parse(a.start),t=Date.parse(a.end);return Number.isNaN(r)||Number.isNaN(t)?!1:e>=r&&e<t}renderTile(a){let e=a.effect==="Good"?"good":a.effect==="Bad"?"bad":"neutral",r=this.isCurrent(a),t=C[u(a.lord)]??"",s=`${qt(a.start)} - ${qt(a.end)}`;return fe.html`<div class="cho-tile ${e}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${a.name}${r?fe.html`<span class="now-badge">Now</span>`:fe.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?fe.html`<span aria-hidden="true">${t}</span>`:fe.nothing} ${a.lord}</span></div>`}renderEmpty(){return fe.html`<div class="roxy-empty" role="status">No choghadiya data</div>`}renderData(a){let{date:e,dayChoghadiya:r,nightChoghadiya:t}=a;return fe.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?fe.html`<p class="subtitle">${e}</p>`:fe.nothing}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(s=>this.renderTile(s)):fe.html`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(s=>this.renderTile(s)):fe.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};zr.styles=[y,fe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],zr=d([(0,Ut.customElement)("roxy-choghadiya-grid")],zr);var P=require("lit"),Aa=require("lit/decorators.js");var Qe=class extends m{constructor(){super(...arguments);this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,s]of Object.entries(e.categories))typeof s=="number"&&Number.isFinite(s)&&(r[t]=s);return r}return{}}renderEmpty(){return P.html`<div class="roxy-empty" role="status">No compatibility data</div>`}renderData(e){let r=e.overallScore,t=this.getBreakdown(),s="rating"in e?e.rating:void 0,o="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,p="strengths"in e?e.strengths:void 0,g="challenges"in e?e.challenges:void 0,h="keyAspects"in e?e.keyAspects:void 0;return P.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?P.html`<div class="score">${L(r,0)}</div>`:P.nothing} ${s?P.html`<div class="rating">${s}</div>`:P.nothing}</div></div>${Object.keys(t).length>0?P.html`<div role="list">${Object.entries(t).map(([k,f])=>P.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${k}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,f))}%"></span></span> <span>${L(f,0)}</span></div>`)}</div>`:P.nothing} ${o?P.html`<p><span class="archetype">${o.label}</span> ${o.description?P.html`· ${o.description}`:P.nothing}</p>`:P.nothing} ${l?P.html`<p>${l}</p>`:P.nothing} ${c&&!l?P.html`<p>${c}</p>`:P.nothing} ${i?P.html`<p>${i}</p>`:P.nothing} ${(p?.length??0)>0||(g?.length??0)>0?P.html`<div class="lists">${p?.length?P.html`<div><h3>Strengths</h3><ul>${p.map(k=>P.html`<li>${k}</li>`)}</ul></div>`:P.nothing} ${g?.length?P.html`<div><h3>Challenges</h3><ul>${g.map(k=>P.html`<li>${k}</li>`)}</ul></div>`:P.nothing}</div>`:P.nothing} ${h?.length?P.html`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${h.slice(0,6).map(k=>P.html`<li>${to(k)}</li>`)}</ul></div>`:P.nothing}</article>`}};Qe.styles=[y,P.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([(0,Aa.property)({type:String,reflect:!0})],Qe.prototype,"mode",2),Qe=d([(0,Aa.customElement)("roxy-compatibility-card")],Qe);function to(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${L(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}var I=require("lit"),Wt=require("lit/decorators.js");var so=["January","February","March","April","May","June","July","August","September","October","November","December"],Tr=class extends m{renderEmpty(){return I.html`<div class="roxy-empty" role="status">No crystal data</div>`}renderData(a){let e=a.colors??[],r=a.keywords??[],t=a.pairsWith??[],s=typeof a.birthMonth=="number"?so[a.birthMonth-1]:void 0;return I.html`<article class="wrap" aria-label="${a.name??"Crystal"}"><div class="hero">${a.imageUrl?I.html`<img class="photo" src="${a.imageUrl}" alt="${a.name??"Crystal"}" loading="lazy">`:I.nothing}<div><h2 class="title">${a.name}</h2>${a.description?I.html`<p class="desc">${a.description}</p>`:I.nothing}</div></div><dl class="attrs">${this.attr("Planet",a.planet)} ${this.attr("Hardness",typeof a.hardness=="number"?`${a.hardness} Mohs`:void 0)} ${this.attr("Vibration",a.numericalVibration)} ${this.attr("Birthstone",s)} ${this.list("Chakras",a.chakras)} ${this.list("Zodiac",a.zodiacSigns)} ${this.list("Elements",a.elements)} ${e.length?I.html`<div class="attr"><dt>Colors</dt><dd><div class="colors">${e.map(o=>I.html`<span class="color"><span class="dot" style="background:${o}"></span>${o}</span>`)}</div></dd></div>`:I.nothing}</dl>${this.renderMeaning(a.meaning)} ${r.length?I.html`<div><p class="section-label">Keywords</p><div class="chips">${r.map(o=>I.html`<span class="chip">${o}</span>`)}</div></div>`:I.nothing} ${a.affirmation?I.html`<p class="affirmation">${a.affirmation}</p>`:I.nothing} ${t.length?I.html`<div><p class="section-label">Pairs with</p><div class="chips">${t.map(o=>I.html`<span class="chip">${String(o).replace(/-/g," ")}</span>`)}</div></div>`:I.nothing}</article>`}attr(a,e){return e==null||e===""?I.nothing:I.html`<div class="attr"><dt>${a}</dt><dd>${e}</dd></div>`}list(a,e){return e?.length?I.html`<div class="attr"><dt>${a}</dt><dd>${e.join(", ")}</dd></div>`:I.nothing}renderMeaning(a){if(!a)return I.nothing;let r=[["Spiritual",a.spiritual],["Emotional",a.emotional],["Physical",a.physical]].filter(([,t])=>!!t);return r.length===0?I.nothing:I.html`<div class="meaning">${r.map(([t,s])=>I.html`<h3>${t}</h3><p>${s}</p>`)}</div>`}};Tr.styles=[y,I.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{gap:var(--roxy-space-md,1rem);align-items:flex-start;display:flex}.photo{border-radius:var(--roxy-radius-md,8px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);flex:none;width:96px;height:96px}.title{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600)}.desc{line-height:1.55;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.attrs{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));display:grid}.attr{gap:2px;display:grid}.attr dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.attr dd{font-size:var(--roxy-text-sm,.875rem);margin:0;font-weight:500}.colors{flex-wrap:wrap;gap:.4rem;display:flex}.color{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;align-items:center;gap:.3rem;display:inline-flex}.dot{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:.7rem;height:.7rem}.meaning h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.meaning p{margin:0 0 var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);line-height:1.55}.chips{flex-wrap:wrap;gap:.3rem;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:1px 8px}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.affirmation{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-left:3px solid var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);font-style:italic;font-size:var(--roxy-text-sm,.875rem);border-radius:0 var(--roxy-radius-sm,4px) var(--roxy-radius-sm,4px) 0;margin:0}`],Tr=d([(0,Wt.customElement)("roxy-crystal-card")],Tr);var Ne=require("lit"),Pa=require("lit/decorators.js");var oo=["January","February","March","April","May","June","July","August","September","October","November","December"],er=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Ne.html`<div class="roxy-empty" role="status">No crystals</div>`}renderData(e){let r=e.crystals??[];if(r.length===0)return this.renderEmpty();let t=this.heading||this.deriveHeading(e),s="total"in e&&typeof e.total=="number"?e.total:r.length;return Ne.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(o=>Ne.html`<li class="tile">${o.imageUrl?Ne.html`<img class="photo" src="${o.imageUrl}" alt="${o.name??"Crystal"}" loading="lazy">`:Ne.html`<div class="photo" aria-hidden="true"></div>`}<p class="name">${o.name}</p>${o.colors&&o.colors.length>0?Ne.html`<div class="colors" aria-label="${`Colours: ${o.colors.join(", ")}`}">${o.colors.map(i=>Ne.html`<span class="swatch" style="${`background:${no(i)}`}" title="${i}"></span>`)}</div>`:Ne.nothing}</li>`)}</ul></section>`}deriveHeading(e){return"chakra"in e&&e.chakra?`${e.chakra} chakra crystals`:"element"in e&&e.element?`${e.element} element crystals`:"sign"in e&&e.sign?`Crystals for ${e.sign}`:"month"in e&&typeof e.month=="number"?`${oo[e.month-1]??""} birthstones`.trim():"Crystals"}};er.styles=[y,Ne.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.photo{aspect-ratio:1;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.colors{flex-wrap:wrap;gap:4px;display:flex}.swatch{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:10px;height:10px}`],d([(0,Pa.property)({type:String,reflect:!0})],er.prototype,"heading",2),er=d([(0,Pa.customElement)("roxy-crystal-grid")],er);function no(n){return n.trim().toLowerCase().replace(/\s+/g,"")}var M=require("lit"),Da=require("lit/decorators.js");var rr=class extends m{constructor(){super(...arguments);this.period="current"}renderEmpty(){return M.html`<div class="roxy-empty" role="status">No dasha data</div>`}renderData(e){let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(s=>s.durationYears)):0;return M.html`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?M.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?M.html`(lord ${e.nakshatraLord})`:M.nothing}</div>`:M.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):M.nothing} ${r.length>0?M.html`<div class="timeline" role="list">${r.map(s=>this.renderBar(s,t))}</div>`:M.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return M.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",s=r.years??0,o=r.months??0,i=r.days??0,l=[];s&&l.push(`${s}y`),o&&l.push(`${o}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return M.html`<p class="balance">Birth dasha balance: ${c} of ${t?M.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?M.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:M.nothing}renderCurrent(e){return"mahadasha"in e?M.html`<div class="current">${"mahadasha"in e&&e.mahadasha?M.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?M.html`<small>${L(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:M.nothing}</div>`:M.nothing} ${"antardasha"in e&&e.antardasha?M.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?M.html`<small>${L(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:M.nothing}</div>`:M.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?M.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?M.html`<small>${L(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:M.nothing}</div>`:M.nothing}</div>`:M.nothing}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),s=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(s)?!1:r>=t&&r<s}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),s=Date.now();return Number.isNaN(r)||Number.isNaN(t)||s<r||s>=t||t<=r?-1:(s-r)/(t-r)}renderBar(e,r){let t=e.durationYears,s=r>0?t/r*100:0,o=this.isCurrent(e),i=o?this.progressIn(e):-1,l=o?"bar-track bar-now":"bar-track";return M.html`<div class="${o?"bar now":"bar"}" role="listitem" aria-current="${o?"time":"false"}"><span><strong>${e.planet}</strong>${o?M.html`<span class="now-badge">Now</span>`:M.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${s}%"></span> ${i>=0?M.html`<span class="bar-progress" style="left:${i*s}%" aria-hidden="true"></span>`:M.nothing} </span><span class="dates">${e.startDate?Jt(e.startDate):""} ${e.endDate?M.html`- ${Jt(e.endDate)}`:""}</span></div>`}};rr.styles=[y,M.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([(0,Da.property)({type:String,reflect:!0})],rr.prototype,"period",2),rr=d([(0,Da.customElement)("roxy-dasha-timeline")],rr);function Jt(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var O=require("lit"),Na=require("lit/decorators.js");var io=["title","name","label","heading","overview","summary"],lo=["imageUrl","image","icon","symbol"],co=["imageUrl","image"],po=6,ar=class extends m{constructor(){super(...arguments);this.depth=0}renderData(e){return this.depth>=po?O.html`<div class="roxy-empty" role="status">…</div>`:O.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(e)}</div>`}renderValue(e){return e==null?O.nothing:typeof e=="string"?O.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?O.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?O.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(s=>s===null||["string","number","boolean"].includes(typeof s))?O.html`<ul class="roxy-chips">${e.map(s=>O.html`<li>${String(s)}</li>`)}</ul>`:e.every(s=>s!==null&&typeof s=="object"&&!Array.isArray(s))?this.renderTable(e):O.html`<ol>${e.map(s=>O.html`<li>${this.renderValue(s)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return O.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>O.html`<th>${W(t)}</th>`)}</tr></thead><tbody>${e.map(t=>O.html`<tr>${r.map(s=>O.html`<td>${this.formatPrimitive(t[s])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=io.find(i=>typeof e[i]=="string"),t=lo.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),s=r!=="summary"&&typeof e.summary=="string"?"summary":null,o=Object.entries(e).filter(([i,l])=>i!==r&&i!==s&&!co.includes(i)&&l!==null&&l!==void 0);return O.html`${t?O.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:O.nothing} ${r?O.html`<h3 class="roxy-title">${e[r]}</h3>`:O.nothing} ${s?O.html`<p class="roxy-summary">${e[s]}</p>`:O.nothing} ${o.length>0?O.html`<dl class="roxy-rows">${o.map(([i,l])=>O.html`<dt>${W(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:O.nothing}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?O.html`<ul class="roxy-chips">${e.map(t=>O.html`<li>${String(t)}</li>`)}</ul>`:O.html`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let s of Object.keys(t))r.add(s);return Array.from(r)}};ar.styles=[y,O.css`.roxy-card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([(0,Na.property)({attribute:!1})],ar.prototype,"depth",2),ar=d([(0,Na.customElement)("roxy-data")],ar);var Me=require("lit"),_a=require("lit/decorators.js");var T=require("lit");function Ke(n){let a=n%360;return a<0?a+360:a}function Ge(n){let a=Ke(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),s=(r-t)*60,o=Math.floor(s),i=Math.round((s-o)*60);return{sign:de[e]??"Aries",signIndex:e,degree:t,minute:o,second:i}}function Ga(n){let{sign:a,degree:e,minute:r}=Ge(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function ua(n){let a=Math.floor(n),e=Math.round((n-a)*60);return e===60&&(e=0,a+=1),`${a}\xB0${String(e).padStart(2,"0")}'`}function ct(n){return Ke(n+180)}function Xt(n,a){let e=Ke(n),r=Ke(a)-e;return r<0&&(r+=360),Ke(e+r/2)}function K(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}var Er=require("lit"),tr=Er.css`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function oa(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:s,controls:o=!1}=n;return Er.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=a.findIndex(k=>k.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,g=a[(c+p+a.length)%a.length];if(!g)return;r(g.id);let h=l.currentTarget.getRootNode();requestAnimationFrame(()=>{h.querySelector(`#${s}-tab-${g.id}`)?.focus()})}}">${a.map(l=>Er.html`<button type="button" class="roxy-tab" role="tab" id="${s}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${o&&e===l.id?`${s}-panel-${l.id}`:Er.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var Be=400,F=20,he=Be-2*F,X=Be/2,Qt=Object.fromEntries(de.map(n=>[n.toLowerCase(),n])),mo=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],go="\u02B3";function es(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:Ge(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function yo(n,a){let e=zt[u(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?go:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||es(n,a))return`${e}${r}`;let{degree:t}=Ge(n.longitude);return`${e} ${t}\xB0${r}`}function uo(n,a){let e=[u(n.graha)],r=es(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=Ge(n.longitude),s=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${s}' ${t.sign}`:`${t.degree}\xB0${s}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function pt(n,a,e,r,t){let s=r-(n.length-1)*t/2;return n.map((o,i)=>{let l=s+i*t;return T.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${yo(o,a)}<title>${uo(o,a)}</title></text>`})}function Oa(n,a,e){let r={};for(let o of de)r[o.toLowerCase()]=[];let t=e?Qt[e.toLowerCase()]??"":"",s=t;for(let[o,i]of Object.entries(n??{})){let l=(i?.rashi??"").toLowerCase();if(o==="Lagna"||i?.graha==="Lagna"){t||(s=Qt[l]??"");continue}!l||!(l in r)||r[l]?.push({graha:i.graha??o,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:s,placements:r,divisionLabel:a}}var Ar=he/4,xo={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function ho(n){let a=xo[n]??{col:0,row:0};return{x:F+a.col*Ar,y:F+a.row*Ar,w:Ar,h:Ar}}function Lo(n){let a=F,e=F+Ar,r=F+2*Ar,t=F+3*Ar,s=Be-F;return T.svg`
|
|
17
|
+
<rect class="line" x=${a} y=${a} width=${he} height=${he} stroke-width="1.5" fill="none" />
|
|
12
18
|
<line class="line" x1=${a} y1=${e} x2=${s} y2=${e} stroke-width="1" />
|
|
13
19
|
<line class="line" x1=${a} y1=${t} x2=${s} y2=${t} stroke-width="1" />
|
|
14
20
|
<line class="line" x1=${e} y1=${a} x2=${e} y2=${s} stroke-width="1" />
|
|
@@ -17,8 +23,8 @@
|
|
|
17
23
|
<line class="line" x1=${t} y1=${r} x2=${s} y2=${r} stroke-width="1" />
|
|
18
24
|
<line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
|
|
19
25
|
<line class="line" x1=${r} y1=${t} x2=${r} y2=${s} stroke-width="1" />
|
|
20
|
-
${n?T.svg`<text class="centre-label" x=${
|
|
21
|
-
`}function
|
|
26
|
+
${n?T.svg`<text class="centre-label" x=${X} y=${X} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
|
|
27
|
+
`}function rs(n,a){let e=de.findIndex(t=>t===a),r=de.findIndex(t=>t===n);return e===-1||r===-1?0:(r-e+12)%12+1}function fo(n,a,e,r){let t=ho(n),s=t.x+t.w/2,o=t.y+t.h/2,i=wa[n]??n.slice(0,2),l=14;return T.svg`
|
|
22
28
|
<g class=${e?"cell lagna":"cell"}>
|
|
23
29
|
${e?T.svg`
|
|
24
30
|
<rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
|
|
@@ -27,28 +33,28 @@
|
|
|
27
33
|
<text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
|
|
28
34
|
${r>0?T.svg`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:T.nothing}
|
|
29
35
|
${e?T.svg`<text class="lagna-marker" x=${s} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
|
|
30
|
-
${a.length?
|
|
36
|
+
${a.length?pt(a,n,s,o+4,14):T.nothing}
|
|
31
37
|
</g>
|
|
32
|
-
`}function
|
|
33
|
-
${
|
|
34
|
-
${
|
|
35
|
-
`}var
|
|
36
|
-
<rect class="line" x=${a.x} y=${a.y} width=${
|
|
38
|
+
`}function bo(n){let a=n.lagnaSign.toLowerCase();return T.svg`
|
|
39
|
+
${Lo(n.divisionLabel)}
|
|
40
|
+
${de.map(e=>fo(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,rs(e,n.lagnaSign)))}
|
|
41
|
+
`}var _={tl:{x:F,y:F},tr:{x:Be-F,y:F},br:{x:Be-F,y:Be-F},bl:{x:F,y:Be-F},top:{x:X,y:F},right:{x:Be-F,y:X},bottom:{x:X,y:Be-F},left:{x:F,y:X},tlMid:{x:X-he/4,y:X-he/4},trMid:{x:X+he/4,y:X-he/4},brMid:{x:X+he/4,y:X+he/4},blMid:{x:X-he/4,y:X+he/4}};function Ye(n){let a=n.reduce((r,t)=>r+t.x,0)/n.length,e=n.reduce((r,t)=>r+t.y,0)/n.length;return{x:a,y:e}}var vo={1:{x:X,y:_.tlMid.y},2:Ye([_.tl,_.top,_.tlMid]),3:Ye([_.tl,_.left,_.tlMid]),4:{x:_.tlMid.x,y:X},5:Ye([_.bl,_.left,_.blMid]),6:Ye([_.bl,_.bottom,_.blMid]),7:{x:X,y:_.blMid.y},8:Ye([_.br,_.bottom,_.brMid]),9:Ye([_.br,_.right,_.brMid]),10:{x:_.brMid.x,y:X},11:Ye([_.tr,_.right,_.trMid]),12:Ye([_.tr,_.top,_.trMid])};function $o(n,a){let e=de.findIndex(r=>r===a);return e===-1?n:(e+n-1)%12+1}function wo(n){let{tl:a,tr:e,br:r,bl:t,top:s,right:o,bottom:i,left:l}=_;return T.svg`
|
|
42
|
+
<rect class="line" x=${a.x} y=${a.y} width=${he} height=${he} stroke-width="1.5" fill="none" />
|
|
37
43
|
<polygon class="line" points="${s.x},${s.y} ${o.x},${o.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
|
|
38
44
|
<line class="line" x1=${a.x} y1=${a.y} x2=${r.x} y2=${r.y} stroke-width="1" />
|
|
39
45
|
<line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
|
|
40
|
-
${n?T.svg`<text class="centre-label" x=${
|
|
41
|
-
`}function
|
|
46
|
+
${n?T.svg`<text class="centre-label" x=${X} y=${X} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
|
|
47
|
+
`}function ko(n,a,e,r,t){let s=vo[n];if(!s)return T.svg``;let o=Math.min(14,Math.abs(s.y-X)*.45+6),i=o+12,l=t?`${a} \xB7 ${wa[e]??e.slice(0,2)}`:`${a}`;return T.svg`
|
|
42
48
|
<g class=${t?"cell lagna":"cell"}>
|
|
43
49
|
<text class="rashi-num" x=${s.x} y=${s.y-o} text-anchor="middle" dominant-baseline="central">${l}</text>
|
|
44
50
|
${t?T.svg`<text class="lagna-marker" x=${s.x} y=${s.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
|
|
45
|
-
${r.length?
|
|
51
|
+
${r.length?pt(r,e,s.x,s.y+8,12):T.nothing}
|
|
46
52
|
</g>
|
|
47
|
-
`}function
|
|
48
|
-
${
|
|
49
|
-
${Array.from({length:12},(e,r)=>{let t=r+1,s
|
|
50
|
-
`}var
|
|
51
|
-
<rect class="line" x=${a} y=${a} width=${
|
|
53
|
+
`}function So(n){let a=n.lagnaSign||"Aries";return T.svg`
|
|
54
|
+
${wo(n.divisionLabel)}
|
|
55
|
+
${Array.from({length:12},(e,r)=>{let t=r+1,s=$o(t,a),o=de[s-1]??"Aries";return ko(t,s,o,n.placements[o.toLowerCase()]??[],t===1)})}
|
|
56
|
+
`}var Ha=he/3;function Ro(){let n=F,a=F+Ha,e=F+2*Ha,r=Be-F,je={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:r}],Virgo:[{x:a,y:e},{x:a,y:r},{x:n,y:r}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:r},{x:a,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:a},{x:r,y:a},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:n},{x:r,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:r,y:n},{x:e,y:a}]},ca={};for(let[ha,La]of Object.entries(je))ca[ha]={points:[...La],centroid:Ye(La)};return ca}var Co=Ro();function Mo(n){let a=F,e=F+Ha,r=F+2*Ha,t=Be-F;return T.svg`
|
|
57
|
+
<rect class="line" x=${a} y=${a} width=${he} height=${he} stroke-width="1.5" fill="none" />
|
|
52
58
|
<line class="line" x1=${a} y1=${e} x2=${e} y2=${e} stroke-width="1" />
|
|
53
59
|
<line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
|
|
54
60
|
<line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
@@ -61,32 +67,38 @@
|
|
|
61
67
|
<line class="line" x1=${t} y1=${a} x2=${r} y2=${e} stroke-width="1" />
|
|
62
68
|
<line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
|
|
63
69
|
<line class="line" x1=${a} y1=${t} x2=${e} y2=${r} stroke-width="1" />
|
|
64
|
-
${n?T.svg`<text class="centre-label" x=${
|
|
65
|
-
`}function
|
|
70
|
+
${n?T.svg`<text class="centre-label" x=${X} y=${X} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
|
|
71
|
+
`}function zo(n,a,e,r){let t=Co[n];if(!t)return T.svg``;let{centroid:s,points:o}=t,i=wa[n]??n.slice(0,2),l=o.map(c=>`${c.x},${c.y}`).join(" ");return T.svg`
|
|
66
72
|
<g class=${e?"cell lagna":"cell"}>
|
|
67
73
|
${e?T.svg`<polygon class="lagna-bg" points=${l} />`:T.nothing}
|
|
68
74
|
<text class="sign-text" x=${s.x} y=${s.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
|
|
69
75
|
${r>0?T.svg`<text class="house-num" x=${s.x+18} y=${s.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:T.nothing}
|
|
70
76
|
${e?T.svg`<text class="lagna-marker" x=${s.x} y=${s.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
|
|
71
|
-
${a.length?
|
|
77
|
+
${a.length?pt(a,n,s.x,s.y+4,12):T.nothing}
|
|
72
78
|
</g>
|
|
73
|
-
`}function
|
|
74
|
-
${
|
|
75
|
-
${
|
|
76
|
-
`}function ha(n,a){switch(a){case"north":return js(n);case"east":return Fs(n);default:return Ls(n)}}function fa(n,a){return Br({items:Cs,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var Rt=require("lit"),ba=Rt.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var We=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return xa(this.data.chart.meta,r)}renderEmpty(){return be.html`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let{division:t,vargottama:s}=e;return be.html`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?be.html`<span class="division-meta">· ${t.sanskritName}</span>`:be.nothing}</h2>${t.significance?be.html`<p class="significance">${t.significance}</p>`:be.nothing}</div>${fa(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${ha(r,this.chartStyle)}</svg> ${s&&s.length>0?be.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>be.html`<span class="vargottama-pill" role="listitem">${N[o]??""} ${o}</span>`)}</div>`:be.nothing}</div>`}};We.styles=[g,ba,Ue,be.css`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],d([(0,va.property)({type:String,reflect:!0,attribute:"chart-style"})],We.prototype,"chartStyle",2),We=d([(0,va.customElement)("roxy-divisional-chart")],We);var ae=require("lit"),$a=require("lit/decorators.js");var qs={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Je=class extends m{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return ae.html`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=qs[this.type]??this.type,s=(e.severity??"").toLowerCase(),o=s==="severe"?3:s==="moderate"?2:s==="mild"?1:0,i=o*33,l=o===3?"var(--roxy-danger)":o===2?"var(--roxy-warning)":o===1?"var(--roxy-success)":"transparent";return ae.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?ae.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${o}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:ae.nothing} ${e.description?ae.html`<p class="description">${e.description}</p>`:ae.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?ae.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>ae.html`<li>${c}</li>`)}</ul></div>`:ae.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?ae.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>ae.html`<li>${c}</li>`)}</ul></div>`:ae.nothing}</article>`}renderEffects(e){if(!e.effects)return ae.nothing;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?ae.nothing:ae.html`<div class="effects">${r.map(([t,s])=>ae.html`<div><h3>${t}</h3><p>${s}</p></div>`)}</div>`}};Je.styles=[g,ae.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([(0,$a.property)({type:String,reflect:!0})],Je.prototype,"type",2),Je=d([(0,$a.customElement)("roxy-dosha-card")],Je);var De=require("lit"),Ct=require("lit/decorators.js");var $r=class extends m{renderData(a){return De.html`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?De.html`<span class="letter" aria-hidden="true">${a.letter}</span>`:De.nothing}<div><p class="label">Dream symbol</p>${a.name?De.html`<h2 class="name">${a.name}</h2>`:De.nothing}</div></header>${a.meaning?De.html`<p class="meaning">${a.meaning}</p>`:De.nothing}</article>`}renderEmpty(){return De.html`<div class="roxy-empty" role="status">No dream symbol</div>`}};$r.styles=[g,De.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:2.5rem;height:2.5rem;color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-variant-numeric:tabular-nums;flex:none;justify-content:center;align-items:center;display:inline-flex}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}`],$r=d([(0,Ct.customElement)("roxy-dream-card")],$r);var Oe=require("lit"),Tt=require("lit/decorators.js");var wr=class extends m{renderEmpty(){return Oe.html`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(a){let e=a.symbols??[];if(e.length===0)return this.renderEmpty();let r=typeof a.total=="number"?a.total:e.length;return Oe.html`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${r} match${r===1?"":"es"}</span></header><ul class="grid">${e.map(t=>Oe.html`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?Oe.html`<span class="letter" aria-hidden="true">${t.letter}</span>`:Oe.nothing} <span class="name">${t.name}</span></button></li>`)}</ul></section>`}select(a){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:a.id,name:a.name,letter:a.letter},bubbles:!0,composed:!0}))}};wr.styles=[g,Oe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.result{align-items:center;gap:var(--roxy-space-sm,.5rem);text-align:left;width:100%;font:inherit;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;background:0 0;transition:border-color .12s,background .12s;display:flex}.result:hover,.result:focus-visible{border-color:var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);outline:none}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:1.6rem;height:1.6rem;color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;flex:none;place-items:center;display:grid}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:500}`],wr=d([(0,Tt.customElement)("roxy-dream-search")],wr);var Q=require("lit"),ve=require("lit/decorators.js");var _a=new Map;async function Vs(n){let a=_a.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw _a.delete(n),e}),_a.set(n,a)),a}var ce=class extends Q.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(s=>s.required).filter(s=>this.values[s.key]===void 0||this.values[s.key]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.key)},bubbles:!0,composed:!0}));return}let t={};for(let s of this.fields){let o=this.values[s.key];if(!(o===void 0||o===""))if(s.group){let i=t[s.group]??{};i[s.name]=o,t[s.group]=i}else t[s.name]=o}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:t},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Vs(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let s=e.components?.schemas??{},o=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,s)}if(i?.properties){let c=new Set(i.required??[]);for(let[p,y]of Object.entries(i.properties)){let x=this.resolve(y,s)??{};if(x.type==="object"&&x.properties){let j=new Set(x.required??[]);for(let[b,dr]of Object.entries(x.properties)){let Pe=this.resolve(dr,s)??{};o.push({key:`${p}.${b}`,name:b,group:p,type:this.fieldType(Pe),required:c.has(p)&&j.has(b),description:Pe.description,enum:Pe.enum,min:Pe.minimum,max:Pe.maximum,default:Pe.default})}}else o.push({key:p,name:p,type:this.fieldType(x),required:c.has(p),description:x.description,enum:x.enum,min:x.minimum,max:x.maximum,default:x.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let p=this.resolve(c.schema,s)??{};o.push({key:c.name,name:c.name,type:this.fieldType(p),required:!!c.required,description:p.description,enum:p.enum,default:p.default})}this.fields=o;let l={};for(let c of o){c.default!==void 0&&(l[c.key]=c.default);let p=c.group?this.initialValues?.[c.group]?.[c.name]:this.initialValues?.[c.name];p!==void 0&&(l[c.key]=p)}this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}groupHasLocation(e){let r=this.fields.filter(t=>t.group===e);return["latitude","longitude","timezone"].every(t=>r.some(s=>s.name===t))}onLocationFor(e){let r=e?`${e}.`:"";return t=>{let s=t.detail;s&&(this.values={...this.values,[`${r}latitude`]:s.latitude,[`${r}longitude`]:s.longitude,[`${r}timezone`]:s.timezone??s.utcOffset})}}render(){if(!this.loaded)return Q.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return Q.html`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return Q.nothing;let i=`roxy-form-${o.key}`;return Q.html`<div class="field"><label for="${i}">${Y(o.name)}${o.required?Q.html`<span class="req" aria-hidden="true">*</span>`:Q.nothing}</label> ${o.enum?Q.html`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>Q.html`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:Q.html`<input id="${i}" type="${this.htmlType(o.type)}" ?required="${o.required}" min="${o.min??""}" max="${o.max??""}" step="${o.type==="number"?"any":""}" .value="${this.values[o.key]??""}" @input="${l=>this.setValue(o.key,this.coerce(o.type,l.target.value))}">`} ${o.description?Q.html`<small class="help">${o.description}</small>`:Q.nothing}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?Q.html`<div class="location-block"><label>${o?`${Y(o)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(o)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:Q.nothing,s=o=>Q.html`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return Q.html`<form @submit="${this.onSubmit}"><h2 class="title">${Y(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):Q.html`<fieldset class="person-group"><legend>${Y(o)}</legend>${s(o)}</fieldset>`)} <button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};ce.styles=[g,Q.css`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.person-group{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);margin:0 0 var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);min-inline-size:0;display:grid}.person-group legend{padding:0 var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([(0,ve.property)({type:String,attribute:"data-endpoint"})],ce.prototype,"endpoint",2),d([(0,ve.property)({type:String})],ce.prototype,"method",2),d([(0,ve.property)({type:String,attribute:"spec-url"})],ce.prototype,"specUrl",2),d([(0,ve.property)({type:String,attribute:"submit-label"})],ce.prototype,"submitLabel",2),d([(0,ve.property)({attribute:!1})],ce.prototype,"initialValues",2),d([(0,ve.state)()],ce.prototype,"fields",2),d([(0,ve.state)()],ce.prototype,"values",2),d([(0,ve.state)()],ce.prototype,"loaded",2),d([(0,ve.state)()],ce.prototype,"specError",2),ce=d([(0,ve.customElement)("roxy-endpoint-form")],ce);var ge=require("lit"),Et=require("lit/decorators.js");var kr=class extends m{renderEmpty(){return ge.html`<div class="roxy-empty" role="status">No digest data</div>`}renderData(a){let e=a.windows??[];if(e.length===0)return this.renderEmpty();let r=[Ce(a.startDate),Ce(a.endDate)].filter(Boolean).join(" \u2013 ");return ge.html`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?ge.html`<p class="subtitle">${r}</p>`:ge.nothing}</div>${e.map(t=>this.renderWindow(t))}</div>`}windowLabel(a){return a===1?"Next 24 hours":typeof a=="number"?`Next ${a} days`:"Window"}renderWindow(a){let e=a.top??[],r=a.byDomain??{},t=Object.entries(r);return ge.html`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(a.days)}</span> <span class="window-count">${a.count??0} event${a.count===1?"":"s"}</span></div>${t.length>0?ge.html`<div class="domains">${t.map(([s,o])=>ge.html`<span class="domain-chip"><span class="swatch sw-${s}"></span>${Y(s)} ${o}</span>`)}</div>`:ge.nothing} ${e.length>0?ge.html`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:ge.html`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return ge.html`<div class="event" role="listitem"><span class="event-date">${Ce(a.date)}</span> <span class="event-desc">${a.description??Y(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${f(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};kr.styles=[g,ge.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.window{gap:var(--roxy-space-sm,.5rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);display:grid}.window:first-of-type{border-top:none;padding-top:0}.window-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.window-label{font-weight:var(--roxy-weight-bold,600)}.window-count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.domains{flex-wrap:wrap;gap:.4rem;display:flex}.domain-chip{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:.35rem;display:inline-flex}.swatch{border-radius:2px;width:.65rem;height:.65rem;display:inline-block}.sw-western{background:var(--roxy-accent,#f59e0b)}.sw-vedic{background:var(--roxy-info,#2563eb)}.sw-biorhythm{background:var(--roxy-success,#16a34a)}.event{grid-template-columns:auto 1fr;align-items:baseline;gap:.25rem .6rem;display:grid}.event-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;white-space:nowrap}.event-desc{font-size:var(--roxy-text-sm,.875rem);line-height:1.4}.sig{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:2px;grid-column:2;height:4px;overflow:hidden}.sig-fill{border-radius:2px;height:100%;display:block}.sig-fill.western{background:var(--roxy-accent,#f59e0b)}.sig-fill.vedic{background:var(--roxy-info,#2563eb)}.sig-fill.biorhythm{background:var(--roxy-success,#16a34a)}.quiet{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}`],kr=d([(0,Et.customElement)("roxy-forecast-digest")],kr);var J=require("lit"),Dt=require("lit/decorators.js");var Ys={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Us=["western","vedic","biorhythm"],Sr=class extends m{renderEmpty(){return J.html`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=Us.filter(s=>e.some(o=>o.domain===s));return J.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?J.html`<div class="range">${Ce(a.startDate)} - ${Ce(a.endDate)} · ${a.count??e.length} events</div>`:J.nothing}</header>${t.length?J.html`<div class="legend">${t.map(s=>J.html`<span><span class="swatch swatch-${s}"></span>${Ys[s]}</span>`)}</div>`:J.nothing} ${r.length?J.html`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:J.html`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(a){let e=new Map;for(let r of a){let t=r.date??"",s=e.get(t)??[];s.push(r),e.set(t,s)}return[...e.entries()]}renderDay(a,e){return J.html`<div class="day" role="listitem"><div class="day-date">${Ce(a)}</div><div class="events">${e.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0,r=Math.max(0,Math.min(100,e));return J.html`<div class="event"><span class="dot dot-${a.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(a)}</div>${a.description?J.html`<p class="event-desc">${a.description}</p>`:J.nothing}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${a.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(a){let e=a.body?h(a.body):"",r=a.target?h(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=gr[t]??"",o=t?Yr[t]??t:"",i=typeof a.orb=="number"?f(a.orb,1):"",l=this.typeQualifier(a);return t&&r?J.html`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?J.html`<span class="kind">orb ${i}°</span>`:J.nothing}`:J.html`<strong>${e||Y(a.type??"")}</strong>${l?J.html`<span class="kind">${l}</span>`:J.nothing}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${h(a.target)}`:a.type==="retrograde-station"&&a.station?a.station:a.type==="eclipse"?[a.kind,"eclipse"].filter(Boolean).join(" "):a.type==="critical-day"?"critical day":a.type==="dasha-change"&&a.target?`dasha ${h(a.target)}`:Y(a.type??"")}};Sr.styles=[g,J.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],Sr=d([(0,Dt.customElement)("roxy-forecast-timeline")],Sr);var ne=require("lit"),Pt=require("lit/decorators.js");var Rr=class extends m{renderEmpty(){return ne.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(a){let e=(a.breakdown??[]).filter(p=>p?.category!==void 0),r=a.total??0,t=a.maxScore??36,s=r/t*100,o="color-mix(in srgb, var(--roxy-border) 50%, transparent)",i=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",l=s*2.827,c=(100-s)*2.827;return ne.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${f(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?ne.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${it(a.percentage,1)}</small>`:ne.nothing}</div>${a.recommendation?ne.html`<span class="recommendation">${a.recommendation}</span>`:ne.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${o}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8" stroke-dasharray="${l},${c}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${e.length>0?ne.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${e.map(p=>{let y=p.score??0,x=p.maxScore??Ws(p.category),j=x?y/x*100:0;return ne.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${j}%"></span></div></td><td class="score">${f(y,1)} / ${x}</td></tr>`})}</tbody></table>`:ne.nothing} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?ne.html`<div class="tags">${a.doshas?.map(p=>ne.html`<span class="dosha">${p}</span>`)} ${a.doshaCancellations?.map(p=>ne.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:ne.nothing}</article>`}};Rr.styles=[g,ne.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],Rr=d([(0,Pt.customElement)("roxy-guna-milan")],Rr);function Ws(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var se=require("lit"),zt=require("lit/decorators.js");var Cr=class extends m{renderData(a){let e=a.channels??[];return se.html`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?se.html`<span class="count">${a.totalChannels} channels</span>`:se.nothing}</header>${a.combinedDefinition?se.html`<p class="def">Combined definition: <strong>${Y(String(a.combinedDefinition))}</strong></p>`:se.nothing} ${this.renderSummary(a.summary)} ${e.length>0?se.html`<div class="scroll"><table role="table" aria-label="Connection channels"><thead><tr><th scope="col">Channel</th><th scope="col">Gates</th><th scope="col">Circuit</th><th scope="col">Dynamic</th><th scope="col">Held by</th></tr></thead><tbody>${e.map(r=>this.renderChannel(r))}</tbody></table></div>`:se.nothing}</div>`}renderSummary(a){if(!a)return se.nothing;let e=[["Electromagnetic",a.electromagnetic],["Dominance",a.dominance],["Compromise",a.compromise],["Companionship",a.companionship]];return se.html`<div class="stats" aria-label="Channel dynamics">${e.map(([r,t])=>typeof t=="number"?se.html`<span class="stat">${r} <b>${t}</b></span>`:se.nothing)}</div>`}renderChannel(a){let e=a.personAGates??[],r=a.personBGates??[],t=[e.length?"A":"",r.length?"B":""].filter(Boolean).join(" + ")||"-";return se.html`<tr><td>${a.name??""}</td><td class="gates">${a.gateA}-${a.gateB}</td><td>${a.circuit??""}</td><td>${a.dynamic?se.html`<span class="dyn">${a.dynamic}</span>`:""}</td><td class="who">${t}</td></tr>`}renderEmpty(){return se.html`<div class="roxy-empty" role="status">No connection data</div>`}};Cr.styles=[g,se.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums}.def{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.def strong{color:var(--roxy-fg,#0a0a0a);text-transform:capitalize}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}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}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.scroll{overflow-x:auto}`],Cr=d([(0,zt.customElement)("roxy-hd-connection")],Cr);var X=require("lit"),At=require("lit/decorators.js");var Tr=class extends m{renderData(a){let e=a.channels??[],r=e.filter(s=>s.position==="upper"),t=e.filter(s=>s.position==="lower");return X.html`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?X.html`<span class="count">${a.memberCount} members</span>`:X.nothing}</header>${this.renderSummary(a.summary)} ${this.renderGroup("Upper (direction)",r)} ${this.renderGroup("Lower (execution)",t)}</div>`}renderSummary(a){if(!a)return X.nothing;let e=a.gapGates??[];return X.html`<div class="stats" aria-label="Penta summary">${typeof a.definedChannels=="number"?X.html`<span class="stat">Defined channels <b>${a.definedChannels}</b></span>`:X.nothing} ${typeof a.filledGates=="number"?X.html`<span class="stat">Filled gates <b>${a.filledGates}</b></span>`:X.nothing} ${e.length>0?X.html`<span class="stat">Gap gates <b>${e.join(", ")}</b></span>`:X.nothing} ${typeof a.coreDefined=="boolean"?X.html`<span class="stat">${a.coreDefined?"Core defined":"Core open"}</span>`:X.nothing}</div>`}renderGroup(a,e){return e.length===0?X.nothing:X.html`<div class="section"><h3>${a}</h3>${e.map(r=>X.html`<div class="row"><span class="gates">${r.gateA}-${r.gateB}</span> <span class="cname">${r.name??""}</span> <span class="badge ${r.defined?"defined":"open"}">${r.defined?"Defined":"Open"}</span> ${r.isCore?X.html`<span class="badge core">Core</span>`:X.nothing}</div>`)}</div>`}renderEmpty(){return X.html`<div class="roxy-empty" role="status">No penta data</div>`}};Tr.styles=[g,X.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section 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}.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{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}.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)}`],Tr=d([(0,At.customElement)("roxy-hd-penta")],Tr);var $e=require("lit"),Nt=require("lit/decorators.js");var Er=class extends m{renderData(a){let e=a.arrows??[];return $e.html`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(r=>this.renderArrow(r))}</div>${a.confident===!1?$e.html`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof a.confidenceMarginDeg=="number"?` (within ${a.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:$e.nothing}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return $e.html`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?$e.html`<span class="layer">${a.layer}</span>`:$e.nothing} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?$e.html`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}</span>`:$e.nothing}</div>`}renderEmpty(){return $e.html`<div class="roxy-empty" role="status">No variables data</div>`}};Er.styles=[g,$e.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);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,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);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:1fr}}`],Er=d([(0,Nt.customElement)("roxy-hd-variables")],Er);var P=require("lit"),wa=require("lit/decorators.js");var Xe=class extends m{constructor(){super(...arguments);this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}renderEmpty(){return P.html`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:r,lines:t,changingLinePositions:s,dailyMessage:o,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(s??[]);return P.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?P.html`<div class="symbol">${r.symbol}</div>`:P.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((p,y)=>{let x=l.length-1-y+1,j=c.has(x),b=p===6||p===8;return P.html`<div class="line ${`${b?"broken":"solid"}${j?" changing":""}`}">${b?P.svg`<span class="seg"></span><span class="seg"></span>`:P.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?P.html`${r.number}.`:P.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?P.html`${r.chinese}`:P.nothing} ${r.pinyin?P.html`· ${r.pinyin}`:P.nothing}</p><div class="trigrams">${r.upperTrigram?P.html`<div>Upper <span class="tri-glyph">${Ma[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:P.nothing} ${r.lowerTrigram?P.html`<div>Lower <span class="tri-glyph">${Ma[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:P.nothing}</div>${r.judgment?P.html`<p class="judgment">${r.judgment}</p>`:P.nothing} ${r.image?P.html`<p class="image">${r.image}</p>`:P.nothing} ${o?P.html`<p class="message">${o}</p>`:P.nothing} ${r.interpretation?.general?P.html`<p>${r.interpretation.general}</p>`:P.nothing} ${c.size>0?P.html`<div class="changing">Changing lines: ${Array.from(c).sort((p,y)=>p-y).join(", ")}. ${i?.english?P.html`Becomes hexagram ${i.number} ${i.english}.`:P.nothing}</div>`:P.nothing}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,s=[];for(let o=0;o<6;o++){let i=t>>o&1;s.push(i?8:7)}return s}return Array.from({length:6},()=>7)}};Xe.styles=[g,P.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,wa.property)({type:String,reflect:!0})],Xe.prototype,"mode",2),Xe=d([(0,wa.customElement)("roxy-hexagram")],Xe);var we=require("lit"),Mt=require("lit/decorators.js");function Lt(n){return n?String(n).slice(11,16)||String(n):""}var Dr=class extends m{renderEmpty(){return we.html`<div class="roxy-empty" role="status">No hora data</div>`}renderData(a){let e=a.dayHoras??[],r=a.nightHoras??[];return e.length===0&&r.length===0?this.renderEmpty():we.html`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?we.html`<p class="subtitle">${a.date}</p>`:we.nothing}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?we.nothing:we.html`<div class="col"><p class="section-label">${a}</p>${e.map(r=>we.html`<div class="row"><span class="glyph" aria-hidden="true">${N[h(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${Lt(r.start)}-${Lt(r.end)}</span> ${typeof r.number=="number"?we.html`<span class="num">${r.number}</span>`:we.nothing}</div>`)}</div>`}};Dr.styles=[g,we.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.cols{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,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}}`],Dr=d([(0,Mt.customElement)("roxy-hora-table")],Dr);var E=require("lit"),ka=require("lit/decorators.js");var Ze=class extends m{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return E.html`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?pe[h(r)]??"":"",s="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,o="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return E.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${o?E.html`<div class="date">${o}</div>`:E.nothing}</div>${s!==null?E.html`<span class="energy" aria-label="${`Energy ${s} of 10`}">Energy ${s}/10 <span class="energy-bar"><span style="width:${s/10*100}%"></span></span></span>`:E.nothing}</header>${e.overview?E.html`<p class="overview">${e.overview}</p>`:E.nothing}<div class="sections">${e.love?E.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:E.nothing} ${e.career?E.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:E.nothing} ${e.health?E.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:E.nothing} ${e.finance?E.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:E.nothing} ${"advice"in e&&e.advice?E.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:E.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],y=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&p.length===0&&y.length===0?E.nothing:E.html`<div class="lucky">${i!==void 0?E.html`<span>Lucky number <strong>${i}</strong></span>`:E.nothing} ${l?E.html`<span>Lucky color <strong>${l}</strong></span>`:E.nothing} ${c.length?E.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:E.nothing} ${p.length?E.html`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:E.nothing} ${y.length?E.html`<span class="compat-wrap">Best with <span class="compat">${y.map(x=>E.html`<span>${x}</span>`)}</span></span>`:E.nothing}</div>`})()}</article>`}};Ze.styles=[g,E.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([(0,ka.property)({type:String,reflect:!0})],Ze.prototype,"period",2),Ze=d([(0,ka.customElement)("roxy-horoscope-card")],Ze);var K=require("lit"),Sa=require("lit/decorators.js");var Qe=class extends m{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(s=>({name:s.planet,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,kpNumber:s.kpNumber,retrograde:s.retrograde})),t=e.nodes;for(let[s,o]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])o&&r.push({name:s,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}renderEmpty(){return K.html`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return K.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?K.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?K.html`· ${r.nakshatra}`:K.nothing} ${r.subLord?K.html`· sub lord ${r.subLord}`:K.nothing} ${typeof r.kpNumber=="number"?K.html`· KP ${r.kpNumber}`:K.nothing}</div>`:K.nothing} ${typeof e.meta?.ayanamsa=="number"?K.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${f(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?K.html`· ${e.meta.houseSystem} houses`:K.nothing}</div>`:K.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>K.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?K.html`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>K.html`<tr><td class="body">${r.name}${r.retrograde?K.html`<span class="retro">R</span>`:K.nothing}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:K.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?K.html`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>K.html`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:K.html`<p class="roxy-empty" role="status">No cusps</p>`}};Qe.styles=[g,K.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);width:100%;overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([(0,Sa.state)()],Qe.prototype,"activeTab",2),Qe=d([(0,Sa.customElement)("roxy-kp-chart")],Qe);var Ae=require("lit"),Gt=require("lit/decorators.js");var Pr=class extends m{renderEmpty(){return Ae.html`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return Ae.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?Ae.html`<span class="ayanamsa">Ayanamsa: ${f(a.ayanamsa,2)}°</span>`:Ae.nothing}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>Ae.html`<tr><td class="planet">${r.planet} ${r.retrograde?Ae.html`<span class="retro">R</span>`:Ae.nothing}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Pr.styles=[g,Ae.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],Pr=d([(0,Gt.customElement)("roxy-kp-planets-table")],Pr);var ue=require("lit"),Ht=require("lit/decorators.js");var zr=class extends m{renderEmpty(){return ue.html`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return ue.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?ue.html`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:ue.nothing}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${a.moonSignLord??""}</dd><dt>Star lord</dt><dd>${a.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${a.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${a.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${a.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${a.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.lagnaSubSublord??""}</dd></dl></div></div>${a.rulingPlanets?.length?ue.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>ue.html`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:ue.nothing} ${e.length?ue.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${e.map(r=>ue.html`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:ue.nothing}</div>`}};zr.styles=[g,ue.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],zr=d([(0,Ht.customElement)("roxy-kp-ruling-planets")],zr);var xe=require("lit"),he=require("lit/decorators.js");function Ot(n,a){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...t)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ie=class extends xe.LitElement{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=Ot(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let s={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let o=this.publishableKey??this.apiKey;o&&(s["X-API-Key"]=o);let i=await fetch(t,{headers:s,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return xe.html`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?xe.html`<span class="spinner" role="status" aria-label="Loading"></span>`:xe.nothing} ${this.isOpen?xe.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?xe.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>xe.html`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?xe.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:xe.nothing}</div>`}};ie.styles=[g,xe.css`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,he.property)({type:String,attribute:"api-key"})],ie.prototype,"apiKey",2),d([(0,he.property)({type:String,attribute:"publishable-key"})],ie.prototype,"publishableKey",2),d([(0,he.property)({type:String})],ie.prototype,"endpoint",2),d([(0,he.property)({type:String})],ie.prototype,"placeholder",2),d([(0,he.property)({type:String,attribute:"default-value"})],ie.prototype,"defaultValue",2),d([(0,he.state)()],ie.prototype,"query",2),d([(0,he.state)()],ie.prototype,"results",2),d([(0,he.state)()],ie.prototype,"isOpen",2),d([(0,he.state)()],ie.prototype,"isLoading",2),d([(0,he.state)()],ie.prototype,"highlight",2),ie=d([(0,he.customElement)("roxy-location-search")],ie);var F=require("lit"),Ra=require("lit/decorators.js");var er=class extends m{constructor(){super(...arguments);this.mode="current"}renderEmpty(){return F.html`<div class="roxy-empty" role="status">No moon phase data</div>`}renderData(e){let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,s="year"in e?e.year:void 0;return F.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${s??""}</h2><div class="list" role="list">${r.map(o=>this.renderListItem(o))}</div></article>`}return"phase"in e?this.renderSingle(e):F.nothing}renderSingle(e){let r=jt(e.phase);return F.html`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?F.html`<div class="date">${e.date}</div>`:F.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?F.html`<div><span>Illumination</span> <strong>${Js(e.illumination)}</strong></div>`:F.nothing} ${typeof e.age=="number"?F.html`<div><span>Age</span> <strong>${f(e.age,1)} days</strong></div>`:F.nothing} ${e.sign?F.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:F.nothing} ${typeof e.distance=="number"?F.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:F.nothing}</div>${e.meaning?.description?F.html`<p class="meaning">${e.meaning.description}</p>`:F.nothing} ${e.meaning?.keywords?.length?F.html`<div class="keywords">${e.meaning.keywords.map(t=>F.html`<span>${t}</span>`)}</div>`:F.nothing}</article>`}renderListItem(e){let r=jt(e.phase);return F.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};er.styles=[g,F.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([(0,Ra.property)({type:String,reflect:!0})],er.prototype,"mode",2),er=d([(0,Ra.customElement)("roxy-moon-phase")],er);function jt(n){return n?nt[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Js(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var _=require("lit"),Bt=require("lit/decorators.js");var Ar=class extends m{renderData(a){let e=a.remedies;return _.html`<article class="wrap" aria-label="${`Nakshatra ${a.name}`}"><header class="head"><h2 class="name">${a.name}</h2>${typeof a.number=="number"?_.html`<span class="number">Nakshatra ${a.number} of 27</span>`:_.nothing} ${a.range?_.html`<span class="range">${a.range}</span>`:_.nothing}</header><dl class="facts">${a.lord?_.html`<div class="fact"><dt>Lord</dt><dd>${a.lord}</dd></div>`:_.nothing} ${a.deity?_.html`<div class="fact"><dt>Deity</dt><dd>${a.deity}</dd></div>`:_.nothing} ${a.symbol?_.html`<div class="fact"><dt>Symbol</dt><dd>${a.symbol}</dd></div>`:_.nothing}</dl>${a.characteristics?_.html`<div class="section"><h3>Characteristics</h3><p>${a.characteristics}</p></div>`:_.nothing} ${e?_.html`<div class="section"><h3>Remedies</h3><div class="remedies">${e.mantras?_.html`<div class="remedy"><strong>Mantras:</strong> ${e.mantras}</div>`:_.nothing} ${e.gemstones?_.html`<div class="remedy"><strong>Gemstones:</strong> ${e.gemstones}</div>`:_.nothing} ${e.rituals?_.html`<div class="remedy"><strong>Rituals:</strong> ${e.rituals}</div>`:_.nothing}</div></div>`:_.nothing}</article>`}renderEmpty(){return _.html`<div class="roxy-empty" role="status">No nakshatra data</div>`}};Ar.styles=[g,_.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],Ar=d([(0,Bt.customElement)("roxy-nakshatra-card")],Ar);var u=require("lit"),_r=require("lit/decorators.js");var qa=420,k=qa/2,Ir=164,Fa=146,Wr=120,Kr=96,Xs=178,Zs=196,je=class extends m{constructor(){super(...arguments);this.houseSystem="placidus";this.view="wheel"}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}renderEmpty(){return u.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(e){let r=this.getPlanets(),t=e.aspects??[],s=this.view;return u.html`<div class="wrap"><header><h2 class="title">Natal chart</h2>${e.birthDetails?u.html`<div class="meta">${[e.birthDetails.date,e.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:u.nothing}</header>${Br({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:s,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${s}" role="tabpanel" aria-labelledby="natal-tab-${s}">${s==="wheel"?this.renderWheel(r,t):this.renderAspectGrid(r,t)}</div><div class="legend"><span>${r.length} planets</span> <span>${t.length} aspects</span> ${e.houseSystem?u.html`<span>${e.houseSystem} houses</span>`:u.nothing} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return u.html`<svg viewBox="0 0 ${qa} ${qa}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${k}" cy="${k}" r="${Ir}" stroke-width="1.5"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Fa-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Wr}" stroke-width="1"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Kr-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(o=>h(o.name)),s=new Map;for(let o of r){let i=[h(o.planet1),h(o.planet2)].sort().join("|");s.set(i,o)}return t.length===0?u.html`<p class="roxy-empty" role="status">No planets to grid</p>`:u.html`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(o=>{let i=N[o]??o.slice(0,2);return u.html`<th scope="col" title="${o}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((o,i)=>{let l=N[o]??o.slice(0,2);return u.html`<tr><th scope="row" title="${o}">${l}</th>${t.slice(0,i+1).map(c=>{let p=s.get([o,c].sort().join("|"));if(!p)return u.html`<td class="empty"></td>`;let y=jr(p),x=Yr[y]??Yr[y.replace(/-/g,"")]??y.slice(0,3),j=gr[y]??"aspect-other",b=f(p.orb,1);return u.html`<td class="${`cell ${j}`}" title="${`${o} ${y} ${c}${b?` (orb ${b}\xB0)`:""}`}"><span class="asp">${x}</span></td>`})} ${t.slice(i+1,-1).map(()=>u.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Ia(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Ia(r),"IC")));let s=this.data?.partOfFortune?.longitude;typeof s=="number"&&t.push(this.renderAngleMark(Le(s),"PoF"));let o=this.data?.vertex?.longitude;return typeof o=="number"&&t.push(this.renderAngleMark(Le(o),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),s=B(k,k,Ir,t),o=B(k,k,Xs,t),i=B(k,k,Zs,t);return u.svg`
|
|
79
|
+
`}function To(n){let a=n.lagnaSign.toLowerCase();return T.svg`
|
|
80
|
+
${Mo(n.divisionLabel)}
|
|
81
|
+
${de.map(e=>zo(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,rs(e,n.lagnaSign)))}
|
|
82
|
+
`}function ja(n,a){switch(a){case"north":return So(n);case"east":return To(n);default:return bo(n)}}function Ba(n,a){return oa({items:mo,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var as=require("lit"),Ia=as.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var sr=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Oa(this.data.chart.meta,r)}renderEmpty(){return Me.html`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let{division:t,vargottama:s}=e;return Me.html`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?Me.html`<span class="division-meta">· ${t.sanskritName}</span>`:Me.nothing}</h2>${t.significance?Me.html`<p class="significance">${t.significance}</p>`:Me.nothing}</div>${Ba(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${ja(r,this.chartStyle)}</svg> ${s&&s.length>0?Me.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>Me.html`<span class="vargottama-pill" role="listitem">${C[o]??""} ${o}</span>`)}</div>`:Me.nothing}</div>`}};sr.styles=[y,Ia,tr,Me.css`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],d([(0,_a.property)({type:String,reflect:!0,attribute:"chart-style"})],sr.prototype,"chartStyle",2),sr=d([(0,_a.customElement)("roxy-divisional-chart")],sr);var Q=require("lit"),Ka=require("lit/decorators.js");var Eo={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},or=class extends m{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return Q.html`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=Eo[this.type]??this.type,s=(e.severity??"").toLowerCase(),o=s==="severe"?3:s==="moderate"?2:s==="mild"?1:0,i=o*33,l=o===3?"var(--roxy-danger)":o>=1?"var(--roxy-warning)":"transparent";return Q.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${"type"in e&&e.type?Q.html`<p class="subtype"><span class="subtype-label">${this.type==="sadhesati"?"Current phase":"Type"}</span>${e.type}</p>`:Q.nothing} ${e.severity?Q.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${o}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:Q.nothing} ${e.description?Q.html`<p class="description">${e.description}</p>`:Q.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?Q.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>Q.html`<li>${c}</li>`)}</ul></div>`:Q.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?Q.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>Q.html`<li>${c}</li>`)}</ul></div>`:Q.nothing}</article>`}renderEffects(e){if(!e.effects)return Q.nothing;let r=[];for(let[t,s]of Object.entries(e.effects))if(typeof s=="string"&&s.length>0)r.push(Q.html`<div><h3>${t}</h3><p>${s}</p></div>`);else if(s&&typeof s=="object")for(let[o,i]of Object.entries(s))typeof i=="string"&&i.length>0&&r.push(Q.html`<div><h3>${o}</h3><p>${i}</p></div>`);return r.length===0?Q.nothing:Q.html`<div class="effects">${r}</div>`}};or.styles=[y,Q.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.subtype{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.subtype .subtype-label{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-size:var(--roxy-text-xs,.75rem);margin-right:.4rem}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([(0,Ka.property)({type:String,reflect:!0})],or.prototype,"type",2),or=d([(0,Ka.customElement)("roxy-dosha-card")],or);var He=require("lit"),ts=require("lit/decorators.js");var Pr=class extends m{renderData(a){return He.html`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?He.html`<span class="letter" aria-hidden="true">${a.letter}</span>`:He.nothing}<div><p class="label">Dream symbol</p>${a.name?He.html`<h2 class="name">${a.name}</h2>`:He.nothing}</div></header>${a.meaning?He.html`<p class="meaning">${a.meaning}</p>`:He.nothing}</article>`}renderEmpty(){return He.html`<div class="roxy-empty" role="status">No dream symbol</div>`}};Pr.styles=[y,He.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:2.5rem;height:2.5rem;color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-variant-numeric:tabular-nums;flex:none;justify-content:center;align-items:center;display:inline-flex}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}`],Pr=d([(0,ts.customElement)("roxy-dream-card")],Pr);var Ve=require("lit"),ss=require("lit/decorators.js");var Dr=class extends m{renderEmpty(){return Ve.html`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(a){let e=a.symbols??[];if(e.length===0)return this.renderEmpty();let r=typeof a.total=="number"?a.total:e.length;return Ve.html`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${r} match${r===1?"":"es"}</span></header><ul class="grid">${e.map(t=>Ve.html`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?Ve.html`<span class="letter" aria-hidden="true">${t.letter}</span>`:Ve.nothing} <span class="name">${t.name}</span></button></li>`)}</ul></section>`}select(a){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:a.id,name:a.name,letter:a.letter},bubbles:!0,composed:!0}))}};Dr.styles=[y,Ve.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.result{align-items:center;gap:var(--roxy-space-sm,.5rem);text-align:left;width:100%;font:inherit;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;background:0 0;transition:border-color .12s,background .12s;display:flex}.result:hover,.result:focus-visible{border-color:var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);outline:none}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:1.6rem;height:1.6rem;color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;flex:none;place-items:center;display:grid}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:500}`],Dr=d([(0,ss.customElement)("roxy-dream-search")],Dr);var te=require("lit"),ze=require("lit/decorators.js");var mt=new Map;async function Ao(n){let a=mt.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw mt.delete(n),e}),mt.set(n,a)),a}var Le=class extends te.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(s=>s.required).filter(s=>this.values[s.key]===void 0||this.values[s.key]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.key)},bubbles:!0,composed:!0}));return}let t={};for(let s of this.fields){let o=this.values[s.key];if(!(o===void 0||o===""))if(s.group){let i=t[s.group]??{};i[s.name]=o,t[s.group]=i}else t[s.name]=o}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:t},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Ao(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let s=e.components?.schemas??{},o=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,s)}if(i?.properties){let c=new Set(i.required??[]);for(let[p,g]of Object.entries(i.properties)){let h=this.resolve(g,s)??{};if(h.type==="object"&&h.properties){let k=new Set(h.required??[]);for(let[f,fr]of Object.entries(h.properties)){let je=this.resolve(fr,s)??{};o.push({key:`${p}.${f}`,name:f,group:p,type:this.fieldType(je),required:c.has(p)&&k.has(f),description:je.description,enum:je.enum,min:je.minimum,max:je.maximum,default:je.default})}}else o.push({key:p,name:p,type:this.fieldType(h),required:c.has(p),description:h.description,enum:h.enum,min:h.minimum,max:h.maximum,default:h.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let p=this.resolve(c.schema,s)??{};o.push({key:c.name,name:c.name,type:this.fieldType(p),required:!!c.required,description:p.description,enum:p.enum,default:p.default})}this.fields=o;let l={};for(let c of o){c.default!==void 0&&(l[c.key]=c.default);let p=c.group?this.initialValues?.[c.group]?.[c.name]:this.initialValues?.[c.name];p!==void 0&&(l[c.key]=p)}this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}groupHasLocation(e){let r=this.fields.filter(t=>t.group===e);return["latitude","longitude","timezone"].every(t=>r.some(s=>s.name===t))}onLocationFor(e){let r=e?`${e}.`:"";return t=>{let s=t.detail;s&&(this.values={...this.values,[`${r}latitude`]:s.latitude,[`${r}longitude`]:s.longitude,[`${r}timezone`]:s.timezone??s.utcOffset})}}render(){if(!this.loaded)return te.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return te.html`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return te.nothing;let i=`roxy-form-${o.key}`;return te.html`<div class="field"><label for="${i}">${W(o.name)}${o.required?te.html`<span class="req" aria-hidden="true">*</span>`:te.nothing}</label> ${o.enum?te.html`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>te.html`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:te.html`<input id="${i}" type="${this.htmlType(o.type)}" ?required="${o.required}" min="${o.min??""}" max="${o.max??""}" step="${o.type==="number"?"any":""}" .value="${this.values[o.key]??""}" @input="${l=>this.setValue(o.key,this.coerce(o.type,l.target.value))}">`} ${o.description?te.html`<small class="help">${o.description}</small>`:te.nothing}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?te.html`<div class="location-block"><label>${o?`${W(o)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(o)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:te.nothing,s=o=>te.html`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return te.html`<form @submit="${this.onSubmit}"><h2 class="title">${W(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):te.html`<fieldset class="person-group"><legend>${W(o)}</legend>${s(o)}</fieldset>`)} <button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};Le.styles=[y,te.css`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.person-group{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);margin:0 0 var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);min-inline-size:0;display:grid}.person-group legend{padding:0 var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([(0,ze.property)({type:String,attribute:"data-endpoint"})],Le.prototype,"endpoint",2),d([(0,ze.property)({type:String})],Le.prototype,"method",2),d([(0,ze.property)({type:String,attribute:"spec-url"})],Le.prototype,"specUrl",2),d([(0,ze.property)({type:String,attribute:"submit-label"})],Le.prototype,"submitLabel",2),d([(0,ze.property)({attribute:!1})],Le.prototype,"initialValues",2),d([(0,ze.state)()],Le.prototype,"fields",2),d([(0,ze.state)()],Le.prototype,"values",2),d([(0,ze.state)()],Le.prototype,"loaded",2),d([(0,ze.state)()],Le.prototype,"specError",2),Le=d([(0,ze.customElement)("roxy-endpoint-form")],Le);var oe=require("lit"),os=require("lit/decorators.js");var Nr=class extends m{renderEmpty(){return oe.html`<div class="roxy-empty" role="status">No fixed star data</div>`}renderData(a){let e=a.conjunctions??[],r=a.stars??[];return oe.html`<div class="wrap"><header><h2 class="title">Fixed stars</h2>${typeof a.orb=="number"?oe.html`<span class="badge"><b>Orb</b> ${L(a.orb,1)}°</span>`:oe.nothing}</header>${a.summary?oe.html`<p class="summary">${a.summary}</p>`:oe.nothing} ${e.length?oe.html`<section><p class="subhead">Conjunctions to the chart</p>${e.map((t,s)=>oe.html`<details class="interp-card" name="fixed-star-contacts" ?open="${s===0}"><summary><span class="contact"><span class="point">${t.point}</span> conjunct ${t.star}</span> <span class="interp-aside"><small>orb ${L(t.orb,2)}°</small> ${le()}</span></summary>${t.interpretation?oe.html`<div class="interp-body">${t.interpretation}</div>`:oe.nothing}</details>`)}</section>`:oe.html`<p class="empty-note">No star sits within the orb of a natal point.</p>`} ${r.length?this.renderCatalog(r):oe.nothing}</div>`}renderCatalog(a){return oe.html`<details class="catalog"><summary>${le()} Star catalog (${a.length})</summary><div class="scroll"><table><caption class="subhead">Precessed positions for the chart date</caption><thead><tr><th scope="col">Star</th><th scope="col">Position</th><th scope="col" class="num">Mag</th><th scope="col">Nature</th><th scope="col">Keywords</th></tr></thead><tbody>${a.map(e=>{let r=ae[u(e.sign)];return oe.html`<tr><td>${e.name}</td><td>${r?oe.html`<span class="sg">${r}</span>`:oe.nothing}${ua(e.degree)} ${e.sign}</td><td class="num">${L(e.magnitude,1)}</td><td>${e.nature}</td><td><div class="kw">${(e.keywords??[]).map(t=>oe.html`<span>${t}</span>`)}</div></td></tr>`})}</tbody></table></div></details>`}};Nr.styles=[y,we,oe.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}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-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.contact{align-items:baseline;gap:.4rem;display:inline-flex}.contact .point{color:var(--roxy-accent-ink,#b45309);font-weight:600}.interp-aside{align-items:center;gap:.5rem;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem)}.catalog summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);align-items:center;gap:.5rem;font-weight:600;display:flex}.scroll{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}`],Nr=d([(0,os.customElement)("roxy-fixed-stars")],Nr);var be=require("lit"),ns=require("lit/decorators.js");var Gr=class extends m{renderEmpty(){return be.html`<div class="roxy-empty" role="status">No digest data</div>`}renderData(a){let e=a.windows??[];if(e.length===0)return this.renderEmpty();let r=[Pe(a.startDate),Pe(a.endDate)].filter(Boolean).join(" \u2013 ");return be.html`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?be.html`<p class="subtitle">${r}</p>`:be.nothing}</div>${e.map(t=>this.renderWindow(t))}</div>`}windowLabel(a){return a===1?"Next 24 hours":typeof a=="number"?`Next ${a} days`:"Window"}renderWindow(a){let e=a.top??[],r=a.byDomain??{},t=Object.entries(r);return be.html`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(a.days)}</span> <span class="window-count">${a.count??0} event${a.count===1?"":"s"}</span></div>${t.length>0?be.html`<div class="domains">${t.map(([s,o])=>be.html`<span class="domain-chip"><span class="swatch sw-${s}"></span>${W(s)} ${o}</span>`)}</div>`:be.nothing} ${e.length>0?be.html`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:be.html`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return be.html`<div class="event" role="listitem"><span class="event-date">${Pe(a.date)}</span> <span class="event-desc">${a.description??W(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${L(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};Gr.styles=[y,be.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);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}`],Gr=d([(0,ns.customElement)("roxy-forecast-digest")],Gr);var ee=require("lit"),is=require("lit/decorators.js");var Po={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Do=["western","vedic","biorhythm"],Hr=class extends m{renderEmpty(){return ee.html`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=Do.filter(s=>e.some(o=>o.domain===s));return ee.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?ee.html`<div class="range">${Pe(a.startDate)} - ${Pe(a.endDate)} · ${a.count??e.length} events</div>`:ee.nothing}</header>${t.length?ee.html`<div class="legend">${t.map(s=>ee.html`<span><span class="swatch swatch-${s}"></span>${Po[s]}</span>`)}</div>`:ee.nothing} ${r.length?ee.html`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:ee.html`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(a){let e=new Map;for(let r of a){let t=r.date??"",s=e.get(t)??[];s.push(r),e.set(t,s)}return[...e.entries()]}renderDay(a,e){return ee.html`<div class="day" role="listitem"><div class="day-date">${Pe(a)}</div><div class="events">${e.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0,r=Math.max(0,Math.min(100,e));return ee.html`<div class="event"><span class="dot dot-${a.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(a)}</div>${a.description?ee.html`<p class="event-desc">${a.description}</p>`:ee.nothing}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${a.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(a){let e=a.body?u(a.body):"",r=a.target?u(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=wr[t]??"",o=t?pa[t]??t:"",i=typeof a.orb=="number"?L(a.orb,1):"",l=this.typeQualifier(a);return t&&r?ee.html`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?ee.html`<span class="kind">orb ${i}°</span>`:ee.nothing}`:ee.html`<strong>${e||W(a.type??"")}</strong>${l?ee.html`<span class="kind">${l}</span>`:ee.nothing}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${u(a.target)}`:a.type==="retrograde-station"&&a.station?a.station:a.type==="eclipse"?[a.kind,"eclipse"].filter(Boolean).join(" "):a.type==="critical-day"?"critical day":a.type==="dasha-change"&&a.target?`dasha ${u(a.target)}`:W(a.type??"")}};Hr.styles=[y,ee.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],Hr=d([(0,is.customElement)("roxy-forecast-timeline")],Hr);var ye=require("lit"),ls=require("lit/decorators.js");var Or=class extends m{renderEmpty(){return ye.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(a){let e=(a.breakdown??[]).filter(p=>p?.category!==void 0),r=a.total??0,t=a.maxScore??36,s=r/t*100,o="color-mix(in srgb, var(--roxy-border) 50%, transparent)",i=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",l=s*2.827,c=(100-s)*2.827;return ye.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${L(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?ye.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Tt(a.percentage,1)}</small>`:ye.nothing}</div>${a.recommendation?ye.html`<span class="recommendation">${a.recommendation}</span>`:ye.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${o}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8" stroke-dasharray="${l},${c}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${e.length>0?ye.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${e.map(p=>{let g=p.score??0,h=p.maxScore??No(p.category),k=h?g/h*100:0;return ye.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${k}%"></span></div></td><td class="score">${L(g,1)} / ${h}</td></tr>`})}</tbody></table>`:ye.nothing} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?ye.html`<div class="tags">${a.doshas?.map(p=>ye.html`<span class="dosha">${p}</span>`)} ${a.doshaCancellations?.map(p=>ye.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:ye.nothing}</article>`}};Or.styles=[y,ye.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],Or=d([(0,ls.customElement)("roxy-guna-milan")],Or);function No(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var ce=require("lit"),ds=require("lit/decorators.js");var jr=class extends m{renderData(a){let e=a.channels??[];return ce.html`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?ce.html`<span class="count">${a.totalChannels} channels</span>`:ce.nothing}</header>${a.combinedDefinition?ce.html`<p class="def">Combined definition: <strong>${W(String(a.combinedDefinition))}</strong></p>`:ce.nothing} ${this.renderSummary(a.summary)} ${e.length>0?ce.html`<div class="scroll"><table role="table" aria-label="Connection channels"><thead><tr><th scope="col">Channel</th><th scope="col">Gates</th><th scope="col">Circuit</th><th scope="col">Dynamic</th><th scope="col">Held by</th></tr></thead><tbody>${e.map(r=>this.renderChannel(r))}</tbody></table></div>`:ce.nothing}</div>`}renderSummary(a){if(!a)return ce.nothing;let e=[["Electromagnetic",a.electromagnetic],["Dominance",a.dominance],["Compromise",a.compromise],["Companionship",a.companionship]];return ce.html`<div class="stats" aria-label="Channel dynamics">${e.map(([r,t])=>typeof t=="number"?ce.html`<span class="stat">${r} <b>${t}</b></span>`:ce.nothing)}</div>`}renderChannel(a){let e=a.personAGates??[],r=a.personBGates??[],t=[e.length?"A":"",r.length?"B":""].filter(Boolean).join(" + ")||"-";return ce.html`<tr><td>${a.name??""}</td><td class="gates">${a.gateA}-${a.gateB}</td><td>${a.circuit??""}</td><td>${a.dynamic?ce.html`<span class="dyn">${a.dynamic}</span>`:""}</td><td class="who">${t}</td></tr>`}renderEmpty(){return ce.html`<div class="roxy-empty" role="status">No connection data</div>`}};jr.styles=[y,ce.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums}.def{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.def strong{color:var(--roxy-fg,#0a0a0a);text-transform:capitalize}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}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}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.scroll{overflow-x:auto}`],jr=d([(0,ds.customElement)("roxy-hd-connection")],jr);var re=require("lit"),cs=require("lit/decorators.js");var Br=class extends m{renderData(a){let e=a.channels??[],r=e.filter(s=>s.position==="upper"),t=e.filter(s=>s.position==="lower");return re.html`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?re.html`<span class="count">${a.memberCount} members</span>`:re.nothing}</header>${this.renderSummary(a.summary)} ${this.renderGroup("Upper (direction)",r)} ${this.renderGroup("Lower (execution)",t)}</div>`}renderSummary(a){if(!a)return re.nothing;let e=a.gapGates??[];return re.html`<div class="stats" aria-label="Penta summary">${typeof a.definedChannels=="number"?re.html`<span class="stat">Defined channels <b>${a.definedChannels}</b></span>`:re.nothing} ${typeof a.filledGates=="number"?re.html`<span class="stat">Filled gates <b>${a.filledGates}</b></span>`:re.nothing} ${e.length>0?re.html`<span class="stat">Gap gates <b>${e.join(", ")}</b></span>`:re.nothing} ${typeof a.coreDefined=="boolean"?re.html`<span class="stat">${a.coreDefined?"Core defined":"Core open"}</span>`:re.nothing}</div>`}renderGroup(a,e){return e.length===0?re.nothing:re.html`<div class="section"><h3>${a}</h3>${e.map(r=>re.html`<div class="row"><span class="gates">${r.gateA}-${r.gateB}</span> <span class="cname">${r.name??""}</span> <span class="badge ${r.defined?"defined":"open"}">${r.defined?"Defined":"Open"}</span> ${r.isCore?re.html`<span class="badge core">Core</span>`:re.nothing}</div>`)}</div>`}renderEmpty(){return re.html`<div class="roxy-empty" role="status">No penta data</div>`}};Br.styles=[y,re.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section 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}.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{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}.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)}`],Br=d([(0,cs.customElement)("roxy-hd-penta")],Br);var ve=require("lit"),ms=require("lit/decorators.js");var Ir=class extends m{renderData(a){let e=[...a.arrows??[]].sort((r,t)=>ps(r.position)-ps(t.position));return ve.html`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(r=>this.renderArrow(r))}</div>${a.confident===!1?ve.html`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof a.confidenceMarginDeg=="number"?` (within ${a.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:ve.nothing}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return ve.html`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?ve.html`<span class="layer">${a.layer}</span>`:ve.nothing} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?ve.html`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}${a.activation?.planet?` \xB7 ${a.activation.planet}${a.activation.side?` (${a.activation.side})`:""}`:""}</span>`:ve.nothing} ${a.confident===!1?ve.html`<span class="note" role="note">Knife-edge: could flip with a more precise birth time.</span>`:ve.nothing}</div>`}renderEmpty(){return ve.html`<div class="roxy-empty" role="status">No variables data</div>`}};Ir.styles=[y,ve.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,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);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:1fr}}`],Ir=d([(0,ms.customElement)("roxy-hd-variables")],Ir);function ps(n){switch(n){case"Top left":return 0;case"Top right":return 1;case"Bottom left":return 2;case"Bottom right":return 3;default:return 99}}var D=require("lit"),Fa=require("lit/decorators.js");var nr=class extends m{constructor(){super(...arguments);this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}renderEmpty(){return D.html`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:r,lines:t,changingLinePositions:s,dailyMessage:o,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(s??[]);return D.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?D.html`<div class="symbol">${r.symbol}</div>`:D.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((p,g)=>{let h=l.length-1-g+1,k=c.has(h),f=p===6||p===8;return D.html`<div class="line ${`${f?"broken":"solid"}${k?" changing":""}`}">${f?D.svg`<span class="seg"></span><span class="seg"></span>`:D.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?D.html`${r.number}.`:D.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?D.html`${r.chinese}`:D.nothing} ${r.pinyin?D.html`· ${r.pinyin}`:D.nothing}</p><div class="trigrams">${r.upperTrigram?D.html`<div>Upper <span class="tri-glyph">${st[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:D.nothing} ${r.lowerTrigram?D.html`<div>Lower <span class="tri-glyph">${st[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:D.nothing}</div>${r.judgment?D.html`<p class="judgment">${r.judgment}</p>`:D.nothing} ${r.image?D.html`<p class="image">${r.image}</p>`:D.nothing} ${o?D.html`<p class="message">${o}</p>`:D.nothing} ${r.interpretation?.general?D.html`<p>${r.interpretation.general}</p>`:D.nothing} ${c.size>0?D.html`<div class="changing">Changing lines: ${Array.from(c).sort((p,g)=>p-g).join(", ")}. ${i?.english?D.html`Becomes hexagram ${i.number} ${i.english}.`:D.nothing}</div>`:D.nothing}</div></article>`}derivedLines(e){let r=e.binary??"";return/^[01]{6}$/.test(r)?Array.from(r,t=>t==="1"?7:8).reverse():Array.from({length:6},()=>7)}};nr.styles=[y,D.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,Fa.property)({type:String,reflect:!0})],nr.prototype,"mode",2),nr=d([(0,Fa.customElement)("roxy-hexagram")],nr);var Te=require("lit"),ys=require("lit/decorators.js");function gs(n){return n?String(n).slice(11,16)||String(n):""}var _r=class extends m{renderEmpty(){return Te.html`<div class="roxy-empty" role="status">No hora data</div>`}renderData(a){let e=a.dayHoras??[],r=a.nightHoras??[];return e.length===0&&r.length===0?this.renderEmpty():Te.html`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?Te.html`<p class="subtitle">${a.date}</p>`:Te.nothing}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?Te.nothing:Te.html`<div class="col"><p class="section-label">${a}</p>${e.map(r=>Te.html`<div class="row"><span class="glyph" aria-hidden="true">${C[u(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${gs(r.start)}-${gs(r.end)}</span> ${typeof r.number=="number"?Te.html`<span class="num">${r.number}</span>`:Te.nothing}</div>`)}</div>`}};_r.styles=[y,Te.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.cols{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,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}}`],_r=d([(0,ys.customElement)("roxy-hora-table")],_r);var A=require("lit"),Za=require("lit/decorators.js");var ir=class extends m{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return A.html`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?ae[u(r)]??"":"",s="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,o="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return A.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${o?A.html`<div class="date">${o}</div>`:A.nothing}</div>${s!==null?A.html`<span class="energy" aria-label="${`Energy ${s} of 10`}">Energy ${s}/10 <span class="energy-bar"><span style="width:${s/10*100}%"></span></span></span>`:A.nothing}</header>${e.overview?A.html`<p class="overview">${e.overview}</p>`:A.nothing}<div class="sections">${e.love?A.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:A.nothing} ${e.career?A.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:A.nothing} ${e.health?A.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:A.nothing} ${e.finance?A.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:A.nothing} ${"advice"in e&&e.advice?A.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:A.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],g=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&p.length===0&&g.length===0?A.nothing:A.html`<div class="lucky">${i!==void 0?A.html`<span>Lucky number <strong>${i}</strong></span>`:A.nothing} ${l?A.html`<span>Lucky color <strong>${l}</strong></span>`:A.nothing} ${c.length?A.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:A.nothing} ${p.length?A.html`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:A.nothing} ${g.length?A.html`<span class="compat-wrap">Best with <span class="compat">${g.map(h=>A.html`<span>${h}</span>`)}</span></span>`:A.nothing}</div>`})()}</article>`}};ir.styles=[y,A.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([(0,Za.property)({type:String,reflect:!0})],ir.prototype,"period",2),ir=d([(0,Za.customElement)("roxy-horoscope-card")],ir);var Z=require("lit"),Ya=require("lit/decorators.js");var lr=class extends m{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(s=>({name:s.planet,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,kpNumber:s.kpNumber,retrograde:s.retrograde})),t=e.nodes;for(let[s,o]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])o&&r.push({name:s,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}renderEmpty(){return Z.html`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return Z.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?Z.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?Z.html`· ${r.nakshatra}`:Z.nothing} ${r.subLord?Z.html`· sub lord ${r.subLord}`:Z.nothing} ${typeof r.kpNumber=="number"?Z.html`· KP ${r.kpNumber}`:Z.nothing}</div>`:Z.nothing} ${typeof e.meta?.ayanamsa=="number"?Z.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${L(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?Z.html`· ${e.meta.houseSystem} houses`:Z.nothing}</div>`:Z.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>Z.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?Z.html`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>Z.html`<tr><td class="body">${r.name}${r.retrograde?Z.html`<span class="retro">R</span>`:Z.nothing}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:Z.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?Z.html`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>Z.html`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:Z.html`<p class="roxy-empty" role="status">No cusps</p>`}};lr.styles=[y,Z.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);width:100%;overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([(0,Ya.state)()],lr.prototype,"activeTab",2),lr=d([(0,Ya.customElement)("roxy-kp-chart")],lr);var Ie=require("lit"),us=require("lit/decorators.js");var Kr=class extends m{renderEmpty(){return Ie.html`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return Ie.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?Ie.html`<span class="ayanamsa">Ayanamsa: ${L(a.ayanamsa,2)}°</span>`:Ie.nothing}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>Ie.html`<tr><td class="planet">${r.planet} ${r.retrograde?Ie.html`<span class="retro">R</span>`:Ie.nothing}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Kr.styles=[y,Ie.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],Kr=d([(0,us.customElement)("roxy-kp-planets-table")],Kr);var ke=require("lit"),xs=require("lit/decorators.js");var Fr=class extends m{renderEmpty(){return ke.html`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return ke.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?ke.html`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:ke.nothing}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${a.moonSignLord??""}</dd><dt>Star lord</dt><dd>${a.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${a.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${a.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${a.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${a.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.lagnaSubSublord??""}</dd></dl></div></div>${a.rulingPlanets?.length?ke.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>ke.html`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:ke.nothing} ${e.length?ke.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${e.map(r=>ke.html`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:ke.nothing}</div>`}};Fr.styles=[y,ke.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],Fr=d([(0,xs.customElement)("roxy-kp-ruling-planets")],Fr);var ne=require("lit"),hs=require("lit/decorators.js");var gt=320,Oe=gt/2,qe=128,Go=118,Ho=140,Oo=150;function Ue(n,a){let e=n*Math.PI/180;return{x:Oe+a*Math.sin(e),y:Oe-a*Math.cos(e)}}var jo=[{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"}],Zr=class extends m{renderEmpty(){return ne.html`<div class="roxy-empty" role="status">No local space data</div>`}renderData(a){let e=a.bodies??[],r=a.birthDetails;return ne.html`<div class="wrap"><header><h2 class="title">Local space</h2>${r?ne.html`<div class="meta">${[r.date,r.time].filter(Boolean).join(" \xB7 ")}</div>`:ne.nothing}</header>${this.renderDial(e)} ${a.summary?ne.html`<p class="summary">${a.summary}</p>`:ne.nothing} ${this.renderList(e)}</div>`}renderDial(a){return ne.html`<svg viewBox="0 0 ${gt} ${gt}" role="img" aria-label="Local space compass of planetary directions from the birthplace"><title>Local space compass</title><desc>A compass centered on the birthplace. Each body is a line pointing to its azimuth, clockwise from north. Bodies below the horizon are dimmed.</desc><circle class="dial-fill" cx="${Oe}" cy="${Oe}" r="${qe}"/><circle class="dial" cx="${Oe}" cy="${Oe}" r="${qe*.66}" stroke-width="0.5"/><circle class="dial" cx="${Oe}" cy="${Oe}" r="${qe*.33}" stroke-width="0.5"/>${this.renderCompassRing()} ${this.renderSpokes(a)}<circle class="center-dot" cx="${Oe}" cy="${Oe}" r="2.5"/></svg>`}renderCompassRing(){let a=[];for(let i=0;i<360;i+=22.5){let l=Ue(i,qe),c=Ue(i,qe-(i%45===0?8:4));a.push(ne.svg`<line class="tick" x1=${c.x} y1=${c.y} x2=${l.x} y2=${l.y} />`)}let e=Ue(0,qe),r=Ue(180,qe),t=Ue(90,qe),s=Ue(270,qe),o=jo.map(({az:i,label:l})=>{let c=Ue(i,Oo),p=i%90===0;return ne.svg`<text class=${`compass-label${p?" cardinal":""}`} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${l}</text>`});return ne.svg`
|
|
83
|
+
<line class="cardinal-axis" x1=${e.x} y1=${e.y} x2=${r.x} y2=${r.y} />
|
|
84
|
+
<line class="cardinal-axis" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} />
|
|
85
|
+
${a}${o}`}renderSpokes(a){return a.map((e,r)=>{let t=Sr(e.planet,r),s=e.aboveHorizon===!1,o=Ue(e.azimuth,Go),i=Ue(e.azimuth,Ho),l=e.symbol||e.planet.slice(0,2),c=`${e.altitude>0?"+":""}${Math.round(e.altitude)}\xB0`;return ne.svg`<g>
|
|
86
|
+
<line class=${`spoke${s?" below":""}`} stroke=${t} x1=${Oe} y1=${Oe} x2=${o.x} y2=${o.y}><title>${e.planet} ${e.compassDirection} ${Math.round(e.azimuth)}° altitude ${c}</title></line>
|
|
87
|
+
<text class=${`body-glyph${s?" below":""}`} fill=${t} x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>
|
|
88
|
+
</g>`})}renderList(a){return a.length===0?ne.nothing:ne.html`<table class="list"><thead><tr><th>Body</th><th>Direction</th><th class="num">Azimuth</th><th class="num">Altitude</th><th>Horizon</th></tr></thead><tbody>${a.map((e,r)=>{let t=Sr(e.planet,r),s=e.aboveHorizon===!1;return ne.html`<tr><td><span class="body-cell"><span class="body-dot" style="${`background: ${t}`}"></span> ${e.symbol?ne.html`${e.symbol}`:ne.nothing}${e.planet}</span></td><td>${e.compassDirection}</td><td class="num">${Math.round(e.azimuth)}°</td><td class="num">${e.altitude>0?"+":""}${Math.round(e.altitude)}°</td><td><span class="${`horizon-pill ${s?"down":"up"}`}">${s?"Below":"Above"}</span></td></tr>`})}</tbody></table>`}};Zr.styles=[y,ne.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,480px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.dial{fill:none;stroke:var(--roxy-border,#e4e4e7)}.dial-fill{fill:color-mix(in srgb, var(--roxy-border,#e4e4e7) 10%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.cardinal-axis{stroke:var(--roxy-border,#e4e4e7);stroke-width:.5px}.tick{stroke:var(--roxy-secondary,#475569);stroke-width:.6px;opacity:.5}.compass-label{fill:var(--roxy-secondary,#475569);font-size:9px;font-weight:600;font-family:var(--roxy-font-sans)}.compass-label.cardinal,.center-dot{fill:var(--roxy-fg,#0a0a0a)}.spoke{stroke-width:1.4px}.spoke.below{stroke-dasharray:3 3;opacity:.4}.body-glyph{font-size:11px;font-weight:600;font-family:var(--roxy-font-sans)}.body-glyph.below{opacity:.45}.list{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}.list th,.list td{text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:4px 8px}.list th{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.04em;font-weight:600;font-size:var(--roxy-text-xs,.75rem)}.list td.num{text-align:right;font-variant-numeric:tabular-nums}.body-cell{align-items:center;gap:.4rem;display:inline-flex}.body-dot{border-radius:50%;flex-shrink:0;width:10px;height:10px}.horizon-pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:1px 7px}.horizon-pill.up{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.horizon-pill.down{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}`],Zr=d([(0,hs.customElement)("roxy-local-space-compass")],Zr);var Se=require("lit"),Re=require("lit/decorators.js");function Ls(n,a){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...t)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ue=class extends Se.LitElement{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=Ls(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let s={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let o=this.publishableKey??this.apiKey;o&&(s["X-API-Key"]=o);let i=await fetch(t,{headers:s,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return Se.html`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?Se.html`<span class="spinner" role="status" aria-label="Loading"></span>`:Se.nothing} ${this.isOpen?Se.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?Se.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>Se.html`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?Se.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:Se.nothing}</div>`}};ue.styles=[y,Se.css`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,Re.property)({type:String,attribute:"api-key"})],ue.prototype,"apiKey",2),d([(0,Re.property)({type:String,attribute:"publishable-key"})],ue.prototype,"publishableKey",2),d([(0,Re.property)({type:String})],ue.prototype,"endpoint",2),d([(0,Re.property)({type:String})],ue.prototype,"placeholder",2),d([(0,Re.property)({type:String,attribute:"default-value"})],ue.prototype,"defaultValue",2),d([(0,Re.state)()],ue.prototype,"query",2),d([(0,Re.state)()],ue.prototype,"results",2),d([(0,Re.state)()],ue.prototype,"isOpen",2),d([(0,Re.state)()],ue.prototype,"isLoading",2),d([(0,Re.state)()],ue.prototype,"highlight",2),ue=d([(0,Re.customElement)("roxy-location-search")],ue);var V=require("lit"),Va=require("lit/decorators.js");var dr=class extends m{constructor(){super(...arguments);this.mode="current"}renderEmpty(){return V.html`<div class="roxy-empty" role="status">No moon phase data</div>`}renderData(e){let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,s="year"in e?e.year:void 0;return V.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${s??""}</h2><div class="list" role="list">${r.map(o=>this.renderListItem(o))}</div></article>`}return"phase"in e?this.renderSingle(e):V.nothing}renderSingle(e){let r=e.meaning?.symbol||fs(e.phase);return V.html`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?V.html`<div class="date">${e.date}</div>`:V.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?V.html`<div><span>Illumination</span> <strong>${Bo(e.illumination)}</strong></div>`:V.nothing} ${typeof e.age=="number"?V.html`<div><span>Age</span> <strong>${L(e.age,1)} days</strong></div>`:V.nothing} ${e.sign?V.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:V.nothing} ${typeof e.distance=="number"?V.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:V.nothing}</div>${e.meaning?.description?V.html`<p class="meaning">${e.meaning.description}</p>`:V.nothing} ${e.meaning?.keywords?.length?V.html`<div class="keywords">${e.meaning.keywords.map(t=>V.html`<span>${t}</span>`)}</div>`:V.nothing}</article>`}renderListItem(e){let r=fs(e.phase);return V.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};dr.styles=[y,V.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([(0,Va.property)({type:String,reflect:!0})],dr.prototype,"mode",2),dr=d([(0,Va.customElement)("roxy-moon-phase")],dr);function fs(n){if(!n)return"\u{1F319}";let a=n.toLowerCase().trim(),e=a.replace(/\s*moon$/,"").trim(),r=e==="third quarter"?"last quarter":e;return ma[a]??ma[e]??ma[r]??ma[`${r} moon`]??"\u{1F319}"}function Bo(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var Y=require("lit"),bs=require("lit/decorators.js");var Yr=class extends m{renderData(a){let e=a.remedies;return Y.html`<article class="wrap" aria-label="${`Nakshatra ${a.name}`}"><header class="head"><h2 class="name">${a.name}</h2>${typeof a.number=="number"?Y.html`<span class="number">Nakshatra ${a.number} of 27</span>`:Y.nothing} ${a.range?Y.html`<span class="range">${a.range}</span>`:Y.nothing}</header><dl class="facts">${a.lord?Y.html`<div class="fact"><dt>Lord</dt><dd>${a.lord}</dd></div>`:Y.nothing} ${a.deity?Y.html`<div class="fact"><dt>Deity</dt><dd>${a.deity}</dd></div>`:Y.nothing} ${a.symbol?Y.html`<div class="fact"><dt>Symbol</dt><dd>${a.symbol}</dd></div>`:Y.nothing}</dl>${a.characteristics?Y.html`<div class="section"><h3>Characteristics</h3><p>${a.characteristics}</p></div>`:Y.nothing} ${e?Y.html`<div class="section"><h3>Remedies</h3><div class="remedies">${e.mantras?Y.html`<div class="remedy"><strong>Mantras:</strong> ${e.mantras}</div>`:Y.nothing} ${e.gemstones?Y.html`<div class="remedy"><strong>Gemstones:</strong> ${e.gemstones}</div>`:Y.nothing} ${e.rituals?Y.html`<div class="remedy"><strong>Rituals:</strong> ${e.rituals}</div>`:Y.nothing}</div></div>`:Y.nothing}</article>`}renderEmpty(){return Y.html`<div class="roxy-empty" role="status">No nakshatra data</div>`}};Yr.styles=[y,Y.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],Yr=d([(0,bs.customElement)("roxy-nakshatra-card")],Yr);var x=require("lit"),Vr=require("lit/decorators.js");var ut=420,S=ut/2,na=164,yt=146,xa=120,ia=96,Io=178,_o=196,Fe=class extends m{constructor(){super(...arguments);this.houseSystem="placidus";this.heading="Natal chart";this.view="wheel"}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}renderEmpty(){return x.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(e){let r=this.getPlanets(),t=e.aspects??[],s=this.view;return x.html`<div class="wrap"><header><h2 class="title">${this.heading}</h2>${e.birthDetails?x.html`<div class="meta">${[e.birthDetails.date,e.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:x.nothing}</header>${t.length>0?x.html`${oa({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:s,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${s}" role="tabpanel" aria-labelledby="natal-tab-${s}">${s==="wheel"?this.renderWheel(r,t):this.renderAspectGrid(r,t)}</div>`:this.renderWheel(r,t)}<div class="legend"><span>${r.length} planets</span> ${t.length>0?x.html`<span>${t.length} aspects</span>`:x.nothing} ${e.houseSystem?x.html`<span>${e.houseSystem} houses</span>`:x.nothing} ${t.length>0?x.html`<span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span>`:x.nothing}</div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return x.html`<svg viewBox="0 0 ${ut} ${ut}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${S}" cy="${S}" r="${na}" stroke-width="1.5"/><circle class="wheel-line" cx="${S}" cy="${S}" r="${yt-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${S}" cy="${S}" r="${xa}" stroke-width="1"/><circle class="wheel-line" cx="${S}" cy="${S}" r="${ia-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(o=>u(o.name)),s=new Map;for(let o of r){let i=[u(o.planet1),u(o.planet2)].sort().join("|");s.set(i,o)}return t.length===0?x.html`<p class="roxy-empty" role="status">No planets to grid</p>`:x.html`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(o=>{let i=C[o]??o.slice(0,2);return x.html`<th scope="col" title="${o}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((o,i)=>{let l=C[o]??o.slice(0,2);return x.html`<tr><th scope="row" title="${o}">${l}</th>${t.slice(0,i+1).map(c=>{let p=s.get([o,c].sort().join("|"));if(!p)return x.html`<td class="empty"></td>`;let g=aa(p),h=pa[g]??pa[g.replace(/-/g,"")]??g.slice(0,3),k=wr[g]??"aspect-other",f=L(p.orb,1);return x.html`<td class="${`cell ${k}`}" title="${`${o} ${g} ${c}${f?` (orb ${f}\xB0)`:""}`}"><span class="asp">${h}</span></td>`})} ${t.slice(i+1,-1).map(()=>x.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(ct(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(ct(r),"IC")));let s=this.data?.partOfFortune?.longitude;typeof s=="number"&&t.push(this.renderAngleMark(Ke(s),"PoF"));let o=this.data?.vertex?.longitude;return typeof o=="number"&&t.push(this.renderAngleMark(Ke(o),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),s=K(S,S,na,t),o=K(S,S,Io,t),i=K(S,S,_o,t);return x.svg`
|
|
77
89
|
<g>
|
|
78
90
|
<line class="angle-tick" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />
|
|
79
91
|
<text class="angle-marker" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r}</text>
|
|
80
92
|
</g>
|
|
81
|
-
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,s)=>this.getAscendant()+s*30)).map(t=>{let s=this.toAngle(t),o=
|
|
82
|
-
${
|
|
83
|
-
<text class="planet-glyph" x=${
|
|
84
|
-
<text class="planet-deg" x=${
|
|
85
|
-
</g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return u.nothing;let t=e?.retrogradePlanets??[];return u.html`<div class="details">${e?.dominantElement||e?.dominantModality?u.html`<div class="pill-row">${e.dominantElement?u.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:u.nothing} ${e.dominantModality?u.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:u.nothing}</div>`:u.nothing} ${r?u.html`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:u.nothing} ${t.length>0?u.html`<div class="pill-row">${t.map(s=>{let o=N[s]??s.slice(0,2);return u.html`<span class="pill pill--muted">${o} ${s} R</span>`})}</div>`:u.nothing} ${r?.summary?u.html`<p class="summary">${r.summary}</p>`:u.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return u.nothing;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],s=te,o={};for(let i of r)o[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=s.indexOf(h(i.sign??""));if(l<0)continue;let c=r[l%4],p=t[l%3],y=N[h(i.name)]??h(i.name).slice(0,2);o[c]?.[p]?.push(y)}return u.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>u.html`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,p)=>c+(o[i]?.[p]?.length??0),0);return u.html`<tr><th scope="row">${i}</th>${t.map(c=>u.html`<td>${(o[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>u.html`<td class="em-total">${r.reduce((l,c)=>l+(o[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?u.nothing:u.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let s=r.interpretation,o=N[h(r.name)]??"",i=f(r.degree??0,1);return u.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${o} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${Re()}</span></summary><div class="interp-body">${s.summary?u.html`<p class="interp-summary">${s.summary}</p>`:u.nothing} ${s.detailed?u.html`<p class="interp-detail">${s.detailed}</p>`:u.nothing} ${s.keywords?.length?u.html`<div class="interp-keywords">${s.keywords.map(l=>u.html`<span class="kw">${l}</span>`)}</div>`:u.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let s of e){if(typeof s.longitude!="number")continue;let o=h(s.name);o&&t.set(o,s.longitude)}return r.map(s=>{let o=t.get(h(s.planet1)),i=t.get(h(s.planet2));if(o===void 0||i===void 0)return u.nothing;let l=B(k,k,Kr-18,this.toAngle(o)),c=B(k,k,Kr-18,this.toAngle(i)),p=jr(s),y=gr[p]??"aspect-other",x=f(s.orb,1);return u.svg`<line class=${`aspect ${y}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p||""} ${s.planet2}${x?` (orb ${x}\xB0)`:""}</title></line>`})}};je.styles=[g,Ue,Ke,u.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{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-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([(0,_r.property)({type:String,attribute:"house-system",reflect:!0})],je.prototype,"houseSystem",2),d([(0,_r.state)()],je.prototype,"view",2),je=d([(0,_r.customElement)("roxy-natal-chart")],je);var S=require("lit"),Ca=require("lit/decorators.js");var rr=class extends m{constructor(){super(...arguments);this.type="life-path"}renderData(e){let r=Qs[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalDay"in e?this.renderPeriod(r,e.personalDay,e.theme,e.guidance):"personalMonth"in e?this.renderPeriod(r,e.personalMonth,e.theme,e.focus):"personalYear"in e?this.renderPersonalYear(e,r):"dailyMessage"in e?this.renderPeriod(r,e.number,e.meaning?.title,e.dailyMessage):this.renderNumberCard(e,r)}renderPeriod(e,r,t,s){return S.html`<article class="card" aria-label="${e}"><div class="hero">${typeof r=="number"?S.html`<div class="numeral">${r}</div>`:S.nothing}<div><p class="label">${e}</p>${t?S.html`<h2 class="title">${t}</h2>`:S.nothing}</div></div>${s?S.html`<p class="meaning">${s}</p>`:S.nothing}</article>`}renderEmpty(){return S.html`<div class="roxy-empty" role="status">No numerology data</div>`}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return S.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?S.html`<div class="numeral">${e.number}</div>`:S.nothing}<div><p class="label">${r}</p>${e.meaning?.title?S.html`<h2 class="title">${e.meaning.title}</h2>`:S.nothing}</div></div>${e.meaning?.description?S.html`<p class="meaning">${e.meaning.description}</p>`:S.nothing} ${e.calculation?S.html`<pre class="calc">${e.calculation}</pre>`:S.nothing} ${t.length>0?S.html`<div class="chips">${t.map(s=>S.html`<span>${s}</span>`)}</div>`:S.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?S.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${eo(e.karmicDebtMeaning)}</div>`:S.nothing}</article>`}renderPersonalYear(e,r){return S.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?S.html`<div class="numeral">${e.personalYear}</div>`:S.nothing}<div><p class="label">${r}</p>${e.theme?S.html`<h2 class="title">${e.theme}</h2>`:S.nothing}</div></div>${e.forecast?S.html`<p class="meaning">${e.forecast}</p>`:S.nothing} ${e.advice?S.html`<p>${e.advice}</p>`:S.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,s])=>s!=null);return S.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?S.html`<h2 class="title">${e.profile.name}</h2>`:S.nothing}</div>${t.length>0?S.html`<div class="cores">${t.map(([s,o])=>S.html`<div class="item"><span>${Y(s)}</span> <strong>${o.number??""}</strong></div>`)}</div>`:S.nothing}</article>`}};rr.styles=[g,S.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([(0,Ca.property)({type:String,reflect:!0})],rr.prototype,"type",2),rr=d([(0,Ca.customElement)("roxy-numerology-card")],rr);var Qs={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","birth-day":"Birth Day",maturity:"Maturity",daily:"Daily Number","personal-day":"Personal Day","personal-month":"Personal Month","personal-year":"Personal Year",chart:"Numerology chart"};function eo(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var q=require("lit"),Ta=require("lit/decorators.js");var ar=class extends m{constructor(){super(...arguments);this.detail="detailed"}renderEmpty(){return q.html`<div class="roxy-empty" role="status">No panchang data</div>`}renderData(e){let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let s=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(y=>!!y[1]):[],o=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],p=r&&"transitions"in r?r.transitions:void 0;return q.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?Ce(r.date):""}</span></header><table><tbody>${t.map(([y,x])=>q.html`<tr><th>${y}</th><td>${x}</td></tr>`)} ${r?.sunrise?q.html`<tr><th>Sunrise</th><td>${Ne(r.sunrise)}</td></tr>`:q.nothing} ${r?.sunset?q.html`<tr><th>Sunset</th><td>${Ne(r.sunset)}</td></tr>`:q.nothing} ${r?.moonrise?q.html`<tr><th>Moonrise</th><td>${Ne(r.moonrise)}</td></tr>`:q.nothing} ${r?.moonset?q.html`<tr><th>Moonset</th><td>${Ne(r.moonset)}</td></tr>`:q.nothing} ${s.map(([y,x])=>q.html`<tr><th>${y}</th><td>${x}</td></tr>`)}</tbody></table>${p?q.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",p.tithi)} ${this.renderTransitionRow("Nakshatra",p.nakshatra)} ${this.renderTransitionRow("Yoga",p.yoga)} ${this.renderTransitionRow("Karana",p.karana)}</tbody></table>`:q.nothing} ${this.detail==="detailed"&&(o.some(y=>!!y[1])||i.length>0||l.some(y=>!!y[1])||c.length>0)?q.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...o.filter(y=>!!y[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(y=>!!y[1]),...c])}</tbody></table>`:q.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let s=Ga(t);return s?q.html`<tr><th>${r}</th><td>${s}</td></tr>`:q.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,s)=>[r.length>1?`${e} ${s+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return q.nothing;let t=Ne(r.endsAt),s=r.next?` \u2192 ${r.next}`:"";return q.html`<tr><th>${e}</th><td>ends ${t}${s}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=Ga(e);return r?`${e.current} (${r})`:e.current}};ar.styles=[g,q.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([(0,Ta.property)({type:String,reflect:!0})],ar.prototype,"detail",2),ar=d([(0,Ta.customElement)("roxy-panchang-table")],ar);var le=require("lit"),It=require("lit/decorators.js");var Kt=["name","english","title"],ro=new Set(["description","meaning","characteristics","tagline","definedMeaning","undefinedMeaning","motto"]),ao=new Set(["id","symbol","keywords",...Kt]),Nr=class extends m{renderData(a){let e=a,r=this.deriveTitle(e),t=typeof e.symbol=="string"?e.symbol:void 0,s=Array.isArray(e.keywords)?e.keywords.map(String):[],o=[],i=[],l=[];for(let[c,p]of Object.entries(e))if(!(ao.has(c)||p==null))if(Array.isArray(p)){let y=p.filter(x=>x!=null).map(String);y.length>0&&i.push([c,y])}else typeof p=="string"?ro.has(c)||p.length>48?o.push([c,p]):l.push([c,p]):(typeof p=="number"||typeof p=="boolean")&&l.push([c,String(p)]);return le.html`<article class="card" aria-label="${r}"><header class="head">${t?le.html`<span class="symbol" aria-hidden="true">${t}</span>`:le.nothing}<div><p class="label">Reference</p><h2 class="name">${r}</h2></div></header>${s.length>0?le.html`<div class="chips">${s.map(c=>le.html`<span>${c}</span>`)}</div>`:le.nothing} ${o.map(([c,p])=>le.html`<p class="prose"><span class="prose-label">${Y(c)}</span>${p}</p>`)} ${l.length>0?le.html`<div class="facts-wrap"><dl class="facts">${l.map(([c,p])=>le.html`<div class="fact"><dt>${Y(c)}</dt><dd>${p}</dd></div>`)}</dl></div>`:le.nothing} ${i.map(([c,p])=>le.html`<div class="list"><h3>${Y(c)}</h3><div class="chips">${p.map(y=>le.html`<span>${y}</span>`)}</div></div>`)}</article>`}renderEmpty(){return le.html`<div class="roxy-empty" role="status">No reference data</div>`}deriveTitle(a){for(let t of Kt)if(typeof a[t]=="string")return a[t];let e=typeof a.type=="string"?Y(a.type):"",r=a.number;return r!=null?`${e} ${r}`.trim():"Reference"}};Nr.styles=[g,le.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.symbol{color:var(--roxy-accent-ink,#b45309);flex:none;font-size:2.5rem;line-height:1}.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);margin:0}.prose{margin:0;line-height:1.6}.prose .prose-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px;display:block}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list h3,.facts-wrap 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}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));margin:0;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize}.fact dd{font-size:var(--roxy-text-sm,.875rem);margin:0}`],Nr=d([(0,It.customElement)("roxy-reference-card")],Nr);var ke=require("lit"),_t=require("lit/decorators.js");var Va=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],Lr=class extends m{renderEmpty(){return ke.html`<div class="roxy-empty" role="status">No shadbala data</div>`}renderData(a){if(!a.planets?.length)return this.renderEmpty();let e=[...a.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return ke.html`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${Va.map(r=>ke.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(a){let e=N[h(a.planet)]??"",r=Va.map(c=>Math.max(0,a[c.key])),t=r.reduce((c,p)=>c+p,0),s=typeof a.strengthRatio=="number"&&a.strengthRatio>=1,o=s?"adequacy-badge--adequate":"adequacy-badge--weak",i=s?"adequate":"weak",l=f(a.totalRupas,2)&&f(a.minRequired,2)?`${f(a.totalRupas,2)} / ${f(a.minRequired,2)} R`:"";return ke.html`<div class="planet-row" role="listitem" aria-label="${a.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${e}</span> ${a.planet} <span class="rank-badge" aria-label="rank ${a.relativeRank}">#${a.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${a.planet}">${t>0?Va.map((c,p)=>{let y=r[p];if(y<=0)return ke.nothing;let x=y/t*100;return ke.html`<div class="bar-segment" style="flex-grow:${x};background:${c.color}" title="${c.label}: ${f(y,1)}"></div>`}):ke.nothing}</div></div><div class="pills">${l?ke.html`<span class="rupas-label">${l}</span>`:ke.nothing} <span class="${`adequacy-badge ${o}`}">${i}</span></div></div>`}};Lr.styles=[g,ke.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],Lr=d([(0,_t.customElement)("roxy-shadbala-table")],Lr);var w=require("lit"),Ft=require("lit/decorators.js");var Wa=360,V=Wa/2,Ya=170,to=154,Ua=124,Fr=96,Mr=class extends m{renderEmpty(){return w.html`<div class="roxy-empty" role="status">No synastry data</div>`}renderData(a){let{person1:e,person2:r,compatibilityScore:t,analysis:s}=a,o=a.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,p=s?.overall,y=s?.strengths??[],x=s?.challenges??[];return i.length>0&&l.length>0?w.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?w.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:w.nothing}</div><svg viewBox="0 0 ${Wa} ${Wa}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${V}" cy="${V}" r="${Ya}" stroke-width="1.5"/><circle class="wheel-line" cx="${V}" cy="${V}" r="${Fr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${V}" cy="${V}" r="${Fr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,o)} ${this.renderRing(i,Ua,"p1",1)} ${this.renderRing(l,Fr,"p2",2)} ${this.renderAscendants(a)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${p?w.html`<p class="summary">${p}</p>`:w.nothing} ${o.length>0?this.renderAspects(o):w.nothing} ${y.length>0||x.length>0?w.html`<div class="lists">${y.length?w.html`<div><h3>Strengths</h3><ul>${y.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing} ${x.length?w.html`<div><h3>Challenges</h3><ul>${x.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing}</div>`:w.nothing}</div>`:w.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?w.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:w.nothing}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code><roxy-data></code> fallback.</div>${p?w.html`<p class="summary">${p}</p>`:w.nothing} ${o.length>0?this.renderAspects(o):w.nothing} ${y.length>0||x.length>0?w.html`<div class="lists">${y.length?w.html`<div><h3>Strengths</h3><ul>${y.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing} ${x.length?w.html`<div><h3>Challenges</h3><ul>${x.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing}</div>`:w.nothing}</div>`}toAngle(a){return 180-a}renderSpokes(){return Array.from({length:12},(a,e)=>{let r=this.toAngle(e*30),t=B(V,V,Fr-14,r),s=B(V,V,Ya,r);return w.svg`<line class="wheel-line" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return te.map((a,e)=>{let r=this.toAngle(e*30+15),t=B(V,V,to,r);return w.svg`<text class="sign" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${pe[a]}</text>`})}renderRing(a,e,r,t){return a.map(s=>{if(!Number.isFinite(s.longitude))return w.nothing;let o=this.toAngle(s.longitude),i=B(V,V,e,o),c=B(V,V,e+(t===1?-12:-10),o),p=N[h(s.name)]??s.name.slice(0,2),y=Me(s.longitude),x=s.isRetrograde===!0,j=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,b=`${s.name}${x?" retrograde":""} - ${j} ${y.sign}`;return w.svg`<g>
|
|
86
|
-
<text class=${r} x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central"><title>${
|
|
87
|
-
<text class="planet-deg" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${
|
|
88
|
-
</g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=
|
|
89
|
-
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${
|
|
90
|
-
<text class="asc-label" x=${
|
|
91
|
-
</g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=h(o);for(let l of s)if(h(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return w.nothing;let l=B(V,V,Ua-12,this.toAngle(o)),c=B(V,V,Fr+8,this.toAngle(i)),p=jr(s),y=gr[p]??"aspect-other",x=f(s.orb,1);return w.svg`<line class=${`aspect ${y}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p} ${s.planet2}${x?` (orb ${x}\xB0)`:""}</title></line>`})}renderAspects(a){return w.html`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(e=>w.html`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${jr(e)||""}</td><td class="orb">${f(e.orb,1)}</td><td>${so(e.strength)}</td></tr>`)}</tbody></table>`}};Mr.styles=[g,w.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],Mr=d([(0,Ft.customElement)("roxy-synastry-chart")],Mr);function so(n){return typeof n=="number"?Math.round(n).toString():""}var A=require("lit"),Ea=require("lit/decorators.js");var tr=class extends m{constructor(){super(...arguments);this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}renderEmpty(){return A.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderData(e){return"card"in e?this.renderDailyCard(e):this.renderFullCard(e)}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,s=r.keywords??[];return A.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?A.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:A.html`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?A.html`${r.arcana} arcana`:A.nothing} ${t?A.html`· reversed`:A.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?A.html`<p class="message">${e.dailyMessage}</p>`:A.nothing} ${r.meaning?A.html`<p>${r.meaning}</p>`:A.nothing} ${s.length>0?A.html`<div class="chips">${s.map(o=>A.html`<span>${o}</span>`)}</div>`:A.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,s=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return A.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?A.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:A.html`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?A.html`${e.arcana} arcana`:A.nothing} ${e.number!==void 0&&e.number!==null?A.html`· ${e.number}`:A.nothing} ${r?A.html`· reversed`:A.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?A.html`<p>${t.description}</p>`:A.nothing} ${s.length>0?A.html`<div class="chips">${s.map(o=>A.html`<span>${o}</span>`)}</div>`:A.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};tr.styles=[g,A.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([(0,Ea.state)()],tr.prototype,"flipped",2),tr=d([(0,Ea.customElement)("roxy-tarot-card")],tr);var or=require("lit"),Da=require("lit/decorators.js");var sr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return or.html`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let r=e.cards??[];if(r.length===0)return this.renderEmpty();let t=this.heading||"Tarot deck",s=typeof e.total=="number"?e.total:r.length;return or.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"card":"cards"}</span></header><ul class="grid">${r.map(o=>or.html`<li class="tile">${o.imageUrl?or.html`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:or.html`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${oo(o)}</p></li>`)}</ul></section>`}};sr.styles=[g,or.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(7rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.art{aspect-ratio:2/3;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meta{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0}`],d([(0,Da.property)({type:String,reflect:!0})],sr.prototype,"heading",2),sr=d([(0,Da.customElement)("roxy-tarot-catalog")],sr);function oo(n){return n.suit?`${h(n.arcana)} \xB7 ${h(n.suit)}`:`${h(n.arcana)} Arcana`}var z=require("lit"),Pa=require("lit/decorators.js");var nr=class extends m{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return z.html`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let r="answer"in e,t="cards"in e&&!("spread"in e),s=t?[]:"positions"in e?e.positions??[]:[],o=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),p="question"in e?e.question:void 0,y="summary"in e?e.summary:void 0,x=r?e.interpretation:void 0,j=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return z.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?z.html`<span class="question">"${p}"</span>`:z.nothing}</header>${r?z.html`<div><span class="${`answer ${j}`}">${i}</span> ${l?z.html`<small>· ${l}</small>`:z.nothing}</div>`:z.nothing} ${s.length>0?z.html`<div class="grid">${s.map(b=>z.html`<div class="card"><p class="label">${b.name??""}</p><div class="image">${b.card?.imageUrl?z.html`<img src="${b.card.imageUrl}" alt="${b.card.name??"tarot card"}" class="${b.card.reversed?"reversed":""}">`:z.html`${b.card?.name??"?"}`}</div><p class="name">${b.card?.name??""} ${b.card?.reversed?z.html`<small>(reversed)</small>`:z.nothing}</p>${b.interpretation?z.html`<p class="interp">${b.interpretation}</p>`:z.nothing}</div>`)}</div>`:z.nothing} ${o.length>0?z.html`<div class="grid">${o.map(b=>z.html`<div class="card"><div class="image">${b.imageUrl?z.html`<img src="${b.imageUrl}" alt="${b.name??"tarot card"}" class="${b.reversed?"reversed":""}">`:z.html`${b.name??"?"}`}</div><p class="name">${b.name??""} ${b.reversed?z.html`<small>(reversed)</small>`:z.nothing}</p>${b.meaning?z.html`<p class="interp">${b.meaning}</p>`:z.nothing}</div>`)}</div>`:z.nothing} ${y?z.html`<p class="reading">${y}</p>`:z.nothing} ${x?z.html`<p class="reading">${x}</p>`:z.nothing}</article>`}};nr.styles=[g,z.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([(0,Pa.property)({type:String,reflect:!0})],nr.prototype,"spread",2),nr=d([(0,Pa.customElement)("roxy-tarot-spread")],nr);var M=require("lit"),za=require("lit/decorators.js");var ir=class extends m{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return M.html`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:r,transitTime:t,transitPlanets:s,transitAspects:o,summary:i}=e,l=[Ce(r),Ne(t)].filter(Boolean).join(" "),c=o?.length??0,p=this.tab;return M.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?M.html`<p class="subtitle">${l}</p>`:M.nothing}</div>${c>0?M.html`${Br({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],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"?M.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:M.html`${i?this.renderSummaryPills(i):M.nothing}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:M.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return M.html`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return M.html`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=N[h(r.name)]??"",s=pe[h(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return M.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?M.html`<span class="retro-badge" aria-label="retrograde">R</span>`:M.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${f(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${f(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return M.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=N[h(r.transitPlanet)]??"",o=N[h(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return M.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${s}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${o}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${f(r.orb,2)}° · strength ${f(r.strength,1)} </span>${Re()}</summary><div class="interp-body">${l?.summary?M.html`<p>${l.summary}</p>`:M.nothing} ${l?.impact?M.html`<p><strong>Impact:</strong> ${l.impact}</p>`:M.nothing} ${l?.timing?M.html`<p><strong>Timing:</strong> ${l.timing}</p>`:M.nothing} ${l?.guidance?M.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:M.nothing} ${l?.keywords?.length?M.html`<div class="interp-keywords">${l.keywords.map(y=>M.html`<span class="kw">${y}</span>`)}</div>`:M.nothing}</div></details>`})}</div>`}};ir.styles=[g,Ue,Ke,M.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([(0,za.state)()],ir.prototype,"tab",2),ir=d([(0,za.customElement)("roxy-transits-table")],ir);var oe=require("lit"),qt=require("lit/decorators.js");var Gr=class extends m{renderEmpty(){return oe.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[];if(e.length===0&&r.length===0)return this.renderEmpty();let t=a.datetime?String(a.datetime).replace("T"," "):"";return oe.html`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${t?oe.html`<p class="subtitle">${t}</p>`:oe.nothing}</div>${r.length>0?oe.html`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(s=>oe.html`<span class="mutual-pill">${s.planet1} ⟷ ${s.planet2} ${s.aspectType?oe.html`<span class="rel">${s.aspectType}</span>`:oe.nothing}</span>`)}</div></div>`:oe.nothing} ${e.length>0?oe.html`<div class="overflow-scroll"><table><thead><tr><th scope="col">From</th><th scope="col">Aspect</th><th scope="col">To</th><th scope="col">Strength</th><th scope="col">Orb</th></tr></thead><tbody>${e.map(s=>oe.html`<tr><td>${s.aspectingPlanet}</td><td><span class="kind">${s.aspectType}</span></td><td>${s.aspectedPlanet}</td><td>${typeof s.strength=="number"?oe.html`<span class="bar" style="width:${Math.max(4,Math.min(100,s.strength)*.4)}px"></span><span class="num">${f(s.strength,0)}</span>`:oe.nothing}</td><td class="num">${typeof s.orb=="number"?`${f(s.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:oe.nothing}</div>`}};Gr.styles=[g,oe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.mutual{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.mutual-pill{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:.35rem;padding:2px 10px;display:inline-flex}.mutual-pill .rel{font-size:var(--roxy-text-xs,.75rem);font-weight:400}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}tbody tr:last-child td{border-bottom:none}.kind{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);font-size:var(--roxy-text-xs,.75rem);padding:1px 8px;font-weight:600;display:inline-block}.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.bar{background:var(--roxy-accent,#f59e0b);vertical-align:middle;border-radius:3px;height:6px;margin-right:6px;display:inline-block}`],Gr=d([(0,qt.customElement)("roxy-vedic-aspects")],Gr);var Ja=require("lit"),qr=require("lit/decorators.js");var Ge=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e}}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?xa(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return Ja.html`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let t=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return Ja.html`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${fa(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>${ha(r,this.chartStyle)}</svg></div>`}};Ge.styles=[g,ba,Ue],d([(0,qr.property)({type:String,reflect:!0,attribute:"chart-style"})],Ge.prototype,"chartStyle",2),d([(0,qr.property)({type:String,reflect:!0,attribute:"chart-reference"})],Ge.prototype,"chartReference",2),d([(0,qr.property)({type:String,reflect:!0,attribute:"lagna-override"})],Ge.prototype,"lagnaOverride",2),Ge=d([(0,qr.customElement)("roxy-vedic-kundli")],Ge);var C=require("lit"),Vt=require("lit/decorators.js");var no=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Hr=class extends m{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of no){let s=a[t];s&&(r.push([t,s]),e.add(t))}for(let[t,s]of Object.entries(a))e.has(t)||r.push([t,s]);return r}renderEmpty(){return C.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return C.html`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let s=(t.graha??r)==="Lagna",o=N[h(t.graha??r)]??"",i=pe[h(t.rashi??"")]??"";return C.html`<tr class="${s?"lagna":""}"><td class="graha">${o?C.html`<span class="glyph">${o}</span>`:C.nothing}${t.graha??r}</td><td>${i?C.html`<span class="glyph">${i}</span>`:C.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?ya(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?C.html`<span class="retro">R</span>`:C.nothing}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let a=this.data?.combustion??[];return a.length===0?C.nothing:C.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>{let r=N[h(e.planet)]??"",t=f(e.distanceFromSun,2),s=f(e.orb,1);return C.html`<div class="condition"><span class="planet">${r?`${r} `:""}${e.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let a=this.data?.planetaryWar??[];return a.length===0?C.nothing:C.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>{let r=f(e.distance,2);return C.html`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let a=this.data?.interpretations??{},e=this.orderedRows().map(([r,t])=>[t.graha??r,a[t.graha??r]]).filter(([,r])=>r!=null);return e.length===0?C.nothing:C.html`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${Re()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=N[h(r)]??"";return C.html`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?C.html`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:C.nothing} ${t.nakshatra?C.html`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:C.nothing}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?C.nothing:C.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>C.html`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?C.html`<p class="desc">${e.description}</p>`:C.nothing}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?C.nothing:C.html`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>C.html`<div class="bhava"><span class="name">${e.name} ${e.quality?C.html`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:C.nothing}</span> ${e.result?C.html`<p class="desc">${e.result}</p>`:C.nothing}</div>`)}</div></details>`}};Hr.styles=[g,Ke,C.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],Hr=d([(0,Vt.customElement)("roxy-vedic-planets-table")],Hr);var ye=require("lit"),Yt=require("lit/decorators.js");var Or=class extends m{rows(){let a=this.data;if(!a)return[];let e=(a.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,t]of[["Ascendant",a.ascendant],["Midheaven",a.midheaven],["Part of Fortune",a.partOfFortune],["Vertex",a.vertex]])t&&e.push({name:r,sign:t.sign,longitude:t.longitude,isPoint:!0});return e}renderEmpty(){return ye.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return ye.html`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=N[h(r.name)]??"",s=pe[h(r.sign??"")]??"",o=typeof r.speed=="number"?f(r.speed,3):"";return ye.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?ye.html`<span class="glyph">${t}</span>`:ye.nothing}${r.name}</td><td>${s?ye.html`<span class="glyph">${s}</span>`:ye.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?ya(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?ye.html`${o}°/day`:ye.nothing} ${r.isRetrograde?ye.html`<span class="retro">℞</span>`:ye.nothing}</td></tr>`})}</tbody></table></div>`}};Or.styles=[g,ye.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],Or=d([(0,Yt.customElement)("roxy-western-planets-table")],Or);var Z=require("lit"),Aa=require("lit/decorators.js");var lr=class extends m{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Z.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return Z.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Z.nothing}</p>${e.description?Z.html`<p class="description">${e.description}</p>`:Z.nothing} ${e.result?Z.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Z.nothing}</div>`}renderEmpty(){return Z.html`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return Z.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,p=r?c.filter(x=>x.name.toLowerCase().includes(r)):c,y=e.total;return Z.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${y!==void 0?Z.html`<span class="count">${y} total</span>`:Z.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(x=>this.renderDetailCard(x)):Z.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let o=t,i=r?o.filter(c=>c.name.toLowerCase().includes(r)):o,l=e.total;return Z.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Z.html`<span class="count">${l} total</span>`:Z.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>Z.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Z.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Z.html`<div class="roxy-empty" role="status">No yoga data</div>`}};lr.styles=[g,Z.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([(0,Aa.state)()],lr.prototype,"filter",2),lr=d([(0,Aa.customElement)("roxy-yoga-list")],lr);var Na=[{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:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyVedicAspects",tag:"roxy-vedic-aspects",slug:"vedic-aspects",heading:"Vedic aspects",description:"Vedic graha drishti table: which planet aspects which, with mutual aspects surfaced first",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/aspects",docsSummary:"Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",topic:"Vedic"},{pascal:"RoxyHoraTable",tag:"roxy-hora-table",slug:"hora-table",heading:"Hora",description:"Vedic Hora (planetary hours) table: 12 day and 12 night horas by ruling planet for electional timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/hora",docsSummary:"Day and night planetary hours with ruling planet and window",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, soul urge, personality, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,soul-urge,personality,birth-day,maturity,daily,personal-day,personal-month,personal-year,chart}",docsSummary:"Life path, expression, soul urge, personality, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotCatalog",tag:"roxy-tarot-catalog",slug:"tarot-catalog",heading:"Tarot deck",description:"Responsive tarot deck gallery with card art, name, and an arcana and suit caption from the tarot catalog response",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards",docsSummary:"Deck gallery tiles with card art, name, and arcana and suit",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyHdConnection",tag:"roxy-hd-connection",slug:"hd-connection",heading:"HD connection",description:"Human Design connection chart: the composite channels two people form, with circuit, dynamic, and which person holds each gate",docsLabel:"Human Design",endpointLabel:"POST /human-design/connection",docsSummary:"Electromagnetic, compromise, and dominance channels between two charts",topic:"Human Design"},{pascal:"RoxyHdPenta",tag:"roxy-hd-penta",slug:"hd-penta",heading:"HD penta",description:"Human Design penta for a 3 to 5 person group: upper and lower triangle channels, defined or open, with core channels and member coverage",docsLabel:"Human Design",endpointLabel:"POST /human-design/penta",docsSummary:"Group penta channels split into upper and lower triangles",topic:"Human Design"},{pascal:"RoxyHdVariables",tag:"roxy-hd-variables",slug:"hd-variables",heading:"HD variables",description:"Human Design variables: the four PHS arrows (determination, environment, perspective, motivation) with left/right direction and color, tone, and base",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction and PHS labels",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyForecastDigest",tag:"roxy-forecast-digest",slug:"forecast-digest",heading:"Forecast digest",description:"Rolled-up forecast across the next 24 hours, 7, 30, and 90 days with per-domain breakdown and top events",docsLabel:"Forecast",endpointLabel:"POST /forecast/digest",docsSummary:"Per-window event counts, domain breakdown, and the highest-significance events",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyCrystalCard",tag:"roxy-crystal-card",slug:"crystal-card",heading:"Crystal detail",description:"Single-crystal detail card with photo, spiritual, emotional, and physical meaning, metaphysical attributes, affirmation, and pairings",docsLabel:"Crystals",endpointLabel:"GET /crystals/{id}",docsSummary:"Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",topic:"Crystals"},{pascal:"RoxyCrystalGrid",tag:"roxy-crystal-grid",slug:"crystal-grid",heading:"Crystal grid",description:"Responsive crystal gallery with photo, name, and colour swatches from any crystals list response",docsLabel:"Crystals",endpointLabel:"GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",docsSummary:"Crystal gallery tiles with photo, name, and colour swatches",topic:"Crystals"},{pascal:"RoxyDreamCard",tag:"roxy-dream-card",slug:"dream-card",heading:"Dream symbol",description:"Dream symbol card with the symbol name, full interpretation, and dictionary letter",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols/{id}",docsSummary:"Symbol name, interpretation body, and letter chip",topic:"Dreams"},{pascal:"RoxyDreamSearch",tag:"roxy-dream-search",slug:"dream-search",heading:"Dream search",description:"Dream-symbol search results as selectable tiles; emits roxy-symbol-select to pair with roxy-dream-card",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols",docsSummary:"Matched dream symbols as selectable tiles with a letter chip",topic:"Dreams"},{pascal:"RoxyAngelNumberCard",tag:"roxy-angel-number-card",slug:"angel-number-card",heading:"Angel number",description:"Angel number card with title, core message, badges, keywords, life-area interpretations, affirmation, and action steps",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/numbers/{number}",docsSummary:"Number meaning with spiritual, love, career, money, twin flame, biblical, and shadow sections",topic:"Angel Numbers"},{pascal:"RoxyAngelNumberLookup",tag:"roxy-angel-number-lookup",slug:"angel-number-lookup",heading:"Angel number lookup",description:"Angel number sequence analysis with pattern classification, the known meaning when present, and a digit-root fallback for any number",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/lookup",docsSummary:"Pattern analysis plus known meaning and digit-root fallback",topic:"Angel Numbers"},{pascal:"RoxyReferenceCard",tag:"roxy-reference-card",slug:"reference-card",heading:"Reference card",description:"Glossary entry for any reference lookup: zodiac sign, planet meaning, rashi, I Ching trigram, Human Design gate or center, numerology number or compound number",docsLabel:"Reference",endpointLabel:"GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/rashis/{id}, /iching/trigrams/{id}, /human-design/{gates,centers}/{id}, /numerology/{meanings,compound-number}/{number}",docsSummary:"Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",topic:"Helpers"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint, from the spec",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Ut="0.11.0";var io=Na.map(n=>n.slug);
|
|
93
|
+
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,s)=>this.getAscendant()+s*30)).map(t=>{let s=this.toAngle(t),o=K(S,S,xa,s),i=K(S,S,na,s);return x.svg`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return de.map((e,r)=>{let t=this.toAngle(r*30+15),s=K(S,S,yt,t);return x.svg`<text class="sign-glyph" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${ae[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,s)=>{let o=e[(s+1)%12],i=Xt(t.longitude,o?o.longitude:t.longitude+30),l=K(S,S,xa-12,this.toAngle(i));return x.svg`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,s)=>{let o=this.toAngle(s*30+15),i=K(S,S,xa-12,o),l=(s-r+12)%12+1;return x.svg`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),s=r%30===0,o=s?yt-14:na-5,i=K(S,S,o,t),l=K(S,S,na,t);e.push(x.svg`<line class=${s?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${s?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?x.nothing:e.map(r=>{let t=this.toAngle(r.longitude),s=K(S,S,xa+9,t),o=Ge(r.longitude);return x.svg`<text class="cusp-deg" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${o.degree}°${String(o.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(o=>Number.isFinite(o.longitude)).map(o=>({p:o,trueLon:Ke(o.longitude),displayLon:Ke(o.longitude)})).sort((o,i)=>o.trueLon-i.trueLon);for(let o=1;o<t.length;o++){let i=t[o-1],l=t[o];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let s=t[t.length-1];if(s&&s.displayLon>360){let o=s.displayLon-360;for(let i of t)i.displayLon-=o}return t.map(({p:o,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),p=this.toAngle(l),g=K(S,S,ia,p),h=K(S,S,ia-13,p),k=K(S,S,na-4,c),f=K(S,S,ia+8,p),fr=C[u(o.name)]??o.name.slice(0,2),je=Ge(o.longitude),ca=o.isRetrograde===!0,ha=`${je.degree}\xB0${String(je.minute).padStart(2,"0")}'`,La=Math.abs(l-i)>.5;return x.svg`<g>
|
|
94
|
+
${La?x.svg`<line class="planet-leader" x1=${k.x} y1=${k.y} x2=${f.x} y2=${f.y} />`:x.nothing}
|
|
95
|
+
<text class="planet-glyph" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}${ca?" retrograde":""} - ${ha} ${o.sign??""}</title>${fr}</text>
|
|
96
|
+
<text class="planet-deg" x=${h.x} y=${h.y} text-anchor="middle" dominant-baseline="central">${ha}${ca?x.svg`<tspan class="retro"> ℞</tspan>`:x.nothing}</text>
|
|
97
|
+
</g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return x.nothing;let t=e?.retrogradePlanets??[];return x.html`<div class="details">${e?.dominantElement||e?.dominantModality?x.html`<div class="pill-row">${e.dominantElement?x.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:x.nothing} ${e.dominantModality?x.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:x.nothing}</div>`:x.nothing} ${r?x.html`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:x.nothing} ${t.length>0?x.html`<div class="pill-row">${t.map(s=>{let o=C[s]??s.slice(0,2);return x.html`<span class="pill pill--muted">${o} ${s} R</span>`})}</div>`:x.nothing} ${r?.summary?x.html`<p class="summary">${r.summary}</p>`:x.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return x.nothing;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],s=de,o={};for(let i of r)o[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=s.indexOf(u(i.sign??""));if(l<0)continue;let c=r[l%4],p=t[l%3],g=C[u(i.name)]??u(i.name).slice(0,2);o[c]?.[p]?.push(g)}return x.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>x.html`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,p)=>c+(o[i]?.[p]?.length??0),0);return x.html`<tr><th scope="row">${i}</th>${t.map(c=>x.html`<td>${(o[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>x.html`<td class="em-total">${r.reduce((l,c)=>l+(o[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?x.nothing:x.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let s=r.interpretation,o=C[u(r.name)]??"",i=L(r.degree??0,1);return x.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${o} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${le()}</span></summary><div class="interp-body">${s.summary?x.html`<p class="interp-summary">${s.summary}</p>`:x.nothing} ${s.detailed?x.html`<p class="interp-detail">${s.detailed}</p>`:x.nothing} ${s.keywords?.length?x.html`<div class="interp-keywords">${s.keywords.map(l=>x.html`<span class="kw">${l}</span>`)}</div>`:x.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let s of e){if(typeof s.longitude!="number")continue;let o=u(s.name);o&&t.set(o,s.longitude)}return r.map(s=>{let o=t.get(u(s.planet1)),i=t.get(u(s.planet2));if(o===void 0||i===void 0)return x.nothing;let l=K(S,S,ia-18,this.toAngle(o)),c=K(S,S,ia-18,this.toAngle(i)),p=aa(s),g=wr[p]??"aspect-other",h=L(s.orb,1);return x.svg`<line class=${`aspect ${g}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p||""} ${s.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}};Fe.styles=[y,tr,we,x.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{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-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([(0,Vr.property)({type:String,attribute:"house-system",reflect:!0})],Fe.prototype,"houseSystem",2),d([(0,Vr.property)({type:String})],Fe.prototype,"heading",2),d([(0,Vr.state)()],Fe.prototype,"view",2),Fe=d([(0,Vr.customElement)("roxy-natal-chart")],Fe);var R=require("lit"),qa=require("lit/decorators.js");var cr=class extends m{constructor(){super(...arguments);this.type="life-path"}renderData(e){let r=Ko[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalDay"in e?this.renderPeriod(r,e.personalDay,e.theme,e.guidance):"personalMonth"in e?this.renderPeriod(r,e.personalMonth,e.theme,e.focus):"personalYear"in e?this.renderPersonalYear(e,r):"dailyMessage"in e?this.renderPeriod(r,e.number,e.meaning?.title,e.dailyMessage):this.renderNumberCard(e,r)}renderPeriod(e,r,t,s){return R.html`<article class="card" aria-label="${e}"><div class="hero">${typeof r=="number"?R.html`<div class="numeral">${r}</div>`:R.nothing}<div><p class="label">${e}</p>${t?R.html`<h2 class="title">${t}</h2>`:R.nothing}</div></div>${s?R.html`<p class="meaning">${s}</p>`:R.nothing}</article>`}renderEmpty(){return R.html`<div class="roxy-empty" role="status">No numerology data</div>`}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?R.html`<div class="numeral">${e.number}</div>`:R.nothing}<div><p class="label">${r}</p>${e.meaning?.title?R.html`<h2 class="title">${e.meaning.title}</h2>`:R.nothing}</div></div>${e.meaning?.description?R.html`<p class="meaning">${e.meaning.description}</p>`:R.nothing} ${e.calculation?R.html`<pre class="calc">${e.calculation}</pre>`:R.nothing} ${t.length>0?R.html`<div class="chips">${t.map(s=>R.html`<span>${s}</span>`)}</div>`:R.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?R.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Fo(e.karmicDebtMeaning)}</div>`:R.nothing}</article>`}renderPersonalYear(e,r){return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?R.html`<div class="numeral">${e.personalYear}</div>`:R.nothing}<div><p class="label">${r}</p>${e.theme?R.html`<h2 class="title">${e.theme}</h2>`:R.nothing}</div></div>${e.forecast?R.html`<p class="meaning">${e.forecast}</p>`:R.nothing} ${e.advice?R.html`<p>${e.advice}</p>`:R.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,s])=>s!=null);return R.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?R.html`<h2 class="title">${e.profile.name}</h2>`:R.nothing}</div>${t.length>0?R.html`<div class="cores">${t.map(([s,o])=>R.html`<div class="item"><span>${W(s)}</span> <strong>${o.number??""}</strong></div>`)}</div>`:R.nothing}</article>`}};cr.styles=[y,R.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([(0,qa.property)({type:String,reflect:!0})],cr.prototype,"type",2),cr=d([(0,qa.customElement)("roxy-numerology-card")],cr);var Ko={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","birth-day":"Birth Day",maturity:"Maturity",daily:"Daily Number","personal-day":"Personal Day","personal-month":"Personal Month","personal-year":"Personal Year",chart:"Numerology chart"};function Fo(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var q=require("lit"),Ua=require("lit/decorators.js");var pr=class extends m{constructor(){super(...arguments);this.detail="detailed"}renderEmpty(){return q.html`<div class="roxy-empty" role="status">No panchang data</div>`}renderData(e){let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let s=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(g=>!!g[1]):[],o=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],p=r&&"transitions"in r?r.transitions:void 0;return q.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?Pe(r.date):""}</span></header><table><tbody>${t.map(([g,h])=>q.html`<tr><th>${g}</th><td>${h}</td></tr>`)} ${r?.sunrise?q.html`<tr><th>Sunrise</th><td>${_e(r.sunrise)}</td></tr>`:q.nothing} ${r?.sunset?q.html`<tr><th>Sunset</th><td>${_e(r.sunset)}</td></tr>`:q.nothing} ${r?.moonrise?q.html`<tr><th>Moonrise</th><td>${_e(r.moonrise)}</td></tr>`:q.nothing} ${r?.moonset?q.html`<tr><th>Moonset</th><td>${_e(r.moonset)}</td></tr>`:q.nothing} ${s.map(([g,h])=>q.html`<tr><th>${g}</th><td>${h}</td></tr>`)}</tbody></table>${p?q.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",p.tithi)} ${this.renderTransitionRow("Nakshatra",p.nakshatra)} ${this.renderTransitionRow("Yoga",p.yoga)} ${this.renderTransitionRow("Karana",p.karana)}</tbody></table>`:q.nothing} ${this.detail==="detailed"&&(o.some(g=>!!g[1])||i.length>0||l.some(g=>!!g[1])||c.length>0)?q.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...o.filter(g=>!!g[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(g=>!!g[1]),...c])}</tbody></table>`:q.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let s=ot(t);return s?q.html`<tr><th>${r}</th><td>${s}</td></tr>`:q.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,s)=>[r.length>1?`${e} ${s+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return q.nothing;let t=_e(r.endsAt),s=r.next?` \u2192 ${r.next}`:"";return q.html`<tr><th>${e}</th><td>ends ${t}${s}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=ot(e);return r?`${e.current} (${r})`:e.current}};pr.styles=[y,q.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([(0,Ua.property)({type:String,reflect:!0})],pr.prototype,"detail",2),pr=d([(0,Ua.customElement)("roxy-panchang-table")],pr);var $=require("lit"),Wa=require("lit/decorators.js");var mr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return $.html`<div class="roxy-empty" role="status">No positions data</div>`}renderData(e){let r=this.toViewModel(e),t=r.cols,s=r.rows.filter(o=>o.interpretation);return $.html`<div class="wrap"><header><h2 class="title">${this.heading||r.title}</h2>${r.badges.length?$.html`<div class="badges">${r.badges.map(o=>$.html`<span class="badge"><b>${o.label}</b> ${o.value}</span>`)}</div>`:$.nothing}</header>${r.summary?$.html`<p class="summary">${r.summary}</p>`:$.nothing}<div class="scroll"><table><caption>${r.title}</caption><thead><tr><th scope="col">Body</th><th scope="col">Position</th>${t.natal?$.html`<th scope="col">Natal</th>`:$.nothing} ${t.house?$.html`<th scope="col" class="num">House</th>`:$.nothing} ${t.motion?$.html`<th scope="col">Motion</th>`:$.nothing} ${t.formula?$.html`<th scope="col">Formula</th>`:$.nothing}</tr></thead><tbody>${r.rows.map(o=>this.renderRow(o,t))}</tbody></table></div>${s.length?$.html`<section class="readings"><h3>Readings</h3>${s.map((o,i)=>this.renderReading(o,i===0))}</section>`:$.nothing}</div>`}renderRow(e,r){let t=C[u(e.label)];return $.html`<tr class="${e.isAngle?"angle":""}"><td class="body-cell">${t?$.html`<span class="glyph">${t}</span>`:$.nothing}${e.label}</td><td>${this.signCell(e.sign,e.degree)}</td>${r.natal?$.html`<td>${e.natalLongitude!=null?this.signFromLongitude(e.natalLongitude):$.html`—`}</td>`:$.nothing} ${r.house?$.html`<td class="num">${e.house!=null?e.house:$.html`—`}</td>`:$.nothing} ${r.motion?$.html`<td>${e.speed!=null?$.html`${L(e.speed,3)}°/day${e.isRetrograde?$.html`<span class="retro">℞</span>`:$.nothing}`:$.html`—`}</td>`:$.nothing} ${r.formula?$.html`<td class="formula">${e.formula??$.html`—`}</td>`:$.nothing}</tr>`}signCell(e,r){let t=ae[u(e)];return $.html`<span class="sign">${t?$.html`<span class="sg">${t}</span>`:$.nothing}${ua(r)} ${e}</span>`}signFromLongitude(e){let r=Ge(e);return this.signCell(r.sign,r.degree+r.minute/60)}renderReading(e,r){let t=C[u(e.label)]??"";return $.html`<details class="interp-card" name="positions-readings" ?open="${r}"><summary><span>${t?$.html`${t}`:$.nothing}${e.label}</span> <span class="interp-aside"><small>${e.sign} ${ua(e.degree)}</small> ${le()}</span></summary><div class="interp-body">${e.interpretation}</div></details>`}toViewModel(e){if("asteroids"in e)return{title:"Asteroids",badges:e.houseSystem?[{label:"Houses",value:e.houseSystem}]:[],summary:e.summary,cols:{house:!0,motion:!0,formula:!1,natal:!1},rows:e.asteroids.map(t=>({label:t.name,sign:t.sign,degree:t.degree,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde,interpretation:t.interpretation}))};if("lilith"in e)return{title:"Black Moon Lilith",badges:e.houseSystem?[{label:"Houses",value:e.houseSystem}]:[],summary:e.summary,cols:{house:!0,motion:!0,formula:!1,natal:!1},rows:e.lilith.map(t=>({label:`${u(t.variant)} apogee`,sign:t.sign,degree:t.degree,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde,interpretation:t.interpretation}))};if("directed"in e)return{title:"Solar arc directions",badges:[{label:"Arc",value:`${L(e.solarArc,2)}\xB0`},{label:"Directed to",value:e.targetDate}],summary:e.summary,cols:{house:!1,motion:!1,formula:!1,natal:!0},rows:e.directed.map(t=>({label:t.name,sign:t.sign,degree:t.degree,natalLongitude:t.natalLongitude,interpretation:t.interpretation}))};if("lots"in e)return{title:"Arabic lots",badges:e.sect?[{label:"Sect",value:u(e.sect)}]:[],summary:e.summary,cols:{house:!1,motion:!1,formula:!0,natal:!1},rows:e.lots.map(t=>({label:t.name,sign:t.sign,degree:t.degree,formula:t.formula,interpretation:t.interpretation}))};let r=[];return e.ascendant&&r.push({label:"Ascendant",sign:e.ascendant.sign,degree:e.ascendant.degree,isAngle:!0}),e.midheaven&&r.push({label:"Midheaven",sign:e.midheaven.sign,degree:e.midheaven.degree,isAngle:!0}),{title:"Secondary progressions",badges:[{label:"Progressed to",value:e.targetDate},{label:"Elapsed",value:`${L(e.elapsedYears,1)} yrs`}],summary:e.summary,cols:{house:!0,motion:!0,formula:!1,natal:!1},rows:[...r,...e.planets.map(t=>({label:t.name,sign:t.sign,degree:t.degree,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde,interpretation:t.interpretation}))]}}};mr.styles=[y,we,$.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}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}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.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}.scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}caption{text-align:left;color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);padding-bottom:var(--roxy-space-xs,.25rem)}th,td{text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap;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}.body-cell{color:var(--roxy-fg,#0a0a0a);font-weight:500}.body-cell .glyph{color:var(--roxy-accent-ink,#b45309);margin-right:.35rem}tr.angle td{color:var(--roxy-secondary,#475569)}.sign{align-items:baseline;gap:.3rem;display:inline-flex}.sign .sg{color:var(--roxy-secondary,#475569)}.retro{color:var(--roxy-danger,#dc2626);font-weight:600}.formula{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;white-space:normal}.readings h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.5rem;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,Wa.property)({type:String})],mr.prototype,"heading",2),mr=d([(0,Wa.customElement)("roxy-positions-table")],mr);var pe=require("lit"),vs=require("lit/decorators.js");var qr=class extends m{renderEmpty(){return pe.html`<div class="roxy-empty" role="status">No profection data</div>`}renderData(a){let e=ae[u(a.profectedSign??"")],r=C[u(a.lordOfYear??"")],t=ae[u(a.lordNatalPosition?.sign??"")];return pe.html`<div class="wrap"><header><h2 class="title">Annual profection</h2>${a.targetDate?pe.html`<span class="badge"><b>For</b> ${a.targetDate}</span>`:pe.nothing}</header><div class="focus"><div class="age"><span class="n">${a.age}</span> <span class="l">Age</span></div><span class="arrow">activates</span><div class="house"><span class="h">House ${a.profectedHouse}</span> <span class="sign">${e?pe.html`<span class="sg">${e}</span>`:pe.nothing}${a.profectedSign}</span></div></div><div class="lord"><span class="label">Lord of the year</span> <span class="value">${r?pe.html`${r}`:pe.nothing}${a.lordOfYear}</span> ${a.lordNatalPosition?pe.html`<span class="sub">natal ${t?pe.html`<span>${t}</span>`:pe.nothing}${a.lordNatalPosition.sign} · house ${a.lordNatalPosition.house}</span>`:pe.nothing}</div>${a.interpretation?pe.html`<p class="interp">${a.interpretation}</p>`:pe.nothing}</div>`}};qr.styles=[y,pe.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}header{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-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}.focus{align-items:center;gap:var(--roxy-space-md,1rem);padding:var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 9%, transparent);flex-wrap:wrap;display:flex}.age{justify-items:center;min-width:4.5rem;display:grid}.age .n{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:2rem;font-weight:700;line-height:1}.age .l{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.arrow{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.house{gap:2px;display:grid}.house .h{font-size:var(--roxy-text-lg,1.125rem);color:var(--roxy-fg,#0a0a0a);font-weight:600}.house .sign{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.house .sign .sg{margin-right:.3rem}.lord{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4rem .75rem;display:flex}.lord .label{color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-size:var(--roxy-text-xs,.75rem)}.lord .value{color:var(--roxy-fg,#0a0a0a);font-weight:600}.lord .sub{color:var(--roxy-muted,#71717a)}.interp{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5);margin:0}`],qr=d([(0,vs.customElement)("roxy-profection-card")],qr);var xe=require("lit"),$s=require("lit/decorators.js");var ws=["name","english","title"],Zo=new Set(["description","meaning","characteristics","tagline","definedMeaning","undefinedMeaning","motto"]),Yo=new Set(["id","symbol",...ws]);function Vo(n){return Object.values(n).filter(a=>typeof a=="string"||typeof a=="number").map(String).join(" \xB7 ")}var Ur=class extends m{renderData(a){let e=a,r=this.deriveTitle(e),t=typeof e.symbol=="string"?e.symbol:void 0,s=Array.isArray(e.keywords)?e.keywords.map(String):[],o=[],i=[],l=[],c=(p,g,h)=>{if(g!=null){if(Array.isArray(g)){let k=g.filter(f=>f!=null).map(f=>typeof f=="object"?Vo(f):String(f)).filter(f=>f.length>0);k.length>0&&i.push([p,k])}else if(typeof g=="string")Zo.has(p)||g.length>48?o.push([p,g]):l.push([p,g]);else if(typeof g=="number"||typeof g=="boolean")l.push([p,String(g)]);else if(typeof g=="object"&&h<2)for(let[k,f]of Object.entries(g))c(`${p} ${k}`,f,h+1)}};for(let[p,g]of Object.entries(e))Yo.has(p)||p==="keywords"&&Array.isArray(g)||c(p,g,0);return xe.html`<article class="card" aria-label="${r}"><header class="head">${t?xe.html`<span class="symbol" aria-hidden="true">${t}</span>`:xe.nothing}<div><p class="label">Reference</p><h2 class="name">${r}</h2></div></header>${s.length>0?xe.html`<div class="chips">${s.map(p=>xe.html`<span>${p}</span>`)}</div>`:xe.nothing} ${o.map(([p,g])=>xe.html`<p class="prose"><span class="prose-label">${W(p)}</span>${g}</p>`)} ${l.length>0?xe.html`<div class="facts-wrap"><dl class="facts">${l.map(([p,g])=>xe.html`<div class="fact"><dt>${W(p)}</dt><dd>${g}</dd></div>`)}</dl></div>`:xe.nothing} ${i.map(([p,g])=>xe.html`<div class="list"><h3>${W(p)}</h3><div class="chips">${g.map(h=>xe.html`<span>${h}</span>`)}</div></div>`)}</article>`}renderEmpty(){return xe.html`<div class="roxy-empty" role="status">No reference data</div>`}deriveTitle(a){for(let t of ws)if(typeof a[t]=="string")return a[t];let e=typeof a.type=="string"?W(a.type):"",r=a.number;return r!=null?`${e} ${r}`.trim():"Reference"}};Ur.styles=[y,xe.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.symbol{color:var(--roxy-accent-ink,#b45309);flex:none;font-size:2.5rem;line-height:1}.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);margin:0}.prose{margin:0;line-height:1.6}.prose .prose-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px;display:block}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list h3,.facts-wrap 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}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));margin:0;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize}.fact dd{font-size:var(--roxy-text-sm,.875rem);margin:0}`],Ur=d([(0,$s.customElement)("roxy-reference-card")],Ur);var me=require("lit"),Ss=require("lit/decorators.js");var ks=n=>C[u(n)]??C[n]??"",Wr=class extends m{renderEmpty(){return me.html`<div class="roxy-empty" role="status">No relocation data</div>`}renderData(a){let e=a.changes;return me.html`<div class="stack"><roxy-natal-chart heading="Relocation chart" .data="${a}"></roxy-natal-chart><section class="changes"><h3 class="title">What changes at this location</h3><div class="move">${typeof e?.distanceKm=="number"?me.html`<span>${Math.round(e.distanceKm).toLocaleString()} km ${e.direction??""} of birthplace</span>`:me.nothing} ${e?me.html`<span>Ascendant ${e.ascendantSignChanged?"changes sign":"keeps its sign"}</span>`:me.nothing}</div>${a.interpretation?.summary?me.html`<p class="summary">${a.interpretation.summary}</p>`:me.nothing} ${e?.angularPlanets?.length?me.html`<div><p class="block-label">Angular planets here</p><div class="chips">${e.angularPlanets.map(r=>me.html`<span class="chip">${ks(r)} ${r}</span>`)}</div></div>`:me.nothing}<div><p class="block-label">Planets that change house</p>${e?.planetsChangedHouse?.length?me.html`<ul class="moves-list">${e.planetsChangedHouse.map(r=>me.html`<li>${ks(r.planet)} ${r.planet}: house ${r.natalHouse} <span class="arrow">to</span> ${r.relocatedHouse}</li>`)}</ul>`:me.html`<p class="empty-note">No planet changes house at this location.</p>`}</div></section></div>`}};Wr.styles=[y,me.css`.stack{gap:var(--roxy-space-md,1rem);display:grid}.changes{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);color:var(--roxy-primary,#0f172a);margin:0}.move{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.summary{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.block-label{font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;color:var(--roxy-muted,#71717a);margin:0 0 var(--roxy-space-xs,.25rem);font-weight:600}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chip{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:2px 10px}.moves-list{gap:2px;margin:0;padding:0;list-style:none;display:grid}.moves-list li{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.moves-list .arrow{color:var(--roxy-muted,#71717a)}.empty-note{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}`],Wr=d([(0,Ss.customElement)("roxy-relocation-wheel")],Wr);var Ee=require("lit"),Rs=require("lit/decorators.js");var xt=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],Jr=class extends m{renderEmpty(){return Ee.html`<div class="roxy-empty" role="status">No shadbala data</div>`}renderData(a){if(!a.planets?.length)return this.renderEmpty();let e=[...a.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return Ee.html`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${xt.map(r=>Ee.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(a){let e=C[u(a.planet)]??"",r=xt.map(c=>Math.max(0,a[c.key])),t=r.reduce((c,p)=>c+p,0),s=typeof a.strengthRatio=="number"&&a.strengthRatio>=1,o=s?"adequacy-badge--adequate":"adequacy-badge--weak",i=s?"adequate":"weak",l=L(a.totalRupas,2)&&L(a.minRequired,2)?`${L(a.totalRupas,2)} / ${L(a.minRequired,2)} R`:"";return Ee.html`<div class="planet-row" role="listitem" aria-label="${a.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${e}</span> ${a.planet} <span class="rank-badge" aria-label="rank ${a.relativeRank}">#${a.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${a.planet}">${t>0?xt.map((c,p)=>{let g=r[p];if(g<=0)return Ee.nothing;let h=g/t*100;return Ee.html`<div class="bar-segment" style="flex-grow:${h};background:${c.color}" title="${c.label}: ${L(g,1)}"></div>`}):Ee.nothing}</div></div><div class="pills">${l?Ee.html`<span class="rupas-label">${l}</span>`:Ee.nothing} <span class="${`adequacy-badge ${o}`}">${i}</span></div></div>`}};Jr.styles=[y,Ee.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],Jr=d([(0,Rs.customElement)("roxy-shadbala-table")],Jr);var w=require("lit"),Cs=require("lit/decorators.js");var ft=360,U=ft/2,ht=170,qo=154,Lt=124,la=96,Xr=class extends m{renderEmpty(){return w.html`<div class="roxy-empty" role="status">No synastry data</div>`}renderData(a){let{person1:e,person2:r,compatibilityScore:t,analysis:s}=a,o=a.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,p=s?.overall,g=s?.strengths??[],h=s?.challenges??[];return i.length>0&&l.length>0?w.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?w.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:w.nothing}</div><svg viewBox="0 0 ${ft} ${ft}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${U}" cy="${U}" r="${ht}" stroke-width="1.5"/><circle class="wheel-line" cx="${U}" cy="${U}" r="${la+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${U}" cy="${U}" r="${la-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,o)} ${this.renderRing(i,Lt,"p1",1)} ${this.renderRing(l,la,"p2",2)} ${this.renderAscendants(a)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${p?w.html`<p class="summary">${p}</p>`:w.nothing} ${o.length>0?this.renderAspects(o):w.nothing} ${g.length>0||h.length>0?w.html`<div class="lists">${g.length?w.html`<div><h3>Strengths</h3><ul>${g.map(f=>w.html`<li>${f}</li>`)}</ul></div>`:w.nothing} ${h.length?w.html`<div><h3>Challenges</h3><ul>${h.map(f=>w.html`<li>${f}</li>`)}</ul></div>`:w.nothing}</div>`:w.nothing}</div>`:w.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?w.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:w.nothing}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code><roxy-data></code> fallback.</div>${p?w.html`<p class="summary">${p}</p>`:w.nothing} ${o.length>0?this.renderAspects(o):w.nothing} ${g.length>0||h.length>0?w.html`<div class="lists">${g.length?w.html`<div><h3>Strengths</h3><ul>${g.map(f=>w.html`<li>${f}</li>`)}</ul></div>`:w.nothing} ${h.length?w.html`<div><h3>Challenges</h3><ul>${h.map(f=>w.html`<li>${f}</li>`)}</ul></div>`:w.nothing}</div>`:w.nothing}</div>`}toAngle(a){return 180-a}renderSpokes(){return Array.from({length:12},(a,e)=>{let r=this.toAngle(e*30),t=K(U,U,la-14,r),s=K(U,U,ht,r);return w.svg`<line class="wheel-line" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return de.map((a,e)=>{let r=this.toAngle(e*30+15),t=K(U,U,qo,r);return w.svg`<text class="sign" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${ae[a]}</text>`})}renderRing(a,e,r,t){return a.map(s=>{if(!Number.isFinite(s.longitude))return w.nothing;let o=this.toAngle(s.longitude),i=K(U,U,e,o),c=K(U,U,e+(t===1?-12:-10),o),p=C[u(s.name)]??s.name.slice(0,2),g=Ge(s.longitude),h=s.isRetrograde===!0,k=`${g.degree}\xB0${String(g.minute).padStart(2,"0")}'`,f=`${s.name}${h?" retrograde":""} - ${k} ${g.sign}`;return w.svg`<g>
|
|
98
|
+
<text class=${r} x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central"><title>${f}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${t}</tspan></text>
|
|
99
|
+
<text class="planet-deg" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${g.degree}°${h?w.svg`<tspan class="retro"> ℞</tspan>`:w.nothing}</text>
|
|
100
|
+
</g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=de.findIndex(h=>h.toLowerCase()===t.sign.toLowerCase());if(o===-1)return;let i=o*30+t.degree,l=this.toAngle(i),c=s===1?Lt+14:la+14,p=K(U,U,c,l),g=K(U,U,ht+14,l);e.push(w.svg`<g>
|
|
101
|
+
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${g.x} y2=${g.y} />
|
|
102
|
+
<text class="asc-label" x=${g.x} y=${g.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
|
|
103
|
+
</g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=u(o);for(let l of s)if(u(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return w.nothing;let l=K(U,U,Lt-12,this.toAngle(o)),c=K(U,U,la+8,this.toAngle(i)),p=aa(s),g=wr[p]??"aspect-other",h=L(s.orb,1);return w.svg`<line class=${`aspect ${g}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p} ${s.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}renderAspects(a){return w.html`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(e=>w.html`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${aa(e)||""}</td><td class="orb">${L(e.orb,1)}</td><td>${Uo(e.strength)}</td></tr>`)}</tbody></table>`}};Xr.styles=[y,w.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],Xr=d([(0,Cs.customElement)("roxy-synastry-chart")],Xr);function Uo(n){return typeof n=="number"?Math.round(n).toString():""}var G=require("lit"),Ja=require("lit/decorators.js");var gr=class extends m{constructor(){super(...arguments);this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}renderEmpty(){return G.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderData(e){return"card"in e?this.renderDailyCard(e):this.renderFullCard(e)}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,s=r.keywords??[];return G.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?G.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:G.html`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?G.html`${r.arcana} arcana`:G.nothing} ${t?G.html`· reversed`:G.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?G.html`<p class="message">${e.dailyMessage}</p>`:G.nothing} ${r.meaning?G.html`<p>${r.meaning}</p>`:G.nothing} ${s.length>0?G.html`<div class="chips">${s.map(o=>G.html`<span>${o}</span>`)}</div>`:G.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,s=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return G.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?G.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:G.html`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?G.html`${e.arcana} arcana`:G.nothing} ${e.number!==void 0&&e.number!==null?G.html`· ${e.number}`:G.nothing} ${r?G.html`· reversed`:G.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?G.html`<p>${t.description}</p>`:G.nothing} ${s.length>0?G.html`<div class="chips">${s.map(o=>G.html`<span>${o}</span>`)}</div>`:G.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};gr.styles=[y,G.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([(0,Ja.state)()],gr.prototype,"flipped",2),gr=d([(0,Ja.customElement)("roxy-tarot-card")],gr);var ur=require("lit"),Xa=require("lit/decorators.js");var yr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return ur.html`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let r=e.cards??[];if(r.length===0)return this.renderEmpty();let t=this.heading||"Tarot deck",s=typeof e.total=="number"?e.total:r.length;return ur.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"card":"cards"}</span></header><ul class="grid">${r.map(o=>ur.html`<li class="tile">${o.imageUrl?ur.html`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:ur.html`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${Wo(o)}</p></li>`)}</ul></section>`}};yr.styles=[y,ur.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(7rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.art{aspect-ratio:2/3;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meta{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0}`],d([(0,Xa.property)({type:String,reflect:!0})],yr.prototype,"heading",2),yr=d([(0,Xa.customElement)("roxy-tarot-catalog")],yr);function Wo(n){return n.suit?`${u(n.arcana)} \xB7 ${u(n.suit)}`:`${u(n.arcana)} Arcana`}var N=require("lit"),Qa=require("lit/decorators.js");var xr=class extends m{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return N.html`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let r="answer"in e,t="cards"in e&&!("spread"in e),s=t?[]:"positions"in e?e.positions??[]:[],o=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),p="question"in e?e.question:void 0,g="summary"in e?e.summary:void 0,h=r?e.interpretation:void 0,k=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return N.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?N.html`<span class="question">"${p}"</span>`:N.nothing}</header>${r?N.html`<div><span class="${`answer ${k}`}">${i}</span> ${l?N.html`<small>· ${l}</small>`:N.nothing}</div>`:N.nothing} ${s.length>0?N.html`<div class="grid">${s.map(f=>N.html`<div class="card"><p class="label">${f.name??""}</p><div class="image">${f.card?.imageUrl?N.html`<img src="${f.card.imageUrl}" alt="${f.card.name??"tarot card"}" class="${f.card.reversed?"reversed":""}">`:N.html`${f.card?.name??"?"}`}</div><p class="name">${f.card?.name??""} ${f.card?.reversed?N.html`<small>(reversed)</small>`:N.nothing}</p>${f.interpretation?N.html`<p class="interp">${f.interpretation}</p>`:N.nothing}</div>`)}</div>`:N.nothing} ${o.length>0?N.html`<div class="grid">${o.map(f=>N.html`<div class="card"><div class="image">${f.imageUrl?N.html`<img src="${f.imageUrl}" alt="${f.name??"tarot card"}" class="${f.reversed?"reversed":""}">`:N.html`${f.name??"?"}`}</div><p class="name">${f.name??""} ${f.reversed?N.html`<small>(reversed)</small>`:N.nothing}</p>${f.meaning?N.html`<p class="interp">${f.meaning}</p>`:N.nothing}</div>`)}</div>`:N.nothing} ${g?N.html`<p class="reading">${g}</p>`:N.nothing} ${h?N.html`<p class="reading">${h}</p>`:N.nothing}</article>`}};xr.styles=[y,N.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([(0,Qa.property)({type:String,reflect:!0})],xr.prototype,"spread",2),xr=d([(0,Qa.customElement)("roxy-tarot-spread")],xr);var j=require("lit"),et=require("lit/decorators.js");var hr=class extends m{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return j.html`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:r,transitTime:t,transitPlanets:s,transitAspects:o,summary:i}=e,l=[Pe(r),_e(t)].filter(Boolean).join(" "),c=o?.length??0,p=this.tab;return j.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?j.html`<p class="subtitle">${l}</p>`:j.nothing}</div>${c>0?j.html`${oa({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:p,onSelect:g=>{this.tab=g},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?j.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:j.html`${i?this.renderSummaryPills(i):j.nothing}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:j.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return j.html`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return j.html`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=C[u(r.name)]??"",s=ae[u(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return j.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?j.html`<span class="retro-badge" aria-label="retrograde">R</span>`:j.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${L(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${L(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return j.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=C[u(r.transitPlanet)]??"",o=C[u(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return j.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${s}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${o}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${L(r.orb,2)}° · strength ${L(r.strength,1)} </span>${le()}</summary><div class="interp-body">${l?.summary?j.html`<p>${l.summary}</p>`:j.nothing} ${l?.impact?j.html`<p><strong>Impact:</strong> ${l.impact}</p>`:j.nothing} ${l?.timing?j.html`<p><strong>Timing:</strong> ${l.timing}</p>`:j.nothing} ${l?.guidance?j.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:j.nothing} ${l?.keywords?.length?j.html`<div class="interp-keywords">${l.keywords.map(g=>j.html`<span class="kw">${g}</span>`)}</div>`:j.nothing}</div></details>`})}</div>`}};hr.styles=[y,tr,we,j.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([(0,et.state)()],hr.prototype,"tab",2),hr=d([(0,et.customElement)("roxy-transits-table")],hr);var ge=require("lit"),Ms=require("lit/decorators.js");var Qr=class extends m{renderEmpty(){return ge.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[];if(e.length===0&&r.length===0)return this.renderEmpty();let t=a.datetime?String(a.datetime).replace("T"," "):"";return ge.html`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${t?ge.html`<p class="subtitle">${t}</p>`:ge.nothing}</div>${r.length>0?ge.html`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(s=>ge.html`<span class="mutual-pill">${s.planet1} ⟷ ${s.planet2} ${s.aspectType?ge.html`<span class="rel">${s.aspectType}</span>`:ge.nothing}</span>`)}</div></div>`:ge.nothing} ${e.length>0?ge.html`<div class="overflow-scroll"><table><thead><tr><th scope="col">From</th><th scope="col">Aspect</th><th scope="col">To</th><th scope="col">Strength</th><th scope="col">Orb</th></tr></thead><tbody>${e.map(s=>ge.html`<tr><td>${s.aspectingPlanet}</td><td><span class="kind">${s.aspectType}</span></td><td>${s.aspectedPlanet}</td><td>${typeof s.strength=="number"?ge.html`<span class="bar" style="width:${Math.max(4,Math.min(100,s.strength)*.4)}px"></span><span class="num">${L(s.strength,0)}</span>`:ge.nothing}</td><td class="num">${typeof s.orb=="number"?`${L(s.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:ge.nothing}</div>`}};Qr.styles=[y,ge.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.mutual{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.mutual-pill{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:.35rem;padding:2px 10px;display:inline-flex}.mutual-pill .rel{font-size:var(--roxy-text-xs,.75rem);font-weight:400}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}tbody tr:last-child td{border-bottom:none}.kind{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);font-size:var(--roxy-text-xs,.75rem);padding:1px 8px;font-weight:600;display:inline-block}.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.bar{background:var(--roxy-accent,#f59e0b);vertical-align:middle;border-radius:3px;height:6px;margin-right:6px;display:inline-block}`],Qr=d([(0,Ms.customElement)("roxy-vedic-aspects")],Qr);var bt=require("lit"),da=require("lit/decorators.js");var Ze=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e}}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?Oa(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return bt.html`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let t=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return bt.html`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${Ba(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>${ja(r,this.chartStyle)}</svg></div>`}};Ze.styles=[y,Ia,tr],d([(0,da.property)({type:String,reflect:!0,attribute:"chart-style"})],Ze.prototype,"chartStyle",2),d([(0,da.property)({type:String,reflect:!0,attribute:"chart-reference"})],Ze.prototype,"chartReference",2),d([(0,da.property)({type:String,reflect:!0,attribute:"lagna-override"})],Ze.prototype,"lagnaOverride",2),Ze=d([(0,da.customElement)("roxy-vedic-kundli")],Ze);var z=require("lit"),zs=require("lit/decorators.js");var Jo=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],ea=class extends m{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of Jo){let s=a[t];s&&(r.push([t,s]),e.add(t))}for(let[t,s]of Object.entries(a))e.has(t)||r.push([t,s]);return r}renderEmpty(){return z.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return z.html`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let s=(t.graha??r)==="Lagna",o=C[u(t.graha??r)]??"",i=ae[u(t.rashi??"")]??"";return z.html`<tr class="${s?"lagna":""}"><td class="graha">${o?z.html`<span class="glyph">${o}</span>`:z.nothing}${t.graha??r}</td><td>${i?z.html`<span class="glyph">${i}</span>`:z.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Ga(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?z.html`<span class="retro">R</span>`:z.nothing}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let a=this.data?.combustion??[];return a.length===0?z.nothing:z.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${le()}</summary><div class="panel-body">${a.map(e=>{let r=C[u(e.planet)]??"",t=L(e.distanceFromSun,2),s=L(e.orb,1);return z.html`<div class="condition"><span class="planet">${r?`${r} `:""}${e.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let a=this.data?.planetaryWar??[];return a.length===0?z.nothing:z.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${le()}</summary><div class="panel-body">${a.map(e=>{let r=L(e.distance,2);return z.html`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let a=this.data?.interpretations??{},e=this.orderedRows().map(([r,t])=>[t.graha??r,a[t.graha??r]]).filter(([,r])=>r!=null);return e.length===0?z.nothing:z.html`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${le()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=C[u(r)]??"";return z.html`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?z.html`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:z.nothing} ${t.nakshatra?z.html`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:z.nothing}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?z.nothing:z.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${le()}</summary><div class="panel-body">${a.map(e=>z.html`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?z.html`<p class="desc">${e.description}</p>`:z.nothing}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?z.nothing:z.html`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${le()}</summary><div class="panel-body">${a.map(e=>z.html`<div class="bhava"><span class="name">${e.name} ${e.quality?z.html`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:z.nothing}</span> ${e.result?z.html`<p class="desc">${e.result}</p>`:z.nothing}</div>`)}</div></details>`}};ea.styles=[y,we,z.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],ea=d([(0,zs.customElement)("roxy-vedic-planets-table")],ea);var $e=require("lit"),Ts=require("lit/decorators.js");var ra=class extends m{rows(){let a=this.data;if(!a)return[];let e=(a.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,t]of[["Ascendant",a.ascendant],["Midheaven",a.midheaven],["Part of Fortune",a.partOfFortune],["Vertex",a.vertex]])t&&e.push({name:r,sign:t.sign,longitude:t.longitude,isPoint:!0});return e}renderEmpty(){return $e.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return $e.html`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=C[u(r.name)]??"",s=ae[u(r.sign??"")]??"",o=typeof r.speed=="number"?L(r.speed,3):"";return $e.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?$e.html`<span class="glyph">${t}</span>`:$e.nothing}${r.name}</td><td>${s?$e.html`<span class="glyph">${s}</span>`:$e.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Ga(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?$e.html`${o}°/day`:$e.nothing} ${r.isRetrograde?$e.html`<span class="retro">℞</span>`:$e.nothing}</td></tr>`})}</tbody></table></div>`}};ra.styles=[y,$e.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],ra=d([(0,Ts.customElement)("roxy-western-planets-table")],ra);var H=require("lit"),rt=require("lit/decorators.js");var Lr=class extends m{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return H.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return H.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):H.nothing}</p>${e.description?H.html`<p class="description">${e.description}</p>`:H.nothing} ${e.result?H.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:H.nothing}</div>`}renderDetectCard(e){return H.html`<div class="detail-card ${e.present?"":"absent"}"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):H.nothing} <span class="present-badge ${e.present?"is-present":"is-absent"}">${e.present?"Present":"Not present"}</span></p>${e.description?H.html`<p class="description">${e.description}</p>`:H.nothing} ${e.present&&e.result?H.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:H.nothing} ${e.evidence?H.html`<p class="evidence">${e.evidence}</p>`:H.nothing}</div>`}renderEmpty(){return H.html`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return H.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"present"in t[0]){let c=t,p=r?c.filter(k=>k.name.toLowerCase().includes(r)):c,g=[...p.filter(k=>k.present),...p.filter(k=>!k.present)],h=e.total??c.filter(k=>k.present).length;return H.html`<div class="wrap"><div class="head"><h2 class="title">Detected yogas</h2><span class="count">${h} of ${c.length} present</span></div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter detected yogas by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Detected yogas">${g.length>0?g.map(k=>this.renderDetectCard(k)):H.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}if(t.length>0&&"description"in t[0]){let c=t,p=r?c.filter(h=>h.name.toLowerCase().includes(r)):c,g=e.total;return H.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${g!==void 0?H.html`<span class="count">${g} total</span>`:H.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(h=>this.renderDetailCard(h)):H.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let o=t,i=r?o.filter(c=>c.name.toLowerCase().includes(r)):o,l=e.total;return H.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?H.html`<span class="count">${l} total</span>`:H.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>H.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):H.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return H.html`<div class="roxy-empty" role="status">No yoga data</div>`}};Lr.styles=[y,H.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.present-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.present-badge.is-present{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.present-badge.is-absent{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);color:var(--roxy-fg,#0a0a0a)}.detail-card.absent{opacity:.72}.evidence{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([(0,rt.state)()],Lr.prototype,"filter",2),Lr=d([(0,rt.customElement)("roxy-yoga-list")],Lr);var at=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyAstrocartographyMap",tag:"roxy-astrocartography-map",slug:"astrocartography-map",heading:"Astrocartography",description:"Astrocartography world map plotting each body Midheaven, IC, Ascendant, and Descendant relocation lines",docsLabel:"Western",endpointLabel:"POST /astrology/astrocartography",docsSummary:"World map of planetary MC, IC, Ascendant, and Descendant lines with per-line interpretations",topic:"Astrology"},{pascal:"RoxyLocalSpaceCompass",tag:"roxy-local-space-compass",slug:"local-space-compass",heading:"Local space",description:"Local space compass plotting each body direction from the birthplace by azimuth and altitude",docsLabel:"Western",endpointLabel:"POST /astrology/local-space",docsSummary:"Compass dial of planetary azimuth lines from the birthplace, dimmed below the horizon",topic:"Astrology"},{pascal:"RoxyRelocationWheel",tag:"roxy-relocation-wheel",slug:"relocation-wheel",heading:"Relocation chart",description:"Relocation chart wheel recomputing houses and angles for a new place, with the planets that change house",docsLabel:"Western",endpointLabel:"POST /astrology/relocation-chart",docsSummary:"Relocated chart wheel plus the move geometry, angular planets, and planets that change house",topic:"Astrology"},{pascal:"RoxyPositionsTable",tag:"roxy-positions-table",slug:"positions-table",heading:"Positions table",description:"Editorial positions table for asteroids, Black Moon Lilith, secondary progressions, solar arc directions, and the Arabic lots",docsLabel:"Western",endpointLabel:"POST /astrology/asteroids, /astrology/lilith, /astrology/progressions, /astrology/solar-arc, /astrology/arabic-lots",docsSummary:"Body, sign, degree, and per-shape columns (house, motion, formula, or natal arc) plus each reading",topic:"Astrology"},{pascal:"RoxyFixedStars",tag:"roxy-fixed-stars",slug:"fixed-stars",heading:"Fixed stars",description:"Fixed star conjunctions to the natal chart, tightest first, with the precessed star catalog",docsLabel:"Western",endpointLabel:"POST /astrology/fixed-stars",docsSummary:"Star to natal point conjunctions with readings, plus a catalog of position, magnitude, nature, and keywords",topic:"Astrology"},{pascal:"RoxyProfectionCard",tag:"roxy-profection-card",slug:"profection-card",heading:"Annual profection",description:"Annual profection card with the profected house and sign, the lord of the year, and its natal placement",docsLabel:"Western",endpointLabel:"POST /astrology/profections",docsSummary:"Profected house and sign for the year, the lord of the year, its natal placement, and the reading",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyVedicAspects",tag:"roxy-vedic-aspects",slug:"vedic-aspects",heading:"Vedic aspects",description:"Vedic graha drishti table: which planet aspects which, with mutual aspects surfaced first",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/aspects",docsSummary:"Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",topic:"Vedic"},{pascal:"RoxyHoraTable",tag:"roxy-hora-table",slug:"hora-table",heading:"Hora",description:"Vedic Hora (planetary hours) table: 12 day and 12 night horas by ruling planet for electional timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/hora",docsSummary:"Day and night planetary hours with ruling planet and window",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, soul urge, personality, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,soul-urge,personality,birth-day,maturity,daily,personal-day,personal-month,personal-year,chart}",docsSummary:"Life path, expression, soul urge, personality, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotCatalog",tag:"roxy-tarot-catalog",slug:"tarot-catalog",heading:"Tarot deck",description:"Responsive tarot deck gallery with card art, name, and an arcana and suit caption from the tarot catalog response",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards",docsSummary:"Deck gallery tiles with card art, name, and arcana and suit",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyHdConnection",tag:"roxy-hd-connection",slug:"hd-connection",heading:"HD connection",description:"Human Design connection chart: the composite channels two people form, with circuit, dynamic, and which person holds each gate",docsLabel:"Human Design",endpointLabel:"POST /human-design/connection",docsSummary:"Electromagnetic, compromise, and dominance channels between two charts",topic:"Human Design"},{pascal:"RoxyHdPenta",tag:"roxy-hd-penta",slug:"hd-penta",heading:"HD penta",description:"Human Design penta for a 3 to 5 person group: upper and lower triangle channels, defined or open, with core channels and member coverage",docsLabel:"Human Design",endpointLabel:"POST /human-design/penta",docsSummary:"Group penta channels split into upper and lower triangles",topic:"Human Design"},{pascal:"RoxyHdVariables",tag:"roxy-hd-variables",slug:"hd-variables",heading:"HD variables",description:"Human Design variables: the four PHS arrows (determination, environment, perspective, motivation) with left/right direction and color, tone, and base",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction and PHS labels",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyForecastDigest",tag:"roxy-forecast-digest",slug:"forecast-digest",heading:"Forecast digest",description:"Rolled-up forecast across the next 24 hours, 7, 30, and 90 days with per-domain breakdown and top events",docsLabel:"Forecast",endpointLabel:"POST /forecast/digest",docsSummary:"Per-window event counts, domain breakdown, and the highest-significance events",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyCrystalCard",tag:"roxy-crystal-card",slug:"crystal-card",heading:"Crystal detail",description:"Single-crystal detail card with photo, spiritual, emotional, and physical meaning, metaphysical attributes, affirmation, and pairings",docsLabel:"Crystals",endpointLabel:"GET /crystals/{id}",docsSummary:"Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",topic:"Crystals"},{pascal:"RoxyCrystalGrid",tag:"roxy-crystal-grid",slug:"crystal-grid",heading:"Crystal grid",description:"Responsive crystal gallery with photo, name, and colour swatches from any crystals list response",docsLabel:"Crystals",endpointLabel:"GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",docsSummary:"Crystal gallery tiles with photo, name, and colour swatches",topic:"Crystals"},{pascal:"RoxyDreamCard",tag:"roxy-dream-card",slug:"dream-card",heading:"Dream symbol",description:"Dream symbol card with the symbol name, full interpretation, and dictionary letter",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols/{id}",docsSummary:"Symbol name, interpretation body, and letter chip",topic:"Dreams"},{pascal:"RoxyDreamSearch",tag:"roxy-dream-search",slug:"dream-search",heading:"Dream search",description:"Dream-symbol search results as selectable tiles; emits roxy-symbol-select to pair with roxy-dream-card",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols",docsSummary:"Matched dream symbols as selectable tiles with a letter chip",topic:"Dreams"},{pascal:"RoxyAngelNumberCard",tag:"roxy-angel-number-card",slug:"angel-number-card",heading:"Angel number",description:"Angel number card with title, core message, badges, keywords, life-area interpretations, affirmation, and action steps",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/numbers/{number}",docsSummary:"Number meaning with spiritual, love, career, money, twin flame, biblical, and shadow sections",topic:"Angel Numbers"},{pascal:"RoxyAngelNumberLookup",tag:"roxy-angel-number-lookup",slug:"angel-number-lookup",heading:"Angel number lookup",description:"Angel number sequence analysis with pattern classification, the known meaning when present, and a digit-root fallback for any number",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/lookup",docsSummary:"Pattern analysis plus known meaning and digit-root fallback",topic:"Angel Numbers"},{pascal:"RoxyReferenceCard",tag:"roxy-reference-card",slug:"reference-card",heading:"Reference card",description:"Glossary entry for any reference lookup: zodiac sign, planet meaning, rashi, I Ching trigram, Human Design gate or center, numerology number or compound number",docsLabel:"Reference",endpointLabel:"GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/rashis/{id}, /iching/trigrams/{id}, /human-design/{gates,centers}/{id}, /numerology/{meanings,compound-number}/{number}",docsSummary:"Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",topic:"Helpers"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint, from the spec",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Es="0.12.1";var Xo=at.map(n=>n.slug);
|
|
92
104
|
//# sourceMappingURL=index.cjs.map
|