@roxyapi/ui 0.4.1 → 0.6.0

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.
Files changed (235) hide show
  1. package/AGENTS.md +21 -0
  2. package/README.md +17 -1
  3. package/dist/cdn/components/ashtakavarga-grid.js +3 -362
  4. package/dist/cdn/components/ashtakavarga-grid.js.map +4 -4
  5. package/dist/cdn/components/biorhythm-chart.js +3 -226
  6. package/dist/cdn/components/biorhythm-chart.js.map +4 -4
  7. package/dist/cdn/components/choghadiya-grid.js +3 -232
  8. package/dist/cdn/components/choghadiya-grid.js.map +4 -4
  9. package/dist/cdn/components/compatibility-card.js +3 -231
  10. package/dist/cdn/components/compatibility-card.js.map +4 -4
  11. package/dist/cdn/components/dasha-timeline.js +3 -283
  12. package/dist/cdn/components/dasha-timeline.js.map +4 -4
  13. package/dist/cdn/components/data.js +3 -230
  14. package/dist/cdn/components/data.js.map +4 -4
  15. package/dist/cdn/components/divisional-chart.js +3 -356
  16. package/dist/cdn/components/divisional-chart.js.map +4 -4
  17. package/dist/cdn/components/dosha-card.js +3 -226
  18. package/dist/cdn/components/dosha-card.js.map +4 -4
  19. package/dist/cdn/components/endpoint-form.js +2 -243
  20. package/dist/cdn/components/endpoint-form.js.map +2 -2
  21. package/dist/cdn/components/guna-milan.js +3 -270
  22. package/dist/cdn/components/guna-milan.js.map +4 -4
  23. package/dist/cdn/components/hexagram.js +3 -247
  24. package/dist/cdn/components/hexagram.js.map +4 -4
  25. package/dist/cdn/components/horoscope-card.js +3 -281
  26. package/dist/cdn/components/horoscope-card.js.map +4 -4
  27. package/dist/cdn/components/kp-chart.js +3 -278
  28. package/dist/cdn/components/kp-chart.js.map +4 -4
  29. package/dist/cdn/components/kp-planets-table.js +3 -196
  30. package/dist/cdn/components/kp-planets-table.js.map +4 -4
  31. package/dist/cdn/components/kp-ruling-planets.js +3 -241
  32. package/dist/cdn/components/kp-ruling-planets.js.map +4 -4
  33. package/dist/cdn/components/location-search.js +2 -240
  34. package/dist/cdn/components/location-search.js.map +2 -2
  35. package/dist/cdn/components/moon-phase.js +3 -223
  36. package/dist/cdn/components/moon-phase.js.map +4 -4
  37. package/dist/cdn/components/nakshatra-card.js +3 -201
  38. package/dist/cdn/components/nakshatra-card.js.map +4 -4
  39. package/dist/cdn/components/natal-chart.js +3 -563
  40. package/dist/cdn/components/natal-chart.js.map +4 -4
  41. package/dist/cdn/components/numerology-card.js +3 -233
  42. package/dist/cdn/components/numerology-card.js.map +4 -4
  43. package/dist/cdn/components/panchang-table.js +3 -220
  44. package/dist/cdn/components/panchang-table.js.map +4 -4
  45. package/dist/cdn/components/shadbala-table.js +3 -284
  46. package/dist/cdn/components/shadbala-table.js.map +4 -4
  47. package/dist/cdn/components/synastry-chart.js +3 -399
  48. package/dist/cdn/components/synastry-chart.js.map +4 -4
  49. package/dist/cdn/components/tarot-card.js +3 -261
  50. package/dist/cdn/components/tarot-card.js.map +4 -4
  51. package/dist/cdn/components/tarot-spread.js +3 -249
  52. package/dist/cdn/components/tarot-spread.js.map +4 -4
  53. package/dist/cdn/components/transits-table.js +3 -382
  54. package/dist/cdn/components/transits-table.js.map +4 -4
  55. package/dist/cdn/components/vedic-kundli.js +3 -305
  56. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  57. package/dist/cdn/components/vedic-planets-table.js +3 -203
  58. package/dist/cdn/components/vedic-planets-table.js.map +4 -4
  59. package/dist/cdn/components/western-planets-table.js +3 -192
  60. package/dist/cdn/components/western-planets-table.js.map +4 -4
  61. package/dist/cdn/components/yoga-list.js +3 -306
  62. package/dist/cdn/components/yoga-list.js.map +4 -4
  63. package/dist/cdn/roxy-ui.js +3 -5102
  64. package/dist/cdn/roxy-ui.js.map +4 -4
  65. package/dist/cdn/widgets.js +1 -114
  66. package/dist/components/ashtakavarga-grid.d.ts +1 -0
  67. package/dist/components/ashtakavarga-grid.d.ts.map +1 -1
  68. package/dist/components/ashtakavarga-grid.js +1 -531
  69. package/dist/components/ashtakavarga-grid.js.map +4 -4
  70. package/dist/components/biorhythm-chart.d.ts +1 -0
  71. package/dist/components/biorhythm-chart.d.ts.map +1 -1
  72. package/dist/components/biorhythm-chart.js +1 -332
  73. package/dist/components/biorhythm-chart.js.map +4 -4
  74. package/dist/components/choghadiya-grid.d.ts +1 -0
  75. package/dist/components/choghadiya-grid.d.ts.map +1 -1
  76. package/dist/components/choghadiya-grid.js +1 -351
  77. package/dist/components/choghadiya-grid.js.map +4 -4
  78. package/dist/components/compatibility-card.d.ts +1 -0
  79. package/dist/components/compatibility-card.d.ts.map +1 -1
  80. package/dist/components/compatibility-card.js +1 -313
  81. package/dist/components/compatibility-card.js.map +4 -4
  82. package/dist/components/dasha-timeline.d.ts +1 -0
  83. package/dist/components/dasha-timeline.d.ts.map +1 -1
  84. package/dist/components/dasha-timeline.js +1 -401
  85. package/dist/components/dasha-timeline.js.map +4 -4
  86. package/dist/components/data.d.ts +1 -0
  87. package/dist/components/data.d.ts.map +1 -1
  88. package/dist/components/data.js +1 -362
  89. package/dist/components/data.js.map +4 -4
  90. package/dist/components/divisional-chart.d.ts +1 -0
  91. package/dist/components/divisional-chart.d.ts.map +1 -1
  92. package/dist/components/divisional-chart.js +1 -886
  93. package/dist/components/divisional-chart.js.map +4 -4
  94. package/dist/components/dosha-card.d.ts +1 -0
  95. package/dist/components/dosha-card.d.ts.map +1 -1
  96. package/dist/components/dosha-card.js +1 -293
  97. package/dist/components/dosha-card.js.map +4 -4
  98. package/dist/components/endpoint-form.js +1 -505
  99. package/dist/components/endpoint-form.js.map +3 -3
  100. package/dist/components/guna-milan.d.ts +1 -0
  101. package/dist/components/guna-milan.d.ts.map +1 -1
  102. package/dist/components/guna-milan.js +1 -374
  103. package/dist/components/guna-milan.js.map +4 -4
  104. package/dist/components/hexagram.d.ts +1 -0
  105. package/dist/components/hexagram.d.ts.map +1 -1
  106. package/dist/components/hexagram.js +1 -380
  107. package/dist/components/hexagram.js.map +4 -4
  108. package/dist/components/horoscope-card.d.ts +1 -0
  109. package/dist/components/horoscope-card.d.ts.map +1 -1
  110. package/dist/components/horoscope-card.js +1 -381
  111. package/dist/components/horoscope-card.js.map +4 -4
  112. package/dist/components/kp-chart.d.ts +1 -0
  113. package/dist/components/kp-chart.d.ts.map +1 -1
  114. package/dist/components/kp-chart.js +1 -395
  115. package/dist/components/kp-chart.js.map +4 -4
  116. package/dist/components/kp-planets-table.d.ts +1 -0
  117. package/dist/components/kp-planets-table.d.ts.map +1 -1
  118. package/dist/components/kp-planets-table.js +1 -246
  119. package/dist/components/kp-planets-table.js.map +4 -4
  120. package/dist/components/kp-ruling-planets.d.ts +1 -0
  121. package/dist/components/kp-ruling-planets.d.ts.map +1 -1
  122. package/dist/components/kp-ruling-planets.js +1 -288
  123. package/dist/components/kp-ruling-planets.js.map +4 -4
  124. package/dist/components/location-search.js +1 -461
  125. package/dist/components/location-search.js.map +3 -3
  126. package/dist/components/moon-phase.d.ts +1 -0
  127. package/dist/components/moon-phase.d.ts.map +1 -1
  128. package/dist/components/moon-phase.js +1 -327
  129. package/dist/components/moon-phase.js.map +4 -4
  130. package/dist/components/nakshatra-card.d.ts +1 -0
  131. package/dist/components/nakshatra-card.d.ts.map +1 -1
  132. package/dist/components/nakshatra-card.js +1 -244
  133. package/dist/components/nakshatra-card.js.map +4 -4
  134. package/dist/components/natal-chart.d.ts +1 -1
  135. package/dist/components/natal-chart.d.ts.map +1 -1
  136. package/dist/components/natal-chart.js +1 -1040
  137. package/dist/components/natal-chart.js.map +4 -4
  138. package/dist/components/numerology-card.d.ts +1 -0
  139. package/dist/components/numerology-card.d.ts.map +1 -1
  140. package/dist/components/numerology-card.js +1 -315
  141. package/dist/components/numerology-card.js.map +4 -4
  142. package/dist/components/panchang-table.d.ts +1 -0
  143. package/dist/components/panchang-table.d.ts.map +1 -1
  144. package/dist/components/panchang-table.js +1 -350
  145. package/dist/components/panchang-table.js.map +4 -4
  146. package/dist/components/shadbala-table.d.ts +1 -0
  147. package/dist/components/shadbala-table.d.ts.map +1 -1
  148. package/dist/components/shadbala-table.js +1 -413
  149. package/dist/components/shadbala-table.js.map +4 -4
  150. package/dist/components/synastry-chart.d.ts +1 -0
  151. package/dist/components/synastry-chart.d.ts.map +1 -1
  152. package/dist/components/synastry-chart.js +1 -658
  153. package/dist/components/synastry-chart.js.map +4 -4
  154. package/dist/components/tarot-card.d.ts +1 -0
  155. package/dist/components/tarot-card.d.ts.map +1 -1
  156. package/dist/components/tarot-card.js +1 -333
  157. package/dist/components/tarot-card.js.map +4 -4
  158. package/dist/components/tarot-spread.d.ts +1 -0
  159. package/dist/components/tarot-spread.d.ts.map +1 -1
  160. package/dist/components/tarot-spread.js +1 -310
  161. package/dist/components/tarot-spread.js.map +4 -4
  162. package/dist/components/transits-table.d.ts +3 -0
  163. package/dist/components/transits-table.d.ts.map +1 -1
  164. package/dist/components/transits-table.js +1 -548
  165. package/dist/components/transits-table.js.map +4 -4
  166. package/dist/components/vedic-kundli.d.ts +1 -0
  167. package/dist/components/vedic-kundli.d.ts.map +1 -1
  168. package/dist/components/vedic-kundli.js +1 -802
  169. package/dist/components/vedic-kundli.js.map +4 -4
  170. package/dist/components/vedic-planets-table.d.ts +1 -0
  171. package/dist/components/vedic-planets-table.d.ts.map +1 -1
  172. package/dist/components/vedic-planets-table.js +1 -368
  173. package/dist/components/vedic-planets-table.js.map +4 -4
  174. package/dist/components/western-planets-table.d.ts +1 -0
  175. package/dist/components/western-planets-table.d.ts.map +1 -1
  176. package/dist/components/western-planets-table.js +1 -363
  177. package/dist/components/western-planets-table.js.map +4 -4
  178. package/dist/components/yoga-list.d.ts +1 -0
  179. package/dist/components/yoga-list.d.ts.map +1 -1
  180. package/dist/components/yoga-list.js +1 -383
  181. package/dist/components/yoga-list.js.map +4 -4
  182. package/dist/index.cjs +1 -8653
  183. package/dist/index.cjs.map +4 -4
  184. package/dist/index.js +1 -8633
  185. package/dist/index.js.map +4 -4
  186. package/dist/types/index.d.ts +1 -1
  187. package/dist/types/index.d.ts.map +1 -1
  188. package/dist/types/types.gen.d.ts +590 -202
  189. package/dist/types/types.gen.d.ts.map +1 -1
  190. package/dist/utils/disclosure.d.ts +16 -0
  191. package/dist/utils/disclosure.d.ts.map +1 -0
  192. package/dist/utils/kundli-render.d.ts.map +1 -1
  193. package/dist/utils/kundli-styles.d.ts.map +1 -1
  194. package/dist/utils/markup-data.d.ts +57 -0
  195. package/dist/utils/markup-data.d.ts.map +1 -0
  196. package/dist/utils/tablist.d.ts +44 -0
  197. package/dist/utils/tablist.d.ts.map +1 -0
  198. package/dist/version.d.ts +1 -1
  199. package/package.json +3 -1
  200. package/src/components/ashtakavarga-grid.ts +9 -0
  201. package/src/components/biorhythm-chart.ts +9 -0
  202. package/src/components/choghadiya-grid.ts +9 -0
  203. package/src/components/compatibility-card.ts +9 -0
  204. package/src/components/dasha-timeline.ts +19 -1
  205. package/src/components/data.ts +9 -0
  206. package/src/components/divisional-chart.ts +11 -0
  207. package/src/components/dosha-card.ts +9 -0
  208. package/src/components/guna-milan.ts +9 -0
  209. package/src/components/hexagram.ts +9 -0
  210. package/src/components/horoscope-card.ts +9 -0
  211. package/src/components/kp-chart.ts +9 -0
  212. package/src/components/kp-planets-table.ts +9 -0
  213. package/src/components/kp-ruling-planets.ts +9 -0
  214. package/src/components/moon-phase.ts +9 -0
  215. package/src/components/nakshatra-card.ts +9 -0
  216. package/src/components/natal-chart.ts +46 -62
  217. package/src/components/numerology-card.ts +9 -0
  218. package/src/components/panchang-table.ts +9 -0
  219. package/src/components/shadbala-table.ts +9 -0
  220. package/src/components/synastry-chart.ts +9 -0
  221. package/src/components/tarot-card.ts +9 -0
  222. package/src/components/tarot-spread.ts +9 -0
  223. package/src/components/transits-table.ts +54 -18
  224. package/src/components/vedic-kundli.ts +11 -1
  225. package/src/components/vedic-planets-table.ts +9 -0
  226. package/src/components/western-planets-table.ts +9 -0
  227. package/src/components/yoga-list.ts +9 -0
  228. package/src/types/index.ts +1 -1
  229. package/src/types/types.gen.ts +602 -200
  230. package/src/utils/disclosure.ts +62 -0
  231. package/src/utils/kundli-render.ts +21 -35
  232. package/src/utils/kundli-styles.ts +0 -31
  233. package/src/utils/markup-data.ts +115 -0
  234. package/src/utils/tablist.ts +124 -0
  235. package/src/version.ts +1 -1
