@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
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
var ne=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var y=(c,s,e,t)=>{for(var n=t>1?void 0:t?oe(s,e):s,o=c.length-1,r;o>=0;o--)(r=c[o])&&(n=(t?r(s,e,n):r(n))||n);return t&&n&&ne(s,e,n),n};import{css as he,html as d,nothing as m,svg as b}from"lit";import{customElement as ye,property as xe,state as fe}from"lit/decorators.js";var k={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"};var B={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"};var T=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],we=T.map(c=>c.toLowerCase()),_={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"};import{html as L,LitElement as ce}from"lit";import{property as w,state as V}from"lit/decorators.js";import{ifDefined as de}from"lit/directives/if-defined.js";import{css as se}from"lit";var M=se`: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 ae="https://roxyapi.com/api/v2",N=class{constructor(s){this.baseUrl=ae;this.host=s,s.addController(this)}hostDisconnected(){this.abort?.abort(),this.abort=void 0}async run(s){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 t=this.submitUrl?await fetch(this.submitUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(s),signal:e.signal}):await this.callApi(s,e.signal);if(!t.ok)throw new Error(await this.readError(t));let n=await t.json();if(e.signal.aborted)return;this.host.data=n}catch(t){if(t?.name==="AbortError")return;this.host.error=t instanceof Error?t.message:String(t)}finally{this.abort===e&&(this.abort=void 0),e.signal.aborted||(this.host.loading=!1)}}callApi(s,e){let t=new URL(`${this.baseUrl}${s.path}`);for(let[o,r]of Object.entries(s.query??{}))r!=null&&t.searchParams.set(o,String(r));let n={Accept:"application/json"};return this.publishableKey&&(n["X-API-Key"]=this.publishableKey),s.body!=null&&(n["Content-Type"]="application/json"),fetch(t,{method:s.method??"GET",headers:n,body:s.body!=null?JSON.stringify(s.body):void 0,signal:e})}secretKeyRefused(){let s=this.publishableKey;return!s||s.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(s){try{let e=await s.json();if(e?.error)return e.error}catch{}return`Request failed (${s.status})`}};function J(c,s,e){let t={...e},n=`/${c.replace(/^\//,"")}`.replace(/\{([^}]+)\}/g,(a,i)=>{let p=t[i];return delete t[i],encodeURIComponent(String(p??""))}),o={},r={};for(let[a,i]of Object.entries(t))i===void 0||i===""||(s==="GET"?o[a]=i:r[a]=i);return{path:n,method:s,query:o,body:s==="POST"?r:void 0}}var ie="roxy-data";function le(c){return c.nodeName==="SCRIPT"&&c.getAttribute("type")==="application/json"}var I=class{constructor(s){this.host=s,s.addController(this)}hostConnected(){if(this.host.data!=null)return;let s=this.read();s!==void 0&&(this.host.data=s,this.host.requestUpdate())}read(){let s=this.findInlineScript();return s?this.parse(s.textContent):void 0}findInlineScript(){for(let s of Array.from(this.host.children))if(le(s)&&s.classList.contains(ie))return s;return null}parse(s){if(s?.trim())try{return JSON.parse(s)}catch{return}}};var x=class extends ce{constructor(){super();this.data=null;this.endpoint="";this.method="POST";this.remember=!1;this.loading=!1;this.error=null;this.onFormSubmit=e=>{let t=e.detail;this.remember&&this.writeRemembered(t.values),this.fetcher.run(J(this.endpoint,this.method,t.values))};new I(this),this.fetcher=new N(this)}static{this.styles=[M]}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 L`<roxy-endpoint-form data-endpoint="${this.endpoint}" method="${this.method}" spec-url="${de(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 L`<div class="roxy-empty" role="status">No data</div>`}renderLoading(){return L`<div class="roxy-skeleton" style="height:8rem" role="status" aria-label="Loading"></div>`}renderError(e){let t=L`<div class="roxy-error" role="alert">${e}</div>`;return this.endpoint?L`${t}${this.renderForm()}`:t}};y([w({attribute:!1})],x.prototype,"data",2),y([w({type:String,attribute:"data-endpoint"})],x.prototype,"endpoint",2),y([w({type:String})],x.prototype,"method",2),y([w({type:String,attribute:"publishable-key"})],x.prototype,"publishableKey",2),y([w({type:String,attribute:"base-url"})],x.prototype,"baseUrl",2),y([w({type:String,attribute:"spec-url"})],x.prototype,"specUrl",2),y([w({type:String,attribute:"submit-url"})],x.prototype,"submitUrl",2),y([w({type:Boolean})],x.prototype,"remember",2),y([V()],x.prototype,"loading",2),y([V()],x.prototype,"error",2);function v(c){let s=c%360;return s<0?s+360:s}function G(c){let s=v(c),e=Math.floor(s/30)%12,t=s%30,n=Math.floor(t),o=(t-n)*60,r=Math.floor(o),a=Math.round((o-r)*60);return{sign:T[e]??"Aries",signIndex:e,degree:n,minute:r,second:a}}function O(c){return v(c+180)}function Y(c,s){let e=v(c),t=v(s)-e;return t<0&&(t+=360),v(e+t/2)}function u(c,s,e,t){let n=t*Math.PI/180;return{x:c+e*Math.cos(n),y:s+e*Math.sin(n)}}import{css as pe,html as ue}from"lit";function W(){return ue`<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 X=pe`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 z(c,s=1){return typeof c!="number"||!Number.isFinite(c)?"":c.toFixed(s).replace(/\.?0+$/,"")}var U={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function j(c){return(c.type??"").toLowerCase().replace(/_/g,"-")}function f(c){return c?c.charAt(0).toUpperCase()+c.slice(1).toLowerCase():""}import{css as me,html as Z,nothing as ge}from"lit";var Q=me`.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 ee(c){let{items:s,active:e,onSelect:t,label:n,idPrefix:o,controls:r=!1}=c;return Z`<div class="roxy-tablist" role="tablist" aria-label="${n}" @keydown="${i=>{if(i.key!=="ArrowRight"&&i.key!=="ArrowLeft")return;i.preventDefault();let p=s.findIndex(A=>A.id===e);if(p===-1)return;let g=i.key==="ArrowRight"?1:-1,h=s[(p+g+s.length)%s.length];if(!h)return;t(h.id);let $=i.currentTarget.getRootNode();requestAnimationFrame(()=>{$.querySelector(`#${o}-tab-${h.id}`)?.focus()})}}">${s.map(i=>Z`<button type="button" class="roxy-tab" role="tab" id="${o}-tab-${i.id}" aria-selected="${e===i.id?"true":"false"}" aria-controls="${r&&e===i.id?`${o}-panel-${i.id}`:ge}" tabindex="${e===i.id?"0":"-1"}" @click="${()=>t(i.id)}">${i.label}</button>`)}</div>`}var H=420,l=H/2,R=164,D=146,C=120,P=96,be=178,ve=196,S=class extends x{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 d`<div class="roxy-empty" role="status">No chart data</div>`}renderData(e){let t=this.getPlanets(),n=e.aspects??[],o=this.view;return d`<div class="wrap"><header><h2 class="title">Natal chart</h2>${e.birthDetails?d`<div class="meta">${[e.birthDetails.date,e.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:m}</header>${ee({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:o,onSelect:r=>{this.view=r},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${o}" role="tabpanel" aria-labelledby="natal-tab-${o}">${o==="wheel"?this.renderWheel(t,n):this.renderAspectGrid(t,n)}</div><div class="legend"><span>${t.length} planets</span> <span>${n.length} aspects</span> ${e.houseSystem?d`<span>${e.houseSystem} houses</span>`:m} <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,t){return d`<svg viewBox="0 0 ${H} ${H}" 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="${l}" cy="${l}" r="${R}" stroke-width="1.5"/><circle class="wheel-line" cx="${l}" cy="${l}" r="${D-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${l}" cy="${l}" r="${C}" stroke-width="1"/><circle class="wheel-line" cx="${l}" cy="${l}" r="${P-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,t)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,t){let n=e.map(r=>f(r.name)),o=new Map;for(let r of t){let a=[f(r.planet1),f(r.planet2)].sort().join("|");o.set(a,r)}return n.length===0?d`<p class="roxy-empty" role="status">No planets to grid</p>`:d`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${n.slice(0,-1).map(r=>{let a=k[r]??r.slice(0,2);return d`<th scope="col" title="${r}">${a}</th>`})}</tr></thead><tbody>${n.slice(1).map((r,a)=>{let i=k[r]??r.slice(0,2);return d`<tr><th scope="row" title="${r}">${i}</th>${n.slice(0,a+1).map(p=>{let g=o.get([r,p].sort().join("|"));if(!g)return d`<td class="empty"></td>`;let h=j(g),$=_[h]??_[h.replace(/-/g,"")]??h.slice(0,3),A=U[h]??"aspect-other",E=z(g.orb,1);return d`<td class="${`cell ${A}`}" title="${`${r} ${h} ${p}${E?` (orb ${E}\xB0)`:""}`}"><span class="asp">${$}</span></td>`})} ${n.slice(a+1,-1).map(()=>d`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),t=this.getMidheaven(),n=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(O(e),"DSC")];t!==null&&(n.push(this.renderAngleMark(t,"MC")),n.push(this.renderAngleMark(O(t),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&n.push(this.renderAngleMark(v(o),"PoF"));let r=this.data?.vertex?.longitude;return typeof r=="number"&&n.push(this.renderAngleMark(v(r),"Vtx")),n}renderAngleMark(e,t){let n=this.toAngle(e),o=u(l,l,R,n),r=u(l,l,be,n),a=u(l,l,ve,n);return b`
|
|
1
|
+
var oe=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var y=(c,s,e,t)=>{for(var n=t>1?void 0:t?se(s,e):s,o=c.length-1,r;o>=0;o--)(r=c[o])&&(n=(t?r(s,e,n):r(n))||n);return t&&n&&oe(s,e,n),n};import{css as ye,html as d,nothing as u,svg as b}from"lit";import{customElement as xe,property as te,state as fe}from"lit/decorators.js";var S={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"};var B={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"};var T=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],we=T.map(c=>c.toLowerCase()),_={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"};import{html as L,LitElement as de}from"lit";import{property as w,state as V}from"lit/decorators.js";import{ifDefined as pe}from"lit/directives/if-defined.js";import{css as ae}from"lit";var C=ae`: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 ie="https://roxyapi.com/api/v2",N=class{constructor(s){this.baseUrl=ie;this.host=s,s.addController(this)}hostDisconnected(){this.abort?.abort(),this.abort=void 0}async run(s){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 t=this.submitUrl?await fetch(this.submitUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(s),signal:e.signal}):await this.callApi(s,e.signal);if(!t.ok)throw new Error(await this.readError(t));let n=await t.json();if(e.signal.aborted)return;this.host.data=n}catch(t){if(t?.name==="AbortError")return;this.host.error=t instanceof Error?t.message:String(t)}finally{this.abort===e&&(this.abort=void 0),e.signal.aborted||(this.host.loading=!1)}}callApi(s,e){let t=new URL(`${this.baseUrl}${s.path}`);for(let[o,r]of Object.entries(s.query??{}))r!=null&&t.searchParams.set(o,String(r));let n={Accept:"application/json"};return this.publishableKey&&(n["X-API-Key"]=this.publishableKey),s.body!=null&&(n["Content-Type"]="application/json"),fetch(t,{method:s.method??"GET",headers:n,body:s.body!=null?JSON.stringify(s.body):void 0,signal:e})}secretKeyRefused(){let s=this.publishableKey;return!s||s.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(s){try{let e=await s.json();if(e?.error)return e.error}catch{}return`Request failed (${s.status})`}};function J(c,s,e){let t={...e},n=`/${c.replace(/^\//,"")}`.replace(/\{([^}]+)\}/g,(a,i)=>{let p=t[i];return delete t[i],encodeURIComponent(String(p??""))}),o={},r={};for(let[a,i]of Object.entries(t))i===void 0||i===""||(s==="GET"?o[a]=i:r[a]=i);return{path:n,method:s,query:o,body:s==="POST"?r:void 0}}var le="roxy-data";function ce(c){return c.nodeName==="SCRIPT"&&c.getAttribute("type")==="application/json"}var I=class{constructor(s){this.host=s,s.addController(this)}hostConnected(){if(this.host.data!=null)return;let s=this.read();s!==void 0&&(this.host.data=s,this.host.requestUpdate())}read(){let s=this.findInlineScript();return s?this.parse(s.textContent):void 0}findInlineScript(){for(let s of Array.from(this.host.children))if(ce(s)&&s.classList.contains(le))return s;return null}parse(s){if(s?.trim())try{return JSON.parse(s)}catch{return}}};var x=class extends de{constructor(){super();this.data=null;this.endpoint="";this.method="POST";this.remember=!1;this.loading=!1;this.error=null;this.onFormSubmit=e=>{let t=e.detail;this.remember&&this.writeRemembered(t.values),this.fetcher.run(J(this.endpoint,this.method,t.values))};new I(this),this.fetcher=new N(this)}static{this.styles=[C]}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 L`<roxy-endpoint-form data-endpoint="${this.endpoint}" method="${this.method}" spec-url="${pe(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 L`<div class="roxy-empty" role="status">No data</div>`}renderLoading(){return L`<div class="roxy-skeleton" style="height:8rem" role="status" aria-label="Loading"></div>`}renderError(e){let t=L`<div class="roxy-error" role="alert">${e}</div>`;return this.endpoint?L`${t}${this.renderForm()}`:t}};y([w({attribute:!1})],x.prototype,"data",2),y([w({type:String,attribute:"data-endpoint"})],x.prototype,"endpoint",2),y([w({type:String})],x.prototype,"method",2),y([w({type:String,attribute:"publishable-key"})],x.prototype,"publishableKey",2),y([w({type:String,attribute:"base-url"})],x.prototype,"baseUrl",2),y([w({type:String,attribute:"spec-url"})],x.prototype,"specUrl",2),y([w({type:String,attribute:"submit-url"})],x.prototype,"submitUrl",2),y([w({type:Boolean})],x.prototype,"remember",2),y([V()],x.prototype,"loading",2),y([V()],x.prototype,"error",2);function v(c){let s=c%360;return s<0?s+360:s}function G(c){let s=v(c),e=Math.floor(s/30)%12,t=s%30,n=Math.floor(t),o=(t-n)*60,r=Math.floor(o),a=Math.round((o-r)*60);return{sign:T[e]??"Aries",signIndex:e,degree:n,minute:r,second:a}}function O(c){return v(c+180)}function Y(c,s){let e=v(c),t=v(s)-e;return t<0&&(t+=360),v(e+t/2)}function m(c,s,e,t){let n=t*Math.PI/180;return{x:c+e*Math.cos(n),y:s+e*Math.sin(n)}}import{css as ue,html as me}from"lit";function W(){return me`<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 X=ue`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 z(c,s=1){return typeof c!="number"||!Number.isFinite(c)?"":c.toFixed(s).replace(/\.?0+$/,"")}var U={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function j(c){return(c.type??"").toLowerCase().replace(/_/g,"-")}function f(c){return c?c.charAt(0).toUpperCase()+c.slice(1).toLowerCase():""}import{css as ge,html as Z,nothing as he}from"lit";var Q=ge`.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 ee(c){let{items:s,active:e,onSelect:t,label:n,idPrefix:o,controls:r=!1}=c;return Z`<div class="roxy-tablist" role="tablist" aria-label="${n}" @keydown="${i=>{if(i.key!=="ArrowRight"&&i.key!=="ArrowLeft")return;i.preventDefault();let p=s.findIndex(A=>A.id===e);if(p===-1)return;let g=i.key==="ArrowRight"?1:-1,h=s[(p+g+s.length)%s.length];if(!h)return;t(h.id);let $=i.currentTarget.getRootNode();requestAnimationFrame(()=>{$.querySelector(`#${o}-tab-${h.id}`)?.focus()})}}">${s.map(i=>Z`<button type="button" class="roxy-tab" role="tab" id="${o}-tab-${i.id}" aria-selected="${e===i.id?"true":"false"}" aria-controls="${r&&e===i.id?`${o}-panel-${i.id}`:he}" tabindex="${e===i.id?"0":"-1"}" @click="${()=>t(i.id)}">${i.label}</button>`)}</div>`}var H=420,l=H/2,R=164,D=146,M=120,P=96,be=178,ve=196,k=class extends x{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 d`<div class="roxy-empty" role="status">No chart data</div>`}renderData(e){let t=this.getPlanets(),n=e.aspects??[],o=this.view;return d`<div class="wrap"><header><h2 class="title">${this.heading}</h2>${e.birthDetails?d`<div class="meta">${[e.birthDetails.date,e.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:u}</header>${n.length>0?d`${ee({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:o,onSelect:r=>{this.view=r},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${o}" role="tabpanel" aria-labelledby="natal-tab-${o}">${o==="wheel"?this.renderWheel(t,n):this.renderAspectGrid(t,n)}</div>`:this.renderWheel(t,n)}<div class="legend"><span>${t.length} planets</span> ${n.length>0?d`<span>${n.length} aspects</span>`:u} ${e.houseSystem?d`<span>${e.houseSystem} houses</span>`:u} ${n.length>0?d`<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>`:u}</div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,t){return d`<svg viewBox="0 0 ${H} ${H}" 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="${l}" cy="${l}" r="${R}" stroke-width="1.5"/><circle class="wheel-line" cx="${l}" cy="${l}" r="${D-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${l}" cy="${l}" r="${M}" stroke-width="1"/><circle class="wheel-line" cx="${l}" cy="${l}" r="${P-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,t)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,t){let n=e.map(r=>f(r.name)),o=new Map;for(let r of t){let a=[f(r.planet1),f(r.planet2)].sort().join("|");o.set(a,r)}return n.length===0?d`<p class="roxy-empty" role="status">No planets to grid</p>`:d`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${n.slice(0,-1).map(r=>{let a=S[r]??r.slice(0,2);return d`<th scope="col" title="${r}">${a}</th>`})}</tr></thead><tbody>${n.slice(1).map((r,a)=>{let i=S[r]??r.slice(0,2);return d`<tr><th scope="row" title="${r}">${i}</th>${n.slice(0,a+1).map(p=>{let g=o.get([r,p].sort().join("|"));if(!g)return d`<td class="empty"></td>`;let h=j(g),$=_[h]??_[h.replace(/-/g,"")]??h.slice(0,3),A=U[h]??"aspect-other",E=z(g.orb,1);return d`<td class="${`cell ${A}`}" title="${`${r} ${h} ${p}${E?` (orb ${E}\xB0)`:""}`}"><span class="asp">${$}</span></td>`})} ${n.slice(a+1,-1).map(()=>d`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),t=this.getMidheaven(),n=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(O(e),"DSC")];t!==null&&(n.push(this.renderAngleMark(t,"MC")),n.push(this.renderAngleMark(O(t),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&n.push(this.renderAngleMark(v(o),"PoF"));let r=this.data?.vertex?.longitude;return typeof r=="number"&&n.push(this.renderAngleMark(v(r),"Vtx")),n}renderAngleMark(e,t){let n=this.toAngle(e),o=m(l,l,R,n),r=m(l,l,be,n),a=m(l,l,ve,n);return b`
|
|
2
2
|
<g>
|
|
3
3
|
<line class="angle-tick" x1=${o.x} y1=${o.y} x2=${r.x} y2=${r.y} />
|
|
4
4
|
<text class="angle-marker" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${t}</text>
|
|
5
5
|
</g>
|
|
6
|
-
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(n=>n.longitude):Array.from({length:12},(n,o)=>this.getAscendant()+o*30)).map(n=>{let o=this.toAngle(n),r=
|
|
7
|
-
${
|
|
8
|
-
<text class="planet-glyph" x=${h.x} y=${h.y} text-anchor="middle" dominant-baseline="central"><title>${r.name}${K?" retrograde":""} - ${q} ${r.sign??""}</title>${
|
|
9
|
-
<text class="planet-deg" x=${$.x} y=${$.y} text-anchor="middle" dominant-baseline="central">${q}${K?b`<tspan class="retro"> ℞</tspan>`:
|
|
10
|
-
</g>`})}renderDetails(){let e=this.data?.summary,t=this.data?.aspectsInterpretation;if(!e&&!t)return
|
|
6
|
+
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(n=>n.longitude):Array.from({length:12},(n,o)=>this.getAscendant()+o*30)).map(n=>{let o=this.toAngle(n),r=m(l,l,M,o),a=m(l,l,R,o);return b`<line class="wheel-line" x1=${r.x} y1=${r.y} x2=${a.x} y2=${a.y} stroke-width="0.8" />`})}renderSigns(){return T.map((e,t)=>{let n=this.toAngle(t*30+15),o=m(l,l,D,n);return b`<text class="sign-glyph" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${B[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((n,o)=>{let r=e[(o+1)%12],a=Y(n.longitude,r?r.longitude:n.longitude+30),i=m(l,l,M-12,this.toAngle(a));return b`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${n.number}</text>`});let t=Math.floor(this.getAscendant()/30);return Array.from({length:12},(n,o)=>{let r=this.toAngle(o*30+15),a=m(l,l,M-12,r),i=(o-t+12)%12+1;return b`<text class="house-num" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${i}</text>`})}renderTicks(){let e=[];for(let t=0;t<360;t+=5){let n=this.toAngle(t),o=t%30===0,r=o?D-14:R-5,a=m(l,l,r,n),i=m(l,l,R,n);e.push(b`<line class=${o?"tick tick-major":"tick"} x1=${a.x} y1=${a.y} x2=${i.x} y2=${i.y} stroke-width=${o?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?u:e.map(t=>{let n=this.toAngle(t.longitude),o=m(l,l,M+9,n),r=G(t.longitude);return b`<text class="cusp-deg" x=${o.x} y=${o.y} text-anchor="middle" dominant-baseline="central">${r.degree}°${String(r.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let n=e.filter(r=>Number.isFinite(r.longitude)).map(r=>({p:r,trueLon:v(r.longitude),displayLon:v(r.longitude)})).sort((r,a)=>r.trueLon-a.trueLon);for(let r=1;r<n.length;r++){let a=n[r-1],i=n[r];if(!a||!i)continue;let p=a.displayLon+7;i.displayLon<p&&(i.displayLon=p)}let o=n[n.length-1];if(o&&o.displayLon>360){let r=o.displayLon-360;for(let a of n)a.displayLon-=r}return n.map(({p:r,trueLon:a,displayLon:i})=>{let p=this.toAngle(a),g=this.toAngle(i),h=m(l,l,P,g),$=m(l,l,P-13,g),A=m(l,l,R-4,p),E=m(l,l,P+8,g),re=S[f(r.name)]??r.name.slice(0,2),F=G(r.longitude),K=r.isRetrograde===!0,q=`${F.degree}\xB0${String(F.minute).padStart(2,"0")}'`,ne=Math.abs(i-a)>.5;return b`<g>
|
|
7
|
+
${ne?b`<line class="planet-leader" x1=${A.x} y1=${A.y} x2=${E.x} y2=${E.y} />`:u}
|
|
8
|
+
<text class="planet-glyph" x=${h.x} y=${h.y} text-anchor="middle" dominant-baseline="central"><title>${r.name}${K?" retrograde":""} - ${q} ${r.sign??""}</title>${re}</text>
|
|
9
|
+
<text class="planet-deg" x=${$.x} y=${$.y} text-anchor="middle" dominant-baseline="central">${q}${K?b`<tspan class="retro"> ℞</tspan>`:u}</text>
|
|
10
|
+
</g>`})}renderDetails(){let e=this.data?.summary,t=this.data?.aspectsInterpretation;if(!e&&!t)return u;let n=e?.retrogradePlanets??[];return d`<div class="details">${e?.dominantElement||e?.dominantModality?d`<div class="pill-row">${e.dominantElement?d`<span class="pill">Dominant element: ${e.dominantElement}</span>`:u} ${e.dominantModality?d`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:u}</div>`:u} ${t?d`<div class="pill-row"><span class="pill pill--success">Harmonious ${t.harmonious}</span> <span class="pill pill--danger">Challenging ${t.challenging}</span> <span class="pill pill--muted">Neutral ${t.neutral}</span></div>`:u} ${n.length>0?d`<div class="pill-row">${n.map(o=>{let r=S[o]??o.slice(0,2);return d`<span class="pill pill--muted">${r} ${o} R</span>`})}</div>`:u} ${t?.summary?d`<p class="summary">${t.summary}</p>`:u} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return u;let t=["Fire","Earth","Air","Water"],n=["Cardinal","Fixed","Mutable"],o=T,r={};for(let a of t)r[a]={Cardinal:[],Fixed:[],Mutable:[]};for(let a of e){let i=o.indexOf(f(a.sign??""));if(i<0)continue;let p=t[i%4],g=n[i%3],h=S[f(a.name)]??f(a.name).slice(0,2);r[p]?.[g]?.push(h)}return d`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${n.map(a=>d`<th scope="col">${a.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${t.map(a=>{let i=n.reduce((p,g)=>p+(r[a]?.[g]?.length??0),0);return d`<tr><th scope="row">${a}</th>${n.map(p=>d`<td>${(r[a]?.[p]??[]).join(" ")}</td>`)}<td class="em-total">${i}</td></tr>`})}<tr><th scope="row">Total</th>${n.map(a=>d`<td class="em-total">${t.reduce((i,p)=>i+(r[p]?.[a]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(t=>t.interpretation);return e.length===0?u:d`<section class="interpretations"><h3>Planet readings</h3>${e.map((t,n)=>{let o=t.interpretation,r=S[f(t.name)]??"",a=z(t.degree??0,1);return d`<details class="interp-card" name="natal-planet-readings" ?open="${n===0}"><summary><span>${r} ${t.name}</span> <span class="interp-aside"><small>${t.sign??""} ${a}</small> ${W()}</span></summary><div class="interp-body">${o.summary?d`<p class="interp-summary">${o.summary}</p>`:u} ${o.detailed?d`<p class="interp-detail">${o.detailed}</p>`:u} ${o.keywords?.length?d`<div class="interp-keywords">${o.keywords.map(i=>d`<span class="kw">${i}</span>`)}</div>`:u}</div></details>`})}</section>`}renderAspects(e,t){let n=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let r=f(o.name);r&&n.set(r,o.longitude)}return t.map(o=>{let r=n.get(f(o.planet1)),a=n.get(f(o.planet2));if(r===void 0||a===void 0)return u;let i=m(l,l,P-18,this.toAngle(r)),p=m(l,l,P-18,this.toAngle(a)),g=j(o),h=U[g]??"aspect-other",$=z(o.orb,1);return b`<line class=${`aspect ${h}`} x1=${i.x} y1=${i.y} x2=${p.x} y2=${p.y}><title>${o.planet1} ${g||""} ${o.planet2}${$?` (orb ${$}\xB0)`:""}</title></line>`})}};k.styles=[C,Q,X,ye`.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}`],y([te({type:String,attribute:"house-system",reflect:!0})],k.prototype,"houseSystem",2),y([te({type:String})],k.prototype,"heading",2),y([fe()],k.prototype,"view",2),k=y([xe("roxy-natal-chart")],k);export{k as RoxyNatalChart};
|
|
11
11
|
//# sourceMappingURL=natal-chart.js.map
|