@@ -1,566 +1,6 @@
1
- "use strict";var RoxyUI_natal_chart=(()=>{var K=Object.defineProperty;var wt=Object.getOwnPropertyDescriptor;var Yt=Object.getOwnPropertyNames;var Jt=Object.prototype.hasOwnProperty;var Zt=(i,t)=>{for(var e in t)K(i,e,{get:t[e],enumerable:!0})},Qt=(i,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Yt(t))!Jt.call(i,s)&&s!==e&&K(i,s,{get:()=>t[s],enumerable:!(r=wt(t,s))||r.enumerable});return i};var Xt=i=>Qt(K({},"__esModule",{value:!0}),i),U=(i,t,e,r)=>{for(var s=r>1?void 0:r?wt(t,e):t,n=i.length-1,o;n>=0;n--)(o=i[n])&&(s=(r?o(t,e,s):o(s))||s);return r&&s&&K(t,e,s),s};var fe={};Zt(fe,{RoxyNatalChart:()=>_});var Y=globalThis,J=Y.ShadowRoot&&(Y.ShadyCSS===void 0||Y.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,rt=Symbol(),St=new WeakMap,z=class{constructor(t,e,r){if(this._$cssResult$=!0,r!==rt)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o,e=this.t;if(J&&t===void 0){let r=e!==void 0&&e.length===1;r&&(t=St.get(e)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),r&&St.set(e,t))}return t}toString(){return this.cssText}},Et=i=>new z(typeof i=="string"?i:i+"",void 0,rt),H=(i,...t)=>{let e=i.length===1?i[0]:t.reduce((r,s,n)=>r+(o=>{if(o._$cssResult$===!0)return o.cssText;if(typeof o=="number")return o;throw Error("Value passed to 'css' function must be a 'css' function result: "+o+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(s)+i[n+1],i[0]);return new z(e,i,rt)},Pt=(i,t)=>{if(J)i.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of t){let r=document.createElement("style"),s=Y.litNonce;s!==void 0&&r.setAttribute("nonce",s),r.textContent=e.cssText,i.appendChild(r)}},st=J?i=>i:i=>i instanceof CSSStyleSheet?(t=>{let e="";for(let r of t.cssRules)e+=r.cssText;return Et(e)})(i):i;var{is:te,defineProperty:ee,getOwnPropertyDescriptor:re,getOwnPropertyNames:se,getOwnPropertySymbols:ne,getPrototypeOf:oe}=Object,Z=globalThis,kt=Z.trustedTypes,ie=kt?kt.emptyScript:"",ae=Z.reactiveElementPolyfillSupport,I=(i,t)=>i,D={toAttribute(i,t){switch(t){case Boolean:i=i?ie:null;break;case Object:case Array:i=i==null?i:JSON.stringify(i)}return i},fromAttribute(i,t){let e=i;switch(t){case Boolean:e=i!==null;break;case Number:e=i===null?null:Number(i);break;case Object:case Array:try{e=JSON.parse(i)}catch{e=null}}return e}},Q=(i,t)=>!te(i,t),Ct={attribute:!0,type:String,converter:D,reflect:!1,useDefault:!1,hasChanged:Q};Symbol.metadata??=Symbol("metadata"),Z.litPropertyMetadata??=new WeakMap;var A=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=Ct){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){let r=Symbol(),s=this.getPropertyDescriptor(t,r,e);s!==void 0&&ee(this.prototype,t,s)}}static getPropertyDescriptor(t,e,r){let{get:s,set:n}=re(this.prototype,t)??{get(){return this[e]},set(o){this[e]=o}};return{get:s,set(o){let a=s?.call(this);n?.call(this,o),this.requestUpdate(t,a,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??Ct}static _$Ei(){if(this.hasOwnProperty(I("elementProperties")))return;let t=oe(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(I("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(I("properties"))){let e=this.properties,r=[...se(e),...ne(e)];for(let s of r)this.createProperty(s,e[s])}let t=this[Symbol.metadata];if(t!==null){let e=litPropertyMetadata.get(t);if(e!==void 0)for(let[r,s]of e)this.elementProperties.set(r,s)}this._$Eh=new Map;for(let[e,r]of this.elementProperties){let s=this._$Eu(e,r);s!==void 0&&this._$Eh.set(s,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){let e=[];if(Array.isArray(t)){let r=new Set(t.flat(1/0).reverse());for(let s of r)e.unshift(st(s))}else t!==void 0&&e.push(st(t));return e}static _$Eu(t,e){let r=e.attribute;return r===!1?void 0:typeof r=="string"?r:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){let t=new Map,e=this.constructor.elementProperties;for(let r of e.keys())this.hasOwnProperty(r)&&(t.set(r,this[r]),delete this[r]);t.size>0&&(this._$Ep=t)}createRenderRoot(){let t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Pt(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,r){this._$AK(t,r)}_$ET(t,e){let r=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,r);if(s!==void 0&&r.reflect===!0){let n=(r.converter?.toAttribute!==void 0?r.converter:D).toAttribute(e,r.type);this._$Em=t,n==null?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){let r=this.constructor,s=r._$Eh.get(t);if(s!==void 0&&this._$Em!==s){let n=r.getPropertyOptions(s),o=typeof n.converter=="function"?{fromAttribute:n.converter}:n.converter?.fromAttribute!==void 0?n.converter:D;this._$Em=s;let a=o.fromAttribute(e,n.type);this[s]=a??this._$Ej?.get(s)??a,this._$Em=null}}requestUpdate(t,e,r,s=!1,n){if(t!==void 0){let o=this.constructor;if(s===!1&&(n=this[t]),r??=o.getPropertyOptions(t),!((r.hasChanged??Q)(n,e)||r.useDefault&&r.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,r))))return;this.C(t,e,r)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,e,{useDefault:r,reflect:s,wrapped:n},o){r&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),n!==!0||o!==void 0)||(this._$AL.has(t)||(this.hasUpdated||r||(e=void 0),this._$AL.set(t,e)),s===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[s,n]of this._$Ep)this[s]=n;this._$Ep=void 0}let r=this.constructor.elementProperties;if(r.size>0)for(let[s,n]of r){let{wrapped:o}=n,a=this[s];o!==!0||this._$AL.has(s)||a===void 0||this.C(s,void 0,n,a)}}let t=!1,e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(r=>r.hostUpdate?.()),this.update(e)):this._$EM()}catch(r){throw t=!1,this._$EM(),r}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(t){}firstUpdated(t){}};A.elementStyles=[],A.shadowRootOptions={mode:"open"},A[I("elementProperties")]=new Map,A[I("finalized")]=new Map,ae?.({ReactiveElement:A}),(Z.reactiveElementVersions??=[]).push("2.1.2");var dt=globalThis,Mt=i=>i,X=dt.trustedTypes,Tt=X?X.createPolicy("lit-html",{createHTML:i=>i}):void 0,zt="$lit$",w=`lit$${Math.random().toFixed(9).slice(2)}$`,Ht="?"+w,le=`<${Ht}>`,k=document,q=()=>k.createComment(""),B=i=>i===null||typeof i!="object"&&typeof i!="function",pt=Array.isArray,ce=i=>pt(i)||typeof i?.[Symbol.iterator]=="function",nt=`[
2
- \f\r]`,j=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Rt=/-->/g,Lt=/>/g,E=RegExp(`>|${nt}(?:([^\\s"'>=/]+)(${nt}*=${nt}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),Nt=/'/g,Ot=/"/g,It=/^(?:script|style|textarea|title)$/i,ht=i=>(t,...e)=>({_$litType$:i,strings:t,values:e}),u=ht(1),x=ht(2),_e=ht(3),C=Symbol.for("lit-noChange"),h=Symbol.for("lit-nothing"),Ut=new WeakMap,P=k.createTreeWalker(k,129);function Dt(i,t){if(!pt(i)||!i.hasOwnProperty("raw"))throw Error("invalid template strings array");return Tt!==void 0?Tt.createHTML(t):t}var de=(i,t)=>{let e=i.length-1,r=[],s,n=t===2?"<svg>":t===3?"<math>":"",o=j;for(let a=0;a<e;a++){let l=i[a],d,m,p=-1,y=0;for(;y<l.length&&(o.lastIndex=y,m=o.exec(l),m!==null);)y=o.lastIndex,o===j?m[1]==="!--"?o=Rt:m[1]!==void 0?o=Lt:m[2]!==void 0?(It.test(m[2])&&(s=RegExp("</"+m[2],"g")),o=E):m[3]!==void 0&&(o=E):o===E?m[0]===">"?(o=s??j,p=-1):m[1]===void 0?p=-2:(p=o.lastIndex-m[2].length,d=m[1],o=m[3]===void 0?E:m[3]==='"'?Ot:Nt):o===Ot||o===Nt?o=E:o===Rt||o===Lt?o=j:(o=E,s=void 0);let f=o===E&&i[a+1].startsWith("/>")?" ":"";n+=o===j?l+le:p>=0?(r.push(d),l.slice(0,p)+zt+l.slice(p)+w+f):l+w+(p===-2?a:f)}return[Dt(i,n+(i[e]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),r]},G=class i{constructor({strings:t,_$litType$:e},r){let s;this.parts=[];let n=0,o=0,a=t.length-1,l=this.parts,[d,m]=de(t,e);if(this.el=i.createElement(d,r),P.currentNode=this.el.content,e===2||e===3){let p=this.el.content.firstChild;p.replaceWith(...p.childNodes)}for(;(s=P.nextNode())!==null&&l.length<a;){if(s.nodeType===1){if(s.hasAttributes())for(let p of s.getAttributeNames())if(p.endsWith(zt)){let y=m[o++],f=s.getAttribute(p).split(w),b=/([.?@])?(.*)/.exec(y);l.push({type:1,index:n,name:b[2],strings:f,ctor:b[1]==="."?it:b[1]==="?"?at:b[1]==="@"?lt:R}),s.removeAttribute(p)}else p.startsWith(w)&&(l.push({type:6,index:n}),s.removeAttribute(p));if(It.test(s.tagName)){let p=s.textContent.split(w),y=p.length-1;if(y>0){s.textContent=X?X.emptyScript:"";for(let f=0;f<y;f++)s.append(p[f],q()),P.nextNode(),l.push({type:2,index:++n});s.append(p[y],q())}}}else if(s.nodeType===8)if(s.data===Ht)l.push({type:2,index:n});else{let p=-1;for(;(p=s.data.indexOf(w,p+1))!==-1;)l.push({type:7,index:n}),p+=w.length-1}n++}}static createElement(t,e){let r=k.createElement("template");return r.innerHTML=t,r}};function T(i,t,e=i,r){if(t===C)return t;let s=r!==void 0?e._$Co?.[r]:e._$Cl,n=B(t)?void 0:t._$litDirective$;return s?.constructor!==n&&(s?._$AO?.(!1),n===void 0?s=void 0:(s=new n(i),s._$AT(i,e,r)),r!==void 0?(e._$Co??=[])[r]=s:e._$Cl=s),s!==void 0&&(t=T(i,s._$AS(i,t.values),s,r)),t}var ot=class{constructor(t,e){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){let{el:{content:e},parts:r}=this._$AD,s=(t?.creationScope??k).importNode(e,!0);P.currentNode=s;let n=P.nextNode(),o=0,a=0,l=r[0];for(;l!==void 0;){if(o===l.index){let d;l.type===2?d=new V(n,n.nextSibling,this,t):l.type===1?d=new l.ctor(n,l.name,l.strings,this,t):l.type===6&&(d=new ct(n,this,t)),this._$AV.push(d),l=r[++a]}o!==l?.index&&(n=P.nextNode(),o++)}return P.currentNode=k,s}p(t){let e=0;for(let r of this._$AV)r!==void 0&&(r.strings!==void 0?(r._$AI(t,r,e),e+=r.strings.length-2):r._$AI(t[e])),e++}},V=class i{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,e,r,s){this.type=2,this._$AH=h,this._$AN=void 0,this._$AA=t,this._$AB=e,this._$AM=r,this.options=s,this._$Cv=s?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode,e=this._$AM;return e!==void 0&&t?.nodeType===11&&(t=e.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,e=this){t=T(this,t,e),B(t)?t===h||t==null||t===""?(this._$AH!==h&&this._$AR(),this._$AH=h):t!==this._$AH&&t!==C&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):ce(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==h&&B(this._$AH)?this._$AA.nextSibling.data=t:this.T(k.createTextNode(t)),this._$AH=t}$(t){let{values:e,_$litType$:r}=t,s=typeof r=="number"?this._$AC(t):(r.el===void 0&&(r.el=G.createElement(Dt(r.h,r.h[0]),this.options)),r);if(this._$AH?._$AD===s)this._$AH.p(e);else{let n=new ot(s,this),o=n.u(this.options);n.p(e),this.T(o),this._$AH=n}}_$AC(t){let e=Ut.get(t.strings);return e===void 0&&Ut.set(t.strings,e=new G(t)),e}k(t){pt(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,r,s=0;for(let n of t)s===e.length?e.push(r=new i(this.O(q()),this.O(q()),this,this.options)):r=e[s],r._$AI(n),s++;s<e.length&&(this._$AR(r&&r._$AB.nextSibling,s),e.length=s)}_$AR(t=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);t!==this._$AB;){let r=Mt(t).nextSibling;Mt(t).remove(),t=r}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}},R=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,e,r,s,n){this.type=1,this._$AH=h,this._$AN=void 0,this.element=t,this.name=e,this._$AM=s,this.options=n,r.length>2||r[0]!==""||r[1]!==""?(this._$AH=Array(r.length-1).fill(new String),this.strings=r):this._$AH=h}_$AI(t,e=this,r,s){let n=this.strings,o=!1;if(n===void 0)t=T(this,t,e,0),o=!B(t)||t!==this._$AH&&t!==C,o&&(this._$AH=t);else{let a=t,l,d;for(t=n[0],l=0;l<n.length-1;l++)d=T(this,a[r+l],e,l),d===C&&(d=this._$AH[l]),o||=!B(d)||d!==this._$AH[l],d===h?t=h:t!==h&&(t+=(d??"")+n[l+1]),this._$AH[l]=d}o&&!s&&this.j(t)}j(t){t===h?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}},it=class extends R{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===h?void 0:t}},at=class extends R{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==h)}},lt=class extends R{constructor(t,e,r,s,n){super(t,e,r,s,n),this.type=5}_$AI(t,e=this){if((t=T(this,t,e,0)??h)===C)return;let r=this._$AH,s=t===h&&r!==h||t.capture!==r.capture||t.once!==r.once||t.passive!==r.passive,n=t!==h&&(r===h||s);s&&this.element.removeEventListener(this.name,this,r),n&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},ct=class{constructor(t,e,r){this.element=t,this.type=6,this._$AN=void 0,this._$AM=e,this.options=r}get _$AU(){return this._$AM._$AU}_$AI(t){T(this,t)}};var pe=dt.litHtmlPolyfillSupport;pe?.(G,V),(dt.litHtmlVersions??=[]).push("3.3.2");var jt=(i,t,e)=>{let r=e?.renderBefore??t,s=r._$litPart$;if(s===void 0){let n=e?.renderBefore??null;r._$litPart$=s=new V(t.insertBefore(q(),n),n,void 0,e??{})}return s._$AI(i),s};var ut=globalThis,S=class extends A{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=jt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return C}};S._$litElement$=!0,S.finalized=!0,ut.litElementHydrateSupport?.({LitElement:S});var he=ut.litElementPolyfillSupport;he?.({LitElement:S});(ut.litElementVersions??=[]).push("4.2.2");var qt=i=>(t,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(i,t)}):customElements.define(i,t)};var ue={attribute:!0,type:String,converter:D,reflect:!1,hasChanged:Q},me=(i=ue,t,e)=>{let{kind:r,metadata:s}=e,n=globalThis.litPropertyMetadata.get(s);if(n===void 0&&globalThis.litPropertyMetadata.set(s,n=new Map),r==="setter"&&((i=Object.create(i)).wrapped=!0),n.set(e.name,i),r==="accessor"){let{name:o}=e;return{set(a){let l=t.get.call(this);t.set.call(this,a),this.requestUpdate(o,l,i,!0,a)},init(a){return a!==void 0&&this.C(o,void 0,i,a),a}}}if(r==="setter"){let{name:o}=e;return function(a){let l=this[o];t.call(this,a),this.requestUpdate(o,l,i,!0,a)}}throw Error("Unsupported decorator location: "+r)};function F(i){return(t,e)=>typeof e=="object"?me(i,t,e):((r,s,n)=>{let o=s.hasOwnProperty(n);return s.constructor.createProperty(n,r),o?Object.getOwnPropertyDescriptor(s,n):void 0})(i,t,e)}function Bt(i){return F({...i,state:!0,attribute:!1})}var M={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 Gt={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 L=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],cr=L.map(i=>i.toLowerCase()),mt={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"};var Vt=H`
4
- :host {
5
- display: block;
6
- container-type: inline-size;
7
- font-family: var(
8
- --roxy-font-sans,
9
- system-ui,
10
- -apple-system,
11
- BlinkMacSystemFont,
12
- 'Segoe UI',
13
- Roboto,
14
- sans-serif
15
- );
16
- color: var(--roxy-fg, #0a0a0a);
17
- background: transparent;
18
- font-size: var(--roxy-text-base, 1rem);
19
- line-height: var(--roxy-leading-normal, 1.5);
20
- animation: roxy-fade-in var(--roxy-motion-duration, 200ms)
21
- var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;
22
- }
23
-
24
- *,
25
- *::before,
26
- *::after {
27
- box-sizing: border-box;
28
- }
29
-
30
- @keyframes roxy-fade-in {
31
- from {
32
- opacity: 0;
33
- transform: translateY(2px);
34
- }
35
- to {
36
- opacity: 1;
37
- transform: translateY(0);
38
- }
39
- }
40
-
41
- @media (prefers-reduced-motion: reduce) {
42
- :host {
43
- animation: none;
44
- }
45
- }
46
-
47
- .roxy-skeleton {
48
- background: linear-gradient(
49
- 90deg,
50
- var(--roxy-border, #e4e4e7) 0%,
51
- color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,
52
- var(--roxy-border, #e4e4e7) 100%
53
- );
54
- background-size: 200% 100%;
55
- animation: roxy-shimmer 1.4s ease-in-out infinite;
56
- border-radius: var(--roxy-radius-md, 8px);
57
- }
58
-
59
- @keyframes roxy-shimmer {
60
- 0% {
61
- background-position: 200% 0;
62
- }
63
- 100% {
64
- background-position: -200% 0;
65
- }
66
- }
67
-
68
- @media (prefers-reduced-motion: reduce) {
69
- .roxy-skeleton {
70
- animation: none;
71
- }
72
- }
73
-
74
- .roxy-empty {
75
- padding: var(--roxy-space-lg, 1.5rem);
76
- color: var(--roxy-muted, #71717a);
77
- text-align: center;
78
- font-size: var(--roxy-text-sm, 0.875rem);
79
- }
80
-
81
- :host(:focus-within) .roxy-card {
82
- outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
83
- outline-offset: 2px;
84
- }
85
-
86
- /* Force the text-style variant on every Unicode glyph in the component.
87
- * macOS and iOS substitute coloured emoji glyphs for the planetary and
88
- * gender Unicode code points (Mars, Venus, Mercury, etc.) when the
89
- * system colour-emoji font wins font selection. The text-style variant
90
- * keeps glyphs monochrome so they inherit the surrounding fill colour
91
- * and match the brand palette consistently across platforms.
92
- *
93
- * font-variant-emoji is part of CSS Fonts 4 (Safari 17+, Chrome 134+,
94
- * Firefox 139+). On older browsers the rule is silently ignored.
95
- */
96
- :host {
97
- font-variant-emoji: text;
98
- }
99
- `;function v(i){let t=i%360;return t<0?t+360:t}function gt(i){let t=v(i),e=Math.floor(t/30)%12,r=t%30,s=Math.floor(r),n=(r-s)*60,o=Math.floor(n),a=Math.round((n-o)*60);return{sign:L[e]??"Aries",signIndex:e,degree:s,minute:o,second:a}}function yt(i){return v(i+180)}function Ft(i,t){let e=v(i),r=v(t)-e;return r<0&&(r+=360),v(e+r/2)}function g(i,t,e,r){let s=r*Math.PI/180;return{x:i+e*Math.cos(s),y:t+e*Math.sin(s)}}function et(i,t=1){return typeof i!="number"||!Number.isFinite(i)?"":i.toFixed(t).replace(/\.?0+$/,"")}var ft={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function xt(i){return(i.type??"").toLowerCase().replace(/_/g,"-")}function $(i){return i?i.charAt(0).toUpperCase()+i.slice(1).toLowerCase():""}var bt=420,c=bt/2,N=164,$t=146,W=120,O=96,ge=178,ye=196,_=class extends S{constructor(){super(...arguments);this.data=null;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}render(){if(!this.data)return u`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],s=this.view;return u`<div class="wrap">
100
- <header>
101
- <h2 class="title">Natal chart</h2>
102
- ${this.data.birthDetails?u`<div class="meta">
103
- ${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}
104
- </div>`:h}
105
- </header>
106
- <div
107
- class="tablist"
108
- role="tablist"
109
- aria-label="Natal chart views"
110
- @keydown=${this.onTabKeyDown}
111
- >
112
- ${["wheel","grid"].map(n=>u`<button
113
- class="tab"
114
- role="tab"
115
- id="tab-${n}"
116
- aria-selected=${s===n?"true":"false"}
117
- aria-controls="panel-${n}"
118
- tabindex=${s===n?"0":"-1"}
119
- @click=${()=>{this.view=n}}
120
- >
121
- ${n==="wheel"?"Wheel":"Aspect grid"}
122
- </button>`)}
123
- </div>
124
- <div id="panel-${s}" role="tabpanel" aria-labelledby="tab-${s}">
125
- ${s==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}
126
- </div>
127
- <div class="legend">
128
- <span>${e.length} planets</span>
129
- <span>${r.length} aspects</span>
130
- ${this.data.houseSystem?u`<span>${this.data.houseSystem} houses</span>`:h}
131
- <span><span class="legend-swatch" style="background: var(--roxy-success)"></span>harmonious</span>
132
- <span><span class="legend-swatch" style="background: var(--roxy-danger)"></span>challenging</span>
133
- </div>
134
- ${this.renderDetails()}
135
- ${this.renderInterpretations()}
136
- </div>`}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.view=this.view==="wheel"?"grid":"wheel";let r=this.view;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}renderWheel(e,r){return u`<svg
137
- viewBox="0 0 ${bt} ${bt}"
138
- role="img"
139
- aria-label="Natal chart wheel with twelve houses, planets, and aspects"
140
- >
141
- <title>Natal chart wheel</title>
142
- <desc>
143
- Twelve zodiac sign segments around a circular wheel. Planet glyphs are
144
- placed at their ecliptic longitudes. Aspect lines connect related planets.
145
- </desc>
146
- <circle class="wheel-line" cx=${c} cy=${c} r=${N} stroke-width="1.5" />
147
- <circle class="wheel-line" cx=${c} cy=${c} r=${$t-14} stroke-width="0.8" />
148
- <circle class="wheel-line" cx=${c} cy=${c} r=${W} stroke-width="1" />
149
- <circle class="wheel-line" cx=${c} cy=${c} r=${O-16} stroke-width="0.5" />
150
- ${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()}
151
- ${this.renderHouseNumbers()} ${this.renderCuspDegrees()}
152
- ${this.renderAspects(e,r)} ${this.renderPlanets(e)}
153
- ${this.renderAngles()}
154
- </svg>`}renderAspectGrid(e,r){let s=e.map(o=>$(o.name)),n=new Map;for(let o of r){let a=[$(o.planet1),$(o.planet2)].sort().join("|");n.set(a,o)}return s.length===0?u`<p class="roxy-empty" role="status">No planets to grid</p>`:u`<div class="grid-scroll">
155
- <table class="aspect-grid" aria-label="Planet by planet aspect grid">
156
- <thead>
157
- <tr>
158
- <th></th>
159
- ${s.slice(0,-1).map(o=>{let a=M[o]??o.slice(0,2);return u`<th scope="col" title=${o}>${a}</th>`})}
160
- </tr>
161
- </thead>
162
- <tbody>
163
- ${s.slice(1).map((o,a)=>{let l=M[o]??o.slice(0,2);return u`<tr>
164
- <th scope="row" title=${o}>${l}</th>
165
- ${s.slice(0,a+1).map(d=>{let m=n.get([o,d].sort().join("|"));if(!m)return u`<td class="empty"></td>`;let p=xt(m),y=mt[p]??mt[p.replace(/-/g,"")]??p.slice(0,3),f=ft[p]??"aspect-other",b=et(m.orb,1);return u`<td class=${`cell ${f}`} title=${`${o} ${p} ${d}${b?` (orb ${b}\xB0)`:""}`}>
166
- <span class="asp">${y}</span>
167
- </td>`})}
168
- ${s.slice(a+1,-1).map(()=>u`<td class="empty"></td>`)}
169
- </tr>`})}
170
- </tbody>
171
- </table>
172
- </div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),s=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(yt(e),"DSC")];r!==null&&(s.push(this.renderAngleMark(r,"MC")),s.push(this.renderAngleMark(yt(r),"IC")));let n=this.data?.partOfFortune?.longitude;typeof n=="number"&&s.push(this.renderAngleMark(v(n),"PoF"));let o=this.data?.vertex?.longitude;return typeof o=="number"&&s.push(this.renderAngleMark(v(o),"Vtx")),s}renderAngleMark(e,r){let s=this.toAngle(e),n=g(c,c,N,s),o=g(c,c,ge,s),a=g(c,c,ye,s);return x`
173
- <g>
174
- <line class="angle-tick" x1=${n.x} y1=${n.y} x2=${o.x} y2=${o.y} />
175
- <text class="angle-marker" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${r}</text>
176
- </g>
177
- `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(s=>s.longitude):Array.from({length:12},(s,n)=>this.getAscendant()+n*30)).map(s=>{let n=this.toAngle(s),o=g(c,c,W,n),a=g(c,c,N,n);return x`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${a.x} y2=${a.y} stroke-width="0.8" />`})}renderSigns(){return L.map((e,r)=>{let s=this.toAngle(r*30+15),n=g(c,c,$t,s);return x`<text class="sign-glyph" x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central">${Gt[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((s,n)=>{let o=e[(n+1)%12],a=Ft(s.longitude,o?o.longitude:s.longitude+30),l=g(c,c,W-12,this.toAngle(a));return x`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${s.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(s,n)=>{let o=this.toAngle(n*30+15),a=g(c,c,W-12,o),l=(n-r+12)%12+1;return x`<text class="house-num" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let s=this.toAngle(r),n=r%30===0,o=n?$t-14:N-5,a=g(c,c,o,s),l=g(c,c,N,s);e.push(x`<line class=${n?"tick tick-major":"tick"} x1=${a.x} y1=${a.y} x2=${l.x} y2=${l.y} stroke-width=${n?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?h:e.map(r=>{let s=this.toAngle(r.longitude),n=g(c,c,W+9,s),o=gt(r.longitude);return x`<text class="cusp-deg" x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central">${o.degree}°${String(o.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let s=e.filter(o=>Number.isFinite(o.longitude)).map(o=>({p:o,trueLon:v(o.longitude),displayLon:v(o.longitude)})).sort((o,a)=>o.trueLon-a.trueLon);for(let o=1;o<s.length;o++){let a=s[o-1],l=s[o];if(!a||!l)continue;let d=a.displayLon+7;l.displayLon<d&&(l.displayLon=d)}let n=s[s.length-1];if(n&&n.displayLon>360){let o=n.displayLon-360;for(let a of s)a.displayLon-=o}return s.map(({p:o,trueLon:a,displayLon:l})=>{let d=this.toAngle(a),m=this.toAngle(l),p=g(c,c,O,m),y=g(c,c,O-13,m),f=g(c,c,N-4,d),b=g(c,c,O+8,m),Wt=M[$(o.name)]??o.name.slice(0,2),vt=gt(o.longitude),At=o.isRetrograde===!0,_t=`${vt.degree}\xB0${String(vt.minute).padStart(2,"0")}'`,Kt=Math.abs(l-a)>.5;return x`<g>
178
- ${Kt?x`<line class="planet-leader" x1=${f.x} y1=${f.y} x2=${b.x} y2=${b.y} />`:h}
179
- <text class="planet-glyph" x=${p.x} y=${p.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}${At?" retrograde":""} - ${_t} ${o.sign??""}</title>${Wt}</text>
180
- <text class="planet-deg" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">${_t}${At?x`<tspan class="retro"> ℞</tspan>`:h}</text>
181
- </g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return h;let s=e?.retrogradePlanets??[];return u`<div class="details">
182
- ${e?.dominantElement||e?.dominantModality?u`<div class="pill-row">
183
- ${e.dominantElement?u`<span class="pill">Dominant element: ${e.dominantElement}</span>`:h}
184
- ${e.dominantModality?u`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:h}
185
- </div>`:h}
186
- ${r?u`<div class="pill-row">
187
- <span class="pill pill--success">Harmonious ${r.harmonious}</span>
188
- <span class="pill pill--danger">Challenging ${r.challenging}</span>
189
- <span class="pill pill--muted">Neutral ${r.neutral}</span>
190
- </div>`:h}
191
- ${s.length>0?u`<div class="pill-row">
192
- ${s.map(n=>{let o=M[n]??n.slice(0,2);return u`<span class="pill pill--muted">${o} ${n} R</span>`})}
193
- </div>`:h}
194
- ${r?.summary?u`<p class="summary">${r.summary}</p>`:h}
195
- ${this.renderElementModalityGrid()}
196
- </div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return h;let r=["Fire","Earth","Air","Water"],s=["Cardinal","Fixed","Mutable"],n=L,o={};for(let a of r)o[a]={Cardinal:[],Fixed:[],Mutable:[]};for(let a of e){let l=n.indexOf($(a.sign??""));if(l<0)continue;let d=r[l%4],m=s[l%3],p=M[$(a.name)]??$(a.name).slice(0,2);o[d]?.[m]?.push(p)}return u`<table class="em-grid" aria-label="Element and modality distribution">
197
- <thead>
198
- <tr>
199
- <th></th>
200
- ${s.map(a=>u`<th scope="col">${a.slice(0,3)}</th>`)}
201
- <th scope="col">Total</th>
202
- </tr>
203
- </thead>
204
- <tbody>
205
- ${r.map(a=>{let l=s.reduce((d,m)=>d+(o[a]?.[m]?.length??0),0);return u`<tr>
206
- <th scope="row">${a}</th>
207
- ${s.map(d=>u`<td>${(o[a]?.[d]??[]).join(" ")}</td>`)}
208
- <td class="em-total">${l}</td>
209
- </tr>`})}
210
- <tr>
211
- <th scope="row">Total</th>
212
- ${s.map(a=>u`<td class="em-total">${r.reduce((l,d)=>l+(o[d]?.[a]?.length??0),0)}</td>`)}
213
- <td class="em-total">${e.length}</td>
214
- </tr>
215
- </tbody>
216
- </table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?h:u`<section class="interpretations">
217
- <h3>Planet readings</h3>
218
- ${e.map((r,s)=>{let n=r.interpretation,o=M[$(r.name)]??"",a=et(r.degree??0,1);return u`<details class="interp-card" name="natal-planet-readings" ?open=${s===0}>
219
- <summary>${o} ${r.name} <small>${r.sign??""} ${a}</small></summary>
220
- <div class="interp-body">
221
- ${n.summary?u`<p class="interp-summary">${n.summary}</p>`:h}
222
- ${n.detailed?u`<p class="interp-detail">${n.detailed}</p>`:h}
223
- ${n.keywords?.length?u`<div class="interp-keywords">${n.keywords.map(l=>u`<span class="kw">${l}</span>`)}</div>`:h}
224
- </div>
225
- </details>`})}
226
- </section>`}renderAspects(e,r){let s=new Map;for(let n of e){if(typeof n.longitude!="number")continue;let o=$(n.name);o&&s.set(o,n.longitude)}return r.map(n=>{let o=s.get($(n.planet1)),a=s.get($(n.planet2));if(o===void 0||a===void 0)return h;let l=g(c,c,O-18,this.toAngle(o)),d=g(c,c,O-18,this.toAngle(a)),m=xt(n),p=ft[m]??"aspect-other",y=et(n.orb,1);return x`<line class=${`aspect ${p}`} x1=${l.x} y1=${l.y} x2=${d.x} y2=${d.y}><title>${n.planet1} ${m||""} ${n.planet2}${y?` (orb ${y}\xB0)`:""}</title></line>`})}};_.styles=[Vt,H`
227
- .wrap {
228
- width: 100%;
229
- display: grid;
230
- gap: var(--roxy-space-md, 1rem);
231
- }
232
-
233
- .title {
234
- font-size: var(--roxy-text-lg, 1.125rem);
235
- font-weight: var(--roxy-weight-bold, 600);
236
- margin: 0;
237
- color: var(--roxy-primary, #0f172a);
238
- }
239
-
240
- .meta {
241
- color: var(--roxy-muted, #71717a);
242
- font-size: var(--roxy-text-sm, 0.875rem);
243
- }
244
-
245
- svg {
246
- display: block;
247
- width: 100%;
248
- max-width: 560px;
249
- aspect-ratio: 1 / 1;
250
- height: auto;
251
- margin: 0 auto;
252
- }
253
-
254
- .wheel-line {
255
- fill: none;
256
- stroke: var(--roxy-border, #e4e4e7);
257
- }
258
-
259
- .sign-glyph {
260
- fill: var(--roxy-secondary, #475569);
261
- font-size: 14px;
262
- font-family: var(--roxy-font-sans);
263
- }
264
-
265
- .planet-glyph {
266
- fill: var(--roxy-accent, #f59e0b);
267
- font-size: 14px;
268
- font-weight: 600;
269
- font-family: var(--roxy-font-sans);
270
- }
271
-
272
- .planet-deg {
273
- fill: var(--roxy-fg, #0a0a0a);
274
- font-size: 7px;
275
- font-family: var(--roxy-font-sans);
276
- }
277
-
278
- /* Below 480px the chart container shrinks to ~320px on phones.
279
- * Bump in-SVG text up proportionally so the 7px degree band
280
- * does not collapse below ~6px on screen.
281
- */
282
- @container (max-width: 480px) {
283
- .sign-glyph,
284
- .planet-glyph {
285
- font-size: 18px;
286
- }
287
- .planet-deg {
288
- font-size: 10px;
289
- }
290
- .house-num {
291
- font-size: 12px;
292
- }
293
- }
294
-
295
- .planet-deg .retro {
296
- fill: var(--roxy-danger, #dc2626);
297
- }
298
-
299
- .planet-leader {
300
- stroke: var(--roxy-accent, #f59e0b);
301
- stroke-width: 0.5;
302
- opacity: 0.55;
303
- }
304
-
305
- .house-num {
306
- fill: var(--roxy-muted, #71717a);
307
- font-size: 9px;
308
- font-family: var(--roxy-font-sans);
309
- }
310
-
311
- .cusp-deg {
312
- fill: var(--roxy-muted, #71717a);
313
- font-size: 6px;
314
- font-family: var(--roxy-font-sans);
315
- }
316
-
317
- .tick {
318
- stroke: var(--roxy-border, #e4e4e7);
319
- }
320
- .tick-major {
321
- stroke: var(--roxy-secondary, #475569);
322
- }
323
-
324
- .aspect {
325
- stroke-width: 0.8;
326
- fill: none;
327
- opacity: 0.55;
328
- }
329
- .aspect-trine,
330
- .aspect-sextile {
331
- stroke: var(--roxy-success, #16a34a);
332
- }
333
- .aspect-square,
334
- .aspect-opposition {
335
- stroke: var(--roxy-danger, #dc2626);
336
- }
337
- .aspect-conjunction {
338
- stroke: var(--roxy-accent-fg, #b45309);
339
- }
340
- .aspect-other {
341
- stroke: var(--roxy-muted, #71717a);
342
- opacity: 0.4;
343
- }
344
-
345
- .angle-marker {
346
- fill: var(--roxy-accent-fg, #b45309);
347
- font-size: 10px;
348
- font-weight: 700;
349
- font-family: var(--roxy-font-sans);
350
- letter-spacing: 0.04em;
351
- }
352
- .angle-tick {
353
- stroke: var(--roxy-accent-fg, #b45309);
354
- stroke-width: 1.5;
355
- }
356
-
357
- .legend {
358
- font-size: var(--roxy-text-xs, 0.75rem);
359
- color: var(--roxy-muted, #71717a);
360
- display: flex;
361
- flex-wrap: wrap;
362
- gap: var(--roxy-space-md, 1rem);
363
- }
364
- .legend-swatch {
365
- display: inline-block;
366
- width: 8px;
367
- height: 8px;
368
- border-radius: 50%;
369
- margin-right: 4px;
370
- vertical-align: middle;
371
- }
372
-
373
- .tablist {
374
- display: flex;
375
- gap: 2px;
376
- border-bottom: 2px solid var(--roxy-border, #e4e4e7);
377
- }
378
- .tab {
379
- padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
380
- font-size: var(--roxy-text-sm, 0.875rem);
381
- background: none;
382
- border: none;
383
- border-bottom: 2px solid transparent;
384
- margin-bottom: -2px;
385
- cursor: pointer;
386
- color: var(--roxy-muted, #71717a);
387
- font-family: inherit;
388
- transition: color var(--roxy-motion-duration, 200ms) var(--roxy-motion-easing, ease);
389
- }
390
- .tab[aria-selected='true'] {
391
- color: var(--roxy-accent-fg, #b45309);
392
- border-bottom-color: var(--roxy-accent, #f59e0b);
393
- font-weight: var(--roxy-weight-bold, 600);
394
- }
395
- .tab:hover:not([aria-selected='true']) {
396
- color: var(--roxy-fg, #0a0a0a);
397
- }
398
-
399
- .grid-scroll {
400
- overflow-x: auto;
401
- -webkit-overflow-scrolling: touch;
402
- }
403
- table.aspect-grid {
404
- border-collapse: collapse;
405
- font-size: var(--roxy-text-xs, 0.75rem);
406
- margin: 0 auto;
407
- }
408
- table.aspect-grid th,
409
- table.aspect-grid td {
410
- width: 1.6rem;
411
- height: 1.6rem;
412
- text-align: center;
413
- border: 1px solid var(--roxy-border, #e4e4e7);
414
- padding: 0;
415
- }
416
- table.aspect-grid th {
417
- color: var(--roxy-secondary, #475569);
418
- font-weight: var(--roxy-weight-bold, 600);
419
- }
420
- table.aspect-grid td.cell {
421
- cursor: default;
422
- }
423
- table.aspect-grid td.empty {
424
- background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 18%, transparent);
425
- }
426
- table.aspect-grid td .asp {
427
- font-size: 0.95em;
428
- line-height: 1;
429
- }
430
- table.aspect-grid td.aspect-trine .asp,
431
- table.aspect-grid td.aspect-sextile .asp {
432
- color: var(--roxy-success, #16a34a);
433
- }
434
- table.aspect-grid td.aspect-square .asp,
435
- table.aspect-grid td.aspect-opposition .asp {
436
- color: var(--roxy-danger, #dc2626);
437
- }
438
- table.aspect-grid td.aspect-conjunction .asp {
439
- color: var(--roxy-accent-fg, #b45309);
440
- }
441
- table.aspect-grid td.aspect-other .asp {
442
- color: var(--roxy-muted, #71717a);
443
- }
444
-
445
- .details {
446
- margin-top: var(--roxy-space-md, 1rem);
447
- }
448
-
449
- .pill-row {
450
- display: flex;
451
- flex-wrap: wrap;
452
- gap: var(--roxy-space-xs, 0.25rem);
453
- margin-bottom: var(--roxy-space-xs, 0.25rem);
454
- }
455
-
456
- .pill {
457
- padding: 2px 8px;
458
- border-radius: var(--roxy-radius-sm, 4px);
459
- font-size: var(--roxy-text-xs, 0.75rem);
460
- background: color-mix(in srgb, var(--roxy-fg, #0f172a) 8%, transparent);
461
- color: var(--roxy-fg, #0f172a);
462
- }
463
-
464
- .pill--success {
465
- background: color-mix(in srgb, var(--roxy-success, #16a34a) 15%, transparent);
466
- color: var(--roxy-success, #16a34a);
467
- }
468
-
469
- .pill--danger {
470
- background: color-mix(in srgb, var(--roxy-danger, #dc2626) 15%, transparent);
471
- color: var(--roxy-danger, #dc2626);
472
- }
473
-
474
- .pill--muted {
475
- background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
476
- color: var(--roxy-fg, #0a0a0a);
477
- }
478
-
479
- .summary {
480
- color: var(--roxy-fg, #0f172a);
481
- font-size: var(--roxy-text-sm, 0.875rem);
482
- margin: var(--roxy-space-md, 1rem) 0;
483
- }
484
-
485
- .em-grid {
486
- border-collapse: collapse;
487
- font-size: var(--roxy-text-xs, 0.75rem);
488
- width: 100%;
489
- }
490
- .em-grid th,
491
- .em-grid td {
492
- border: 1px solid var(--roxy-border, #e4e4e7);
493
- padding: 3px 5px;
494
- text-align: center;
495
- vertical-align: middle;
496
- }
497
- .em-grid th {
498
- color: var(--roxy-muted, #71717a);
499
- font-weight: var(--roxy-weight-bold, 600);
500
- text-transform: uppercase;
501
- letter-spacing: 0.04em;
502
- }
503
- .em-grid th[scope='row'] {
504
- text-align: left;
505
- }
506
- .em-grid td {
507
- color: var(--roxy-accent, #f59e0b);
508
- font-size: 0.95em;
509
- line-height: 1.4;
510
- min-width: 1.4rem;
511
- }
512
- .em-grid .em-total {
513
- color: var(--roxy-fg, #0a0a0a);
514
- font-weight: var(--roxy-weight-bold, 600);
515
- background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 25%, transparent);
516
- }
517
-
518
- .interpretations {
519
- margin-top: var(--roxy-space-md, 1rem);
520
- }
521
- .interpretations h3 {
522
- font-size: var(--roxy-text-sm, 0.875rem);
523
- font-weight: 600;
524
- color: var(--roxy-muted, #71717a);
525
- text-transform: uppercase;
526
- letter-spacing: 0.06em;
527
- margin: 0 0 var(--roxy-space-sm, 0.5rem);
528
- }
529
- .interp-card {
530
- border: 1px solid var(--roxy-border, #e4e4e7);
531
- border-radius: var(--roxy-radius-md, 8px);
532
- padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
533
- margin-bottom: var(--roxy-space-xs, 0.25rem);
534
- }
535
- .interp-card summary {
536
- cursor: pointer;
537
- font-weight: 500;
538
- color: var(--roxy-fg, #0f172a);
539
- }
540
- .interp-card summary small {
541
- color: var(--roxy-muted, #71717a);
542
- margin-left: 0.5em;
543
- font-weight: 400;
544
- }
545
- .interp-body {
546
- margin-top: var(--roxy-space-xs, 0.25rem);
547
- color: var(--roxy-fg, #0f172a);
548
- font-size: var(--roxy-text-sm, 0.875rem);
549
- }
550
- .interp-keywords {
551
- display: flex;
552
- flex-wrap: wrap;
553
- gap: 0.25rem;
554
- margin-top: 0.5rem;
555
- }
556
- .interp-keywords .kw {
557
- padding: 1px 8px;
558
- border-radius: 9999px;
559
- background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
560
- color: var(--roxy-accent-fg, #b45309);
561
- font-size: var(--roxy-text-xs, 0.75rem);
562
- }
563
- `],U([F({attribute:!1})],_.prototype,"data",2),U([F({type:String,attribute:"house-system",reflect:!0})],_.prototype,"houseSystem",2),U([Bt()],_.prototype,"view",2),_=U([qt("roxy-natal-chart")],_);return Xt(fe);})();
1
+ "use strict";var RoxyUI_natal_chart=(()=>{var K=Object.defineProperty;var wt=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ee=Object.prototype.hasOwnProperty;var re=(i,t)=>{for(var e in t)K(i,e,{get:t[e],enumerable:!0})},se=(i,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of te(t))!ee.call(i,s)&&s!==e&&K(i,s,{get:()=>t[s],enumerable:!(r=wt(t,s))||r.enumerable});return i};var ne=i=>se(K({},"__esModule",{value:!0}),i),U=(i,t,e,r)=>{for(var s=r>1?void 0:r?wt(t,e):t,o=i.length-1,n;o>=0;o--)(n=i[o])&&(s=(r?n(t,e,s):n(s))||s);return r&&s&&K(t,e,s),s};var Se={};re(Se,{RoxyNatalChart:()=>S});var Y=globalThis,J=Y.ShadowRoot&&(Y.ShadyCSS===void 0||Y.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,st=Symbol(),Et=new WeakMap,z=class{constructor(t,e,r){if(this._$cssResult$=!0,r!==st)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o,e=this.t;if(J&&t===void 0){let r=e!==void 0&&e.length===1;r&&(t=Et.get(e)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),r&&Et.set(e,t))}return t}toString(){return this.cssText}},Pt=i=>new z(typeof i=="string"?i:i+"",void 0,st),A=(i,...t)=>{let e=i.length===1?i[0]:t.reduce((r,s,o)=>r+(n=>{if(n._$cssResult$===!0)return n.cssText;if(typeof n=="number")return n;throw Error("Value passed to 'css' function must be a 'css' function result: "+n+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(s)+i[o+1],i[0]);return new z(e,i,st)},kt=(i,t)=>{if(J)i.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of t){let r=document.createElement("style"),s=Y.litNonce;s!==void 0&&r.setAttribute("nonce",s),r.textContent=e.cssText,i.appendChild(r)}},nt=J?i=>i:i=>i instanceof CSSStyleSheet?(t=>{let e="";for(let r of t.cssRules)e+=r.cssText;return Pt(e)})(i):i;var{is:oe,defineProperty:ie,getOwnPropertyDescriptor:ae,getOwnPropertyNames:le,getOwnPropertySymbols:ce,getPrototypeOf:de}=Object,Z=globalThis,Ct=Z.trustedTypes,pe=Ct?Ct.emptyScript:"",he=Z.reactiveElementPolyfillSupport,I=(i,t)=>i,D={toAttribute(i,t){switch(t){case Boolean:i=i?pe:null;break;case Object:case Array:i=i==null?i:JSON.stringify(i)}return i},fromAttribute(i,t){let e=i;switch(t){case Boolean:e=i!==null;break;case Number:e=i===null?null:Number(i);break;case Object:case Array:try{e=JSON.parse(i)}catch{e=null}}return e}},X=(i,t)=>!oe(i,t),Tt={attribute:!0,type:String,converter:D,reflect:!1,useDefault:!1,hasChanged:X};Symbol.metadata??=Symbol("metadata"),Z.litPropertyMetadata??=new WeakMap;var _=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=Tt){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){let r=Symbol(),s=this.getPropertyDescriptor(t,r,e);s!==void 0&&ie(this.prototype,t,s)}}static getPropertyDescriptor(t,e,r){let{get:s,set:o}=ae(this.prototype,t)??{get(){return this[e]},set(n){this[e]=n}};return{get:s,set(n){let a=s?.call(this);o?.call(this,n),this.requestUpdate(t,a,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??Tt}static _$Ei(){if(this.hasOwnProperty(I("elementProperties")))return;let t=de(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(I("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(I("properties"))){let e=this.properties,r=[...le(e),...ce(e)];for(let s of r)this.createProperty(s,e[s])}let t=this[Symbol.metadata];if(t!==null){let e=litPropertyMetadata.get(t);if(e!==void 0)for(let[r,s]of e)this.elementProperties.set(r,s)}this._$Eh=new Map;for(let[e,r]of this.elementProperties){let s=this._$Eu(e,r);s!==void 0&&this._$Eh.set(s,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){let e=[];if(Array.isArray(t)){let r=new Set(t.flat(1/0).reverse());for(let s of r)e.unshift(nt(s))}else t!==void 0&&e.push(nt(t));return e}static _$Eu(t,e){let r=e.attribute;return r===!1?void 0:typeof r=="string"?r:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){let t=new Map,e=this.constructor.elementProperties;for(let r of e.keys())this.hasOwnProperty(r)&&(t.set(r,this[r]),delete this[r]);t.size>0&&(this._$Ep=t)}createRenderRoot(){let t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return kt(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,r){this._$AK(t,r)}_$ET(t,e){let r=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,r);if(s!==void 0&&r.reflect===!0){let o=(r.converter?.toAttribute!==void 0?r.converter:D).toAttribute(e,r.type);this._$Em=t,o==null?this.removeAttribute(s):this.setAttribute(s,o),this._$Em=null}}_$AK(t,e){let r=this.constructor,s=r._$Eh.get(t);if(s!==void 0&&this._$Em!==s){let o=r.getPropertyOptions(s),n=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:D;this._$Em=s;let a=n.fromAttribute(e,o.type);this[s]=a??this._$Ej?.get(s)??a,this._$Em=null}}requestUpdate(t,e,r,s=!1,o){if(t!==void 0){let n=this.constructor;if(s===!1&&(o=this[t]),r??=n.getPropertyOptions(t),!((r.hasChanged??X)(o,e)||r.useDefault&&r.reflect&&o===this._$Ej?.get(t)&&!this.hasAttribute(n._$Eu(t,r))))return;this.C(t,e,r)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,e,{useDefault:r,reflect:s,wrapped:o},n){r&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,n??e??this[t]),o!==!0||n!==void 0)||(this._$AL.has(t)||(this.hasUpdated||r||(e=void 0),this._$AL.set(t,e)),s===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[s,o]of this._$Ep)this[s]=o;this._$Ep=void 0}let r=this.constructor.elementProperties;if(r.size>0)for(let[s,o]of r){let{wrapped:n}=o,a=this[s];n!==!0||this._$AL.has(s)||a===void 0||this.C(s,void 0,o,a)}}let t=!1,e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(r=>r.hostUpdate?.()),this.update(e)):this._$EM()}catch(r){throw t=!1,this._$EM(),r}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(t){}firstUpdated(t){}};_.elementStyles=[],_.shadowRootOptions={mode:"open"},_[I("elementProperties")]=new Map,_[I("finalized")]=new Map,he?.({ReactiveElement:_}),(Z.reactiveElementVersions??=[]).push("2.1.2");var pt=globalThis,Mt=i=>i,Q=pt.trustedTypes,Rt=Q?Q.createPolicy("lit-html",{createHTML:i=>i}):void 0,zt="$lit$",w=`lit$${Math.random().toFixed(9).slice(2)}$`,It="?"+w,ue=`<${It}>`,C=document,q=()=>C.createComment(""),B=i=>i===null||typeof i!="object"&&typeof i!="function",ht=Array.isArray,me=i=>ht(i)||typeof i?.[Symbol.iterator]=="function",ot=`[
2
+ \f\r]`,j=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Lt=/-->/g,Nt=/>/g,P=RegExp(`>|${ot}(?:([^\\s"'>=/]+)(${ot}*=${ot}*(?:[^
3
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),Ot=/'/g,Ht=/"/g,Dt=/^(?:script|style|textarea|title)$/i,ut=i=>(t,...e)=>({_$litType$:i,strings:t,values:e}),u=ut(1),x=ut(2),Te=ut(3),T=Symbol.for("lit-noChange"),h=Symbol.for("lit-nothing"),Ut=new WeakMap,k=C.createTreeWalker(C,129);function jt(i,t){if(!ht(i)||!i.hasOwnProperty("raw"))throw Error("invalid template strings array");return Rt!==void 0?Rt.createHTML(t):t}var ge=(i,t)=>{let e=i.length-1,r=[],s,o=t===2?"<svg>":t===3?"<math>":"",n=j;for(let a=0;a<e;a++){let l=i[a],p,m,d=-1,g=0;for(;g<l.length&&(n.lastIndex=g,m=n.exec(l),m!==null);)g=n.lastIndex,n===j?m[1]==="!--"?n=Lt:m[1]!==void 0?n=Nt:m[2]!==void 0?(Dt.test(m[2])&&(s=RegExp("</"+m[2],"g")),n=P):m[3]!==void 0&&(n=P):n===P?m[0]===">"?(n=s??j,d=-1):m[1]===void 0?d=-2:(d=n.lastIndex-m[2].length,p=m[1],n=m[3]===void 0?P:m[3]==='"'?Ht:Ot):n===Ht||n===Ot?n=P:n===Lt||n===Nt?n=j:(n=P,s=void 0);let f=n===P&&i[a+1].startsWith("/>")?" ":"";o+=n===j?l+ue:d>=0?(r.push(p),l.slice(0,d)+zt+l.slice(d)+w+f):l+w+(d===-2?a:f)}return[jt(i,o+(i[e]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),r]},G=class i{constructor({strings:t,_$litType$:e},r){let s;this.parts=[];let o=0,n=0,a=t.length-1,l=this.parts,[p,m]=ge(t,e);if(this.el=i.createElement(p,r),k.currentNode=this.el.content,e===2||e===3){let d=this.el.content.firstChild;d.replaceWith(...d.childNodes)}for(;(s=k.nextNode())!==null&&l.length<a;){if(s.nodeType===1){if(s.hasAttributes())for(let d of s.getAttributeNames())if(d.endsWith(zt)){let g=m[n++],f=s.getAttribute(d).split(w),b=/([.?@])?(.*)/.exec(g);l.push({type:1,index:o,name:b[2],strings:f,ctor:b[1]==="."?at:b[1]==="?"?lt:b[1]==="@"?ct:L}),s.removeAttribute(d)}else d.startsWith(w)&&(l.push({type:6,index:o}),s.removeAttribute(d));if(Dt.test(s.tagName)){let d=s.textContent.split(w),g=d.length-1;if(g>0){s.textContent=Q?Q.emptyScript:"";for(let f=0;f<g;f++)s.append(d[f],q()),k.nextNode(),l.push({type:2,index:++o});s.append(d[g],q())}}}else if(s.nodeType===8)if(s.data===It)l.push({type:2,index:o});else{let d=-1;for(;(d=s.data.indexOf(w,d+1))!==-1;)l.push({type:7,index:o}),d+=w.length-1}o++}}static createElement(t,e){let r=C.createElement("template");return r.innerHTML=t,r}};function R(i,t,e=i,r){if(t===T)return t;let s=r!==void 0?e._$Co?.[r]:e._$Cl,o=B(t)?void 0:t._$litDirective$;return s?.constructor!==o&&(s?._$AO?.(!1),o===void 0?s=void 0:(s=new o(i),s._$AT(i,e,r)),r!==void 0?(e._$Co??=[])[r]=s:e._$Cl=s),s!==void 0&&(t=R(i,s._$AS(i,t.values),s,r)),t}var it=class{constructor(t,e){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){let{el:{content:e},parts:r}=this._$AD,s=(t?.creationScope??C).importNode(e,!0);k.currentNode=s;let o=k.nextNode(),n=0,a=0,l=r[0];for(;l!==void 0;){if(n===l.index){let p;l.type===2?p=new V(o,o.nextSibling,this,t):l.type===1?p=new l.ctor(o,l.name,l.strings,this,t):l.type===6&&(p=new dt(o,this,t)),this._$AV.push(p),l=r[++a]}n!==l?.index&&(o=k.nextNode(),n++)}return k.currentNode=C,s}p(t){let e=0;for(let r of this._$AV)r!==void 0&&(r.strings!==void 0?(r._$AI(t,r,e),e+=r.strings.length-2):r._$AI(t[e])),e++}},V=class i{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,e,r,s){this.type=2,this._$AH=h,this._$AN=void 0,this._$AA=t,this._$AB=e,this._$AM=r,this.options=s,this._$Cv=s?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode,e=this._$AM;return e!==void 0&&t?.nodeType===11&&(t=e.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,e=this){t=R(this,t,e),B(t)?t===h||t==null||t===""?(this._$AH!==h&&this._$AR(),this._$AH=h):t!==this._$AH&&t!==T&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):me(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==h&&B(this._$AH)?this._$AA.nextSibling.data=t:this.T(C.createTextNode(t)),this._$AH=t}$(t){let{values:e,_$litType$:r}=t,s=typeof r=="number"?this._$AC(t):(r.el===void 0&&(r.el=G.createElement(jt(r.h,r.h[0]),this.options)),r);if(this._$AH?._$AD===s)this._$AH.p(e);else{let o=new it(s,this),n=o.u(this.options);o.p(e),this.T(n),this._$AH=o}}_$AC(t){let e=Ut.get(t.strings);return e===void 0&&Ut.set(t.strings,e=new G(t)),e}k(t){ht(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,r,s=0;for(let o of t)s===e.length?e.push(r=new i(this.O(q()),this.O(q()),this,this.options)):r=e[s],r._$AI(o),s++;s<e.length&&(this._$AR(r&&r._$AB.nextSibling,s),e.length=s)}_$AR(t=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);t!==this._$AB;){let r=Mt(t).nextSibling;Mt(t).remove(),t=r}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}},L=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,e,r,s,o){this.type=1,this._$AH=h,this._$AN=void 0,this.element=t,this.name=e,this._$AM=s,this.options=o,r.length>2||r[0]!==""||r[1]!==""?(this._$AH=Array(r.length-1).fill(new String),this.strings=r):this._$AH=h}_$AI(t,e=this,r,s){let o=this.strings,n=!1;if(o===void 0)t=R(this,t,e,0),n=!B(t)||t!==this._$AH&&t!==T,n&&(this._$AH=t);else{let a=t,l,p;for(t=o[0],l=0;l<o.length-1;l++)p=R(this,a[r+l],e,l),p===T&&(p=this._$AH[l]),n||=!B(p)||p!==this._$AH[l],p===h?t=h:t!==h&&(t+=(p??"")+o[l+1]),this._$AH[l]=p}n&&!s&&this.j(t)}j(t){t===h?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}},at=class extends L{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===h?void 0:t}},lt=class extends L{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==h)}},ct=class extends L{constructor(t,e,r,s,o){super(t,e,r,s,o),this.type=5}_$AI(t,e=this){if((t=R(this,t,e,0)??h)===T)return;let r=this._$AH,s=t===h&&r!==h||t.capture!==r.capture||t.once!==r.once||t.passive!==r.passive,o=t!==h&&(r===h||s);s&&this.element.removeEventListener(this.name,this,r),o&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},dt=class{constructor(t,e,r){this.element=t,this.type=6,this._$AN=void 0,this._$AM=e,this.options=r}get _$AU(){return this._$AM._$AU}_$AI(t){R(this,t)}};var ye=pt.litHtmlPolyfillSupport;ye?.(G,V),(pt.litHtmlVersions??=[]).push("3.3.2");var qt=(i,t,e)=>{let r=e?.renderBefore??t,s=r._$litPart$;if(s===void 0){let o=e?.renderBefore??null;r._$litPart$=s=new V(t.insertBefore(q(),o),o,void 0,e??{})}return s._$AI(i),s};var mt=globalThis,E=class extends _{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=qt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return T}};E._$litElement$=!0,E.finalized=!0,mt.litElementHydrateSupport?.({LitElement:E});var fe=mt.litElementPolyfillSupport;fe?.({LitElement:E});(mt.litElementVersions??=[]).push("4.2.2");var Bt=i=>(t,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(i,t)}):customElements.define(i,t)};var xe={attribute:!0,type:String,converter:D,reflect:!1,hasChanged:X},$e=(i=xe,t,e)=>{let{kind:r,metadata:s}=e,o=globalThis.litPropertyMetadata.get(s);if(o===void 0&&globalThis.litPropertyMetadata.set(s,o=new Map),r==="setter"&&((i=Object.create(i)).wrapped=!0),o.set(e.name,i),r==="accessor"){let{name:n}=e;return{set(a){let l=t.get.call(this);t.set.call(this,a),this.requestUpdate(n,l,i,!0,a)},init(a){return a!==void 0&&this.C(n,void 0,i,a),a}}}if(r==="setter"){let{name:n}=e;return function(a){let l=this[n];t.call(this,a),this.requestUpdate(n,l,i,!0,a)}}throw Error("Unsupported decorator location: "+r)};function F(i){return(t,e)=>typeof e=="object"?$e(i,t,e):((r,s,o)=>{let n=s.hasOwnProperty(o);return s.constructor.createProperty(o,r),n?Object.getOwnPropertyDescriptor(s,o):void 0})(i,t,e)}function Gt(i){return F({...i,state:!0,attribute:!1})}var M={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 Vt={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 N=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],yr=N.map(i=>i.toLowerCase()),gt={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"};var Ft=A`: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}*,: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)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;function v(i){let t=i%360;return t<0?t+360:t}function yt(i){let t=v(i),e=Math.floor(t/30)%12,r=t%30,s=Math.floor(r),o=(r-s)*60,n=Math.floor(o),a=Math.round((o-n)*60);return{sign:N[e]??"Aries",signIndex:e,degree:s,minute:n,second:a}}function ft(i){return v(i+180)}function Wt(i,t){let e=v(i),r=v(t)-e;return r<0&&(r+=360),v(e+r/2)}function y(i,t,e,r){let s=r*Math.PI/180;return{x:i+e*Math.cos(s),y:t+e*Math.sin(s)}}function Kt(){return u`<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 Yt=A`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 et(i,t=1){return typeof i!="number"||!Number.isFinite(i)?"":i.toFixed(t).replace(/\.?0+$/,"")}var xt={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function $t(i){return(i.type??"").toLowerCase().replace(/_/g,"-")}var be="roxy-data";function ve(i){return i.nodeName==="SCRIPT"&&i.getAttribute("type")==="application/json"}var rt=class{constructor(t){this.host=t,t.addController(this)}hostConnected(){if(this.host.data!=null)return;let t=this.read();t!==void 0&&(this.host.data=t,this.host.requestUpdate())}read(){let t=this.findInlineScript();return t?this.parse(t.textContent):void 0}findInlineScript(){for(let t of Array.from(this.host.children))if(ve(t)&&t.classList.contains(be))return t;return null}parse(t){if(t?.trim())try{return JSON.parse(t)}catch{return}}};function $(i){return i?i.charAt(0).toUpperCase()+i.slice(1).toLowerCase():""}var Jt=A`.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-fg,#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 Zt(i){let{items:t,active:e,onSelect:r,label:s,idPrefix:o,controls:n=!1}=i;return u`<div class="roxy-tablist" role="tablist" aria-label="${s}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let p=t.findIndex(f=>f.id===e);if(p===-1)return;let m=l.key==="ArrowRight"?1:-1,d=t[(p+m+t.length)%t.length];if(!d)return;r(d.id);let g=l.currentTarget.getRootNode();requestAnimationFrame(()=>{g.querySelector(`#${o}-tab-${d.id}`)?.focus()})}}">${t.map(l=>u`<button type="button" class="roxy-tab" role="tab" id="${o}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${n&&e===l.id?`${o}-panel-${l.id}`:h}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var vt=420,c=vt/2,O=164,bt=146,W=120,H=96,Ae=178,_e=196,S=class extends E{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new rt(this)}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}render(){if(!this.data)return u`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],s=this.view;return u`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?u`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:h}</header>${Zt({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(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?u`<span>${this.data.houseSystem} houses</span>`:h} <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`<svg viewBox="0 0 ${vt} ${vt}" 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="${c}" cy="${c}" r="${O}" stroke-width="1.5"/><circle class="wheel-line" cx="${c}" cy="${c}" r="${bt-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${c}" cy="${c}" r="${W}" stroke-width="1"/><circle class="wheel-line" cx="${c}" cy="${c}" r="${H-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 s=e.map(n=>$(n.name)),o=new Map;for(let n of r){let a=[$(n.planet1),$(n.planet2)].sort().join("|");o.set(a,n)}return s.length===0?u`<p class="roxy-empty" role="status">No planets to grid</p>`:u`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${s.slice(0,-1).map(n=>{let a=M[n]??n.slice(0,2);return u`<th scope="col" title="${n}">${a}</th>`})}</tr></thead><tbody>${s.slice(1).map((n,a)=>{let l=M[n]??n.slice(0,2);return u`<tr><th scope="row" title="${n}">${l}</th>${s.slice(0,a+1).map(p=>{let m=o.get([n,p].sort().join("|"));if(!m)return u`<td class="empty"></td>`;let d=$t(m),g=gt[d]??gt[d.replace(/-/g,"")]??d.slice(0,3),f=xt[d]??"aspect-other",b=et(m.orb,1);return u`<td class="${`cell ${f}`}" title="${`${n} ${d} ${p}${b?` (orb ${b}\xB0)`:""}`}"><span class="asp">${g}</span></td>`})} ${s.slice(a+1,-1).map(()=>u`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),s=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(ft(e),"DSC")];r!==null&&(s.push(this.renderAngleMark(r,"MC")),s.push(this.renderAngleMark(ft(r),"IC")));let o=this.data?.partOfFortune?.longitude;typeof o=="number"&&s.push(this.renderAngleMark(v(o),"PoF"));let n=this.data?.vertex?.longitude;return typeof n=="number"&&s.push(this.renderAngleMark(v(n),"Vtx")),s}renderAngleMark(e,r){let s=this.toAngle(e),o=y(c,c,O,s),n=y(c,c,Ae,s),a=y(c,c,_e,s);return x`<g><line class="angle-tick" x1="${o.x}" y1="${o.y}" x2="${n.x}" y2="${n.y}"><text class="angle-marker" x="${a.x}" y="${a.y}" text-anchor="middle" dominant-baseline="central">${r}</text></g>`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(s=>s.longitude):Array.from({length:12},(s,o)=>this.getAscendant()+o*30)).map(s=>{let o=this.toAngle(s),n=y(c,c,W,o),a=y(c,c,O,o);return x`<line class="wheel-line" x1="${n.x}" y1="${n.y}" x2="${a.x}" y2="${a.y}" stroke-width="0.8">`})}renderSigns(){return N.map((e,r)=>{let s=this.toAngle(r*30+15),o=y(c,c,bt,s);return x`<text class="sign-glyph" x="${o.x}" y="${o.y}" text-anchor="middle" dominant-baseline="central">${Vt[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((s,o)=>{let n=e[(o+1)%12],a=Wt(s.longitude,n?n.longitude:s.longitude+30),l=y(c,c,W-12,this.toAngle(a));return x`<text class="house-num" x="${l.x}" y="${l.y}" text-anchor="middle" dominant-baseline="central">${s.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(s,o)=>{let n=this.toAngle(o*30+15),a=y(c,c,W-12,n),l=(o-r+12)%12+1;return x`<text class="house-num" x="${a.x}" y="${a.y}" text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let s=this.toAngle(r),o=r%30===0,n=o?bt-14:O-5,a=y(c,c,n,s),l=y(c,c,O,s);e.push(x`<line class="${o?"tick tick-major":"tick"}" x1="${a.x}" y1="${a.y}" x2="${l.x}" y2="${l.y}" stroke-width="${o?1:.5}">`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?h:e.map(r=>{let s=this.toAngle(r.longitude),o=y(c,c,W+9,s),n=yt(r.longitude);return x`<text class="cusp-deg" x="${o.x}" y="${o.y}" text-anchor="middle" dominant-baseline="central">${n.degree}°${String(n.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let s=e.filter(n=>Number.isFinite(n.longitude)).map(n=>({p:n,trueLon:v(n.longitude),displayLon:v(n.longitude)})).sort((n,a)=>n.trueLon-a.trueLon);for(let n=1;n<s.length;n++){let a=s[n-1],l=s[n];if(!a||!l)continue;let p=a.displayLon+7;l.displayLon<p&&(l.displayLon=p)}let o=s[s.length-1];if(o&&o.displayLon>360){let n=o.displayLon-360;for(let a of s)a.displayLon-=n}return s.map(({p:n,trueLon:a,displayLon:l})=>{let p=this.toAngle(a),m=this.toAngle(l),d=y(c,c,H,m),g=y(c,c,H-13,m),f=y(c,c,O-4,p),b=y(c,c,H+8,m),Xt=M[$(n.name)]??n.name.slice(0,2),At=yt(n.longitude),_t=n.isRetrograde===!0,St=`${At.degree}\xB0${String(At.minute).padStart(2,"0")}'`,Qt=Math.abs(l-a)>.5;return x`<g>${Qt?x`<line class="planet-leader" x1="${f.x}" y1="${f.y}" x2="${b.x}" y2="${b.y}">`:h}<text class="planet-glyph" x="${d.x}" y="${d.y}" text-anchor="middle" dominant-baseline="central"><title>${n.name}${_t?" retrograde":""} - ${St} ${n.sign??""}</title>${Xt}</text><text class="planet-deg" x="${g.x}" y="${g.y}" text-anchor="middle" dominant-baseline="central">${St}${_t?x`<tspan class="retro">℞</tspan>`:h}</text></g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return h;let s=e?.retrogradePlanets??[];return u`<div class="details">${e?.dominantElement||e?.dominantModality?u`<div class="pill-row">${e.dominantElement?u`<span class="pill">Dominant element: ${e.dominantElement}</span>`:h} ${e.dominantModality?u`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:h}</div>`:h} ${r?u`<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>`:h} ${s.length>0?u`<div class="pill-row">${s.map(o=>{let n=M[o]??o.slice(0,2);return u`<span class="pill pill--muted">${n} ${o} R</span>`})}</div>`:h} ${r?.summary?u`<p class="summary">${r.summary}</p>`:h} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return h;let r=["Fire","Earth","Air","Water"],s=["Cardinal","Fixed","Mutable"],o=N,n={};for(let a of r)n[a]={Cardinal:[],Fixed:[],Mutable:[]};for(let a of e){let l=o.indexOf($(a.sign??""));if(l<0)continue;let p=r[l%4],m=s[l%3],d=M[$(a.name)]??$(a.name).slice(0,2);n[p]?.[m]?.push(d)}return u`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${s.map(a=>u`<th scope="col">${a.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(a=>{let l=s.reduce((p,m)=>p+(n[a]?.[m]?.length??0),0);return u`<tr><th scope="row">${a}</th>${s.map(p=>u`<td>${(n[a]?.[p]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${s.map(a=>u`<td class="em-total">${r.reduce((l,p)=>l+(n[p]?.[a]?.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?h:u`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,s)=>{let o=r.interpretation,n=M[$(r.name)]??"",a=et(r.degree??0,1);return u`<details class="interp-card" name="natal-planet-readings" ?open="${s===0}"><summary><span>${n} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${a}</small> ${Kt()}</span></summary><div class="interp-body">${o.summary?u`<p class="interp-summary">${o.summary}</p>`:h} ${o.detailed?u`<p class="interp-detail">${o.detailed}</p>`:h} ${o.keywords?.length?u`<div class="interp-keywords">${o.keywords.map(l=>u`<span class="kw">${l}</span>`)}</div>`:h}</div></details>`})}</section>`}renderAspects(e,r){let s=new Map;for(let o of e){if(typeof o.longitude!="number")continue;let n=$(o.name);n&&s.set(n,o.longitude)}return r.map(o=>{let n=s.get($(o.planet1)),a=s.get($(o.planet2));if(n===void 0||a===void 0)return h;let l=y(c,c,H-18,this.toAngle(n)),p=y(c,c,H-18,this.toAngle(a)),m=$t(o),d=xt[m]??"aspect-other",g=et(o.orb,1);return x`<line class="${`aspect ${d}`}" x1="${l.x}" y1="${l.y}" x2="${p.x}" y2="${p.y}"><title>${o.planet1} ${m||""} ${o.planet2}${g?` (orb ${g}\xB0)`:""}</title></line>`})}};S.styles=[Ft,Jt,Yt,A`.wrap{gap:var(--roxy-space-md,1rem);width:100%;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{aspect-ratio:1;width:100%;max-width:560px;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-fg,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-fg,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-fg,#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-fg,#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-fg,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],U([F({attribute:!1})],S.prototype,"data",2),U([F({type:String,attribute:"house-system",reflect:!0})],S.prototype,"houseSystem",2),U([Gt()],S.prototype,"view",2),S=U([Bt("roxy-natal-chart")],S);return ne(Se);})();
564
4
  /*! Bundled license information:
565
5
 
566
6
  @lit/reactive-element/css-tag.js: