@roxyapi/ui 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/AGENTS.md +169 -0
  2. package/THEMING.md +129 -0
  3. package/dist/cdn/components/biorhythm-chart.js +261 -0
  4. package/dist/cdn/components/biorhythm-chart.js.map +7 -0
  5. package/dist/cdn/components/compatibility-card.js +257 -0
  6. package/dist/cdn/components/compatibility-card.js.map +7 -0
  7. package/dist/cdn/components/dasha-timeline.js +244 -0
  8. package/dist/cdn/components/dasha-timeline.js.map +7 -0
  9. package/dist/cdn/components/data.js +258 -0
  10. package/dist/cdn/components/data.js.map +7 -0
  11. package/dist/cdn/components/dosha-card.js +254 -0
  12. package/dist/cdn/components/dosha-card.js.map +7 -0
  13. package/dist/cdn/components/endpoint-form.js +253 -0
  14. package/dist/cdn/components/endpoint-form.js.map +7 -0
  15. package/dist/cdn/components/guna-milan.js +256 -0
  16. package/dist/cdn/components/guna-milan.js.map +7 -0
  17. package/dist/cdn/components/hexagram.js +275 -0
  18. package/dist/cdn/components/hexagram.js.map +7 -0
  19. package/dist/cdn/components/horoscope-card.js +302 -0
  20. package/dist/cdn/components/horoscope-card.js.map +7 -0
  21. package/dist/cdn/components/kp-planets-table.js +224 -0
  22. package/dist/cdn/components/kp-planets-table.js.map +7 -0
  23. package/dist/cdn/components/location-search.js +267 -0
  24. package/dist/cdn/components/location-search.js.map +7 -0
  25. package/dist/cdn/components/moon-phase.js +251 -0
  26. package/dist/cdn/components/moon-phase.js.map +7 -0
  27. package/dist/cdn/components/natal-chart.js +237 -0
  28. package/dist/cdn/components/natal-chart.js.map +7 -0
  29. package/dist/cdn/components/numerology-card.js +252 -0
  30. package/dist/cdn/components/numerology-card.js.map +7 -0
  31. package/dist/cdn/components/panchang-table.js +234 -0
  32. package/dist/cdn/components/panchang-table.js.map +7 -0
  33. package/dist/cdn/components/synastry-chart.js +303 -0
  34. package/dist/cdn/components/synastry-chart.js.map +7 -0
  35. package/dist/cdn/components/tarot-card.js +260 -0
  36. package/dist/cdn/components/tarot-card.js.map +7 -0
  37. package/dist/cdn/components/tarot-spread.js +261 -0
  38. package/dist/cdn/components/tarot-spread.js.map +7 -0
  39. package/dist/cdn/components/vedic-kundli.js +189 -0
  40. package/dist/cdn/components/vedic-kundli.js.map +7 -0
  41. package/dist/cdn/roxy-ui.js +2552 -0
  42. package/dist/cdn/roxy-ui.js.map +7 -0
  43. package/dist/cdn/widgets.js +114 -0
  44. package/dist/components/biorhythm-chart.d.ts +66 -0
  45. package/dist/components/biorhythm-chart.d.ts.map +1 -0
  46. package/dist/components/biorhythm-chart.js +318 -0
  47. package/dist/components/biorhythm-chart.js.map +7 -0
  48. package/dist/components/compatibility-card.d.ts +46 -0
  49. package/dist/components/compatibility-card.d.ts.map +1 -0
  50. package/dist/components/compatibility-card.js +279 -0
  51. package/dist/components/compatibility-card.js.map +7 -0
  52. package/dist/components/dasha-timeline.d.ts +53 -0
  53. package/dist/components/dasha-timeline.d.ts.map +1 -0
  54. package/dist/components/dasha-timeline.js +269 -0
  55. package/dist/components/dasha-timeline.js.map +7 -0
  56. package/dist/components/data.d.ts +40 -0
  57. package/dist/components/data.d.ts.map +1 -0
  58. package/dist/components/data.js +339 -0
  59. package/dist/components/data.js.map +7 -0
  60. package/dist/components/dosha-card.d.ts +35 -0
  61. package/dist/components/dosha-card.d.ts.map +1 -0
  62. package/dist/components/dosha-card.js +278 -0
  63. package/dist/components/dosha-card.js.map +7 -0
  64. package/dist/components/endpoint-form.d.ts +39 -0
  65. package/dist/components/endpoint-form.d.ts.map +1 -0
  66. package/dist/components/endpoint-form.js +432 -0
  67. package/dist/components/endpoint-form.js.map +7 -0
  68. package/dist/components/guna-milan.d.ts +35 -0
  69. package/dist/components/guna-milan.d.ts.map +1 -0
  70. package/dist/components/guna-milan.js +302 -0
  71. package/dist/components/guna-milan.js.map +7 -0
  72. package/dist/components/hexagram.d.ts +47 -0
  73. package/dist/components/hexagram.d.ts.map +1 -0
  74. package/dist/components/hexagram.js +334 -0
  75. package/dist/components/hexagram.js.map +7 -0
  76. package/dist/components/horoscope-card.d.ts +38 -0
  77. package/dist/components/horoscope-card.d.ts.map +1 -0
  78. package/dist/components/horoscope-card.js +332 -0
  79. package/dist/components/horoscope-card.js.map +7 -0
  80. package/dist/components/kp-planets-table.d.ts +36 -0
  81. package/dist/components/kp-planets-table.d.ts.map +1 -0
  82. package/dist/components/kp-planets-table.js +227 -0
  83. package/dist/components/kp-planets-table.js.map +7 -0
  84. package/dist/components/location-search.d.ts +56 -0
  85. package/dist/components/location-search.d.ts.map +1 -0
  86. package/dist/components/location-search.js +401 -0
  87. package/dist/components/location-search.js.map +7 -0
  88. package/dist/components/moon-phase.d.ts +38 -0
  89. package/dist/components/moon-phase.d.ts.map +1 -0
  90. package/dist/components/moon-phase.js +284 -0
  91. package/dist/components/moon-phase.js.map +7 -0
  92. package/dist/components/natal-chart.d.ts +65 -0
  93. package/dist/components/natal-chart.d.ts.map +1 -0
  94. package/dist/components/natal-chart.js +407 -0
  95. package/dist/components/natal-chart.js.map +7 -0
  96. package/dist/components/numerology-card.d.ts +55 -0
  97. package/dist/components/numerology-card.d.ts.map +1 -0
  98. package/dist/components/numerology-card.js +274 -0
  99. package/dist/components/numerology-card.js.map +7 -0
  100. package/dist/components/panchang-table.d.ts +77 -0
  101. package/dist/components/panchang-table.d.ts.map +1 -0
  102. package/dist/components/panchang-table.js +285 -0
  103. package/dist/components/panchang-table.js.map +7 -0
  104. package/dist/components/synastry-chart.d.ts +52 -0
  105. package/dist/components/synastry-chart.d.ts.map +1 -0
  106. package/dist/components/synastry-chart.js +415 -0
  107. package/dist/components/synastry-chart.js.map +7 -0
  108. package/dist/components/tarot-card.d.ts +47 -0
  109. package/dist/components/tarot-card.d.ts.map +1 -0
  110. package/dist/components/tarot-card.js +281 -0
  111. package/dist/components/tarot-card.js.map +7 -0
  112. package/dist/components/tarot-spread.d.ts +42 -0
  113. package/dist/components/tarot-spread.d.ts.map +1 -0
  114. package/dist/components/tarot-spread.js +271 -0
  115. package/dist/components/tarot-spread.js.map +7 -0
  116. package/dist/components/vedic-kundli.d.ts +45 -0
  117. package/dist/components/vedic-kundli.d.ts.map +1 -0
  118. package/dist/components/vedic-kundli.js +325 -0
  119. package/dist/components/vedic-kundli.js.map +7 -0
  120. package/dist/index.cjs +4174 -0
  121. package/dist/index.cjs.map +7 -0
  122. package/dist/index.d.ts +30 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +4154 -0
  125. package/dist/index.js.map +7 -0
  126. package/dist/manifest.json +24 -0
  127. package/dist/styles/tokens.css +147 -0
  128. package/dist/tokens/index.d.ts +17 -0
  129. package/dist/tokens/index.d.ts.map +1 -0
  130. package/dist/utils/base-styles.d.ts +6 -0
  131. package/dist/utils/base-styles.d.ts.map +1 -0
  132. package/dist/utils/debounce.d.ts +5 -0
  133. package/dist/utils/debounce.d.ts.map +1 -0
  134. package/dist/utils/degree.d.ts +29 -0
  135. package/dist/utils/degree.d.ts.map +1 -0
  136. package/dist/utils/motion.d.ts +13 -0
  137. package/dist/utils/motion.d.ts.map +1 -0
  138. package/package.json +69 -3
  139. package/src/components/biorhythm-chart.ts +290 -0
  140. package/src/components/compatibility-card.ts +231 -0
  141. package/src/components/dasha-timeline.ts +251 -0
  142. package/src/components/data.ts +287 -0
  143. package/src/components/dosha-card.ts +215 -0
  144. package/src/components/endpoint-form.ts +433 -0
  145. package/src/components/guna-milan.ts +245 -0
  146. package/src/components/hexagram.ts +279 -0
  147. package/src/components/horoscope-card.ts +291 -0
  148. package/src/components/kp-planets-table.ts +156 -0
  149. package/src/components/location-search.ts +335 -0
  150. package/src/components/moon-phase.ts +221 -0
  151. package/src/components/natal-chart.ts +298 -0
  152. package/src/components/numerology-card.ts +243 -0
  153. package/src/components/panchang-table.ts +265 -0
  154. package/src/components/synastry-chart.ts +341 -0
  155. package/src/components/tarot-card.ts +235 -0
  156. package/src/components/tarot-spread.ts +224 -0
  157. package/src/components/vedic-kundli.ts +257 -0
  158. package/src/index.ts +61 -0
  159. package/src/styles/tokens.css +147 -0
  160. package/src/tokens/index.ts +130 -0
  161. package/src/types/index.ts +3 -0
  162. package/src/types/types.gen.ts +28526 -0
  163. package/src/utils/base-styles.ts +89 -0
  164. package/src/utils/debounce.ts +13 -0
  165. package/src/utils/degree.ts +64 -0
  166. package/src/utils/motion.ts +18 -0
@@ -0,0 +1,2552 @@
1
+ "use strict";var RoxyUI=(()=>{var de=Object.defineProperty;var He=Object.getOwnPropertyDescriptor;var gr=Object.getOwnPropertyNames;var ur=Object.prototype.hasOwnProperty;var hr=(o,t)=>{for(var e in t)de(o,e,{get:t[e],enumerable:!0})},yr=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of gr(t))!ur.call(o,a)&&a!==e&&de(o,a,{get:()=>t[a],enumerable:!(r=He(t,a))||r.enumerable});return o};var xr=o=>yr(de({},"__esModule",{value:!0}),o),d=(o,t,e,r)=>{for(var a=r>1?void 0:r?He(t,e):t,i=o.length-1,n;i>=0;i--)(n=o[i])&&(a=(r?n(t,e,a):n(a))||a);return r&&a&&de(t,e,a),a};var Xr={};hr(Xr,{ROXY_UI_COMPONENTS:()=>Zr,ROXY_UI_VERSION:()=>Wr,RoxyBiorhythmChart:()=>T,RoxyCompatibilityCard:()=>M,RoxyDashaTimeline:()=>L,RoxyData:()=>K,RoxyDoshaCard:()=>N,RoxyEndpointForm:()=>A,RoxyGunaMilan:()=>G,RoxyHexagram:()=>C,RoxyHoroscopeCard:()=>D,RoxyKpPlanetsTable:()=>Y,RoxyLocationSearch:()=>k,RoxyMoonPhase:()=>O,RoxyNatalChart:()=>H,RoxyNumerologyCard:()=>j,RoxyPanchangTable:()=>U,RoxySynastryChart:()=>F,RoxyTarotCard:()=>R,RoxyTarotSpread:()=>I,RoxyVedicKundli:()=>q});var me=globalThis,pe=me.ShadowRoot&&(me.ShadyCSS===void 0||me.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,$e=Symbol(),je=new WeakMap,te=class{constructor(t,e,r){if(this._$cssResult$=!0,r!==$e)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(pe&&t===void 0){let r=e!==void 0&&e.length===1;r&&(t=je.get(e)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),r&&je.set(e,t))}return t}toString(){return this.cssText}},Ue=o=>new te(typeof o=="string"?o:o+"",void 0,$e),y=(o,...t)=>{let e=o.length===1?o[0]:t.reduce((r,a,i)=>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.")})(a)+o[i+1],o[0]);return new te(e,o,$e)},Re=(o,t)=>{if(pe)o.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(let e of t){let r=document.createElement("style"),a=me.litNonce;a!==void 0&&r.setAttribute("nonce",a),r.textContent=e.cssText,o.appendChild(r)}},we=pe?o=>o:o=>o instanceof CSSStyleSheet?(t=>{let e="";for(let r of t.cssRules)e+=r.cssText;return Ue(e)})(o):o;var{is:fr,defineProperty:vr,getOwnPropertyDescriptor:br,getOwnPropertyNames:$r,getOwnPropertySymbols:wr,getPrototypeOf:kr}=Object,ge=globalThis,Ie=ge.trustedTypes,Sr=Ie?Ie.emptyScript:"",Ar=ge.reactiveElementPolyfillSupport,ae=(o,t)=>o,se={toAttribute(o,t){switch(t){case Boolean:o=o?Sr:null;break;case Object:case Array:o=o==null?o:JSON.stringify(o)}return o},fromAttribute(o,t){let e=o;switch(t){case Boolean:e=o!==null;break;case Number:e=o===null?null:Number(o);break;case Object:case Array:try{e=JSON.parse(o)}catch{e=null}}return e}},ue=(o,t)=>!fr(o,t),qe={attribute:!0,type:String,converter:se,reflect:!1,useDefault:!1,hasChanged:ue};Symbol.metadata??=Symbol("metadata"),ge.litPropertyMetadata??=new WeakMap;var z=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=qe){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(),a=this.getPropertyDescriptor(t,r,e);a!==void 0&&vr(this.prototype,t,a)}}static getPropertyDescriptor(t,e,r){let{get:a,set:i}=br(this.prototype,t)??{get(){return this[e]},set(n){this[e]=n}};return{get:a,set(n){let c=a?.call(this);i?.call(this,n),this.requestUpdate(t,c,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??qe}static _$Ei(){if(this.hasOwnProperty(ae("elementProperties")))return;let t=kr(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(ae("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(ae("properties"))){let e=this.properties,r=[...$r(e),...wr(e)];for(let a of r)this.createProperty(a,e[a])}let t=this[Symbol.metadata];if(t!==null){let e=litPropertyMetadata.get(t);if(e!==void 0)for(let[r,a]of e)this.elementProperties.set(r,a)}this._$Eh=new Map;for(let[e,r]of this.elementProperties){let a=this._$Eu(e,r);a!==void 0&&this._$Eh.set(a,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 a of r)e.unshift(we(a))}else t!==void 0&&e.push(we(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 Re(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),a=this.constructor._$Eu(t,r);if(a!==void 0&&r.reflect===!0){let i=(r.converter?.toAttribute!==void 0?r.converter:se).toAttribute(e,r.type);this._$Em=t,i==null?this.removeAttribute(a):this.setAttribute(a,i),this._$Em=null}}_$AK(t,e){let r=this.constructor,a=r._$Eh.get(t);if(a!==void 0&&this._$Em!==a){let i=r.getPropertyOptions(a),n=typeof i.converter=="function"?{fromAttribute:i.converter}:i.converter?.fromAttribute!==void 0?i.converter:se;this._$Em=a;let c=n.fromAttribute(e,i.type);this[a]=c??this._$Ej?.get(a)??c,this._$Em=null}}requestUpdate(t,e,r,a=!1,i){if(t!==void 0){let n=this.constructor;if(a===!1&&(i=this[t]),r??=n.getPropertyOptions(t),!((r.hasChanged??ue)(i,e)||r.useDefault&&r.reflect&&i===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:a,wrapped:i},n){r&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,n??e??this[t]),i!==!0||n!==void 0)||(this._$AL.has(t)||(this.hasUpdated||r||(e=void 0),this._$AL.set(t,e)),a===!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[a,i]of this._$Ep)this[a]=i;this._$Ep=void 0}let r=this.constructor.elementProperties;if(r.size>0)for(let[a,i]of r){let{wrapped:n}=i,c=this[a];n!==!0||this._$AL.has(a)||c===void 0||this.C(a,void 0,i,c)}}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){}};z.elementStyles=[],z.shadowRootOptions={mode:"open"},z[ae("elementProperties")]=new Map,z[ae("finalized")]=new Map,Ar?.({ReactiveElement:z}),(ge.reactiveElementVersions??=[]).push("2.1.2");var ze=globalThis,Be=o=>o,he=ze.trustedTypes,Ke=he?he.createPolicy("lit-html",{createHTML:o=>o}):void 0,We="$lit$",B=`lit$${Math.random().toFixed(9).slice(2)}$`,Ze="?"+B,Er=`<${Ze}>`,W=document,ne=()=>W.createComment(""),oe=o=>o===null||typeof o!="object"&&typeof o!="function",Te=Array.isArray,_r=o=>Te(o)||typeof o?.[Symbol.iterator]=="function",ke=`[
2
+ \f\r]`,ie=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Ge=/-->/g,Ye=/>/g,V=RegExp(`>|${ke}(?:([^\\s"'>=/]+)(${ke}*=${ke}*(?:[^
3
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),Fe=/'/g,Ve=/"/g,Xe=/^(?:script|style|textarea|title)$/i,Me=o=>(t,...e)=>({_$litType$:o,strings:t,values:e}),s=Me(1),$=Me(2),st=Me(3),Z=Symbol.for("lit-noChange"),l=Symbol.for("lit-nothing"),Je=new WeakMap,J=W.createTreeWalker(W,129);function Qe(o,t){if(!Te(o)||!o.hasOwnProperty("raw"))throw Error("invalid template strings array");return Ke!==void 0?Ke.createHTML(t):t}var Pr=(o,t)=>{let e=o.length-1,r=[],a,i=t===2?"<svg>":t===3?"<math>":"",n=ie;for(let c=0;c<e;c++){let m=o[c],u,h,v=-1,S=0;for(;S<m.length&&(n.lastIndex=S,h=n.exec(m),h!==null);)S=n.lastIndex,n===ie?h[1]==="!--"?n=Ge:h[1]!==void 0?n=Ye:h[2]!==void 0?(Xe.test(h[2])&&(a=RegExp("</"+h[2],"g")),n=V):h[3]!==void 0&&(n=V):n===V?h[0]===">"?(n=a??ie,v=-1):h[1]===void 0?v=-2:(v=n.lastIndex-h[2].length,u=h[1],n=h[3]===void 0?V:h[3]==='"'?Ve:Fe):n===Ve||n===Fe?n=V:n===Ge||n===Ye?n=ie:(n=V,a=void 0);let w=n===V&&o[c+1].startsWith("/>")?" ":"";i+=n===ie?m+Er:v>=0?(r.push(u),m.slice(0,v)+We+m.slice(v)+B+w):m+B+(v===-2?c:w)}return[Qe(o,i+(o[e]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),r]},le=class o{constructor({strings:t,_$litType$:e},r){let a;this.parts=[];let i=0,n=0,c=t.length-1,m=this.parts,[u,h]=Pr(t,e);if(this.el=o.createElement(u,r),J.currentNode=this.el.content,e===2||e===3){let v=this.el.content.firstChild;v.replaceWith(...v.childNodes)}for(;(a=J.nextNode())!==null&&m.length<c;){if(a.nodeType===1){if(a.hasAttributes())for(let v of a.getAttributeNames())if(v.endsWith(We)){let S=h[n++],w=a.getAttribute(v).split(B),X=/([.?@])?(.*)/.exec(S);m.push({type:1,index:i,name:X[2],strings:w,ctor:X[1]==="."?Ae:X[1]==="?"?Ee:X[1]==="@"?_e:ee}),a.removeAttribute(v)}else v.startsWith(B)&&(m.push({type:6,index:i}),a.removeAttribute(v));if(Xe.test(a.tagName)){let v=a.textContent.split(B),S=v.length-1;if(S>0){a.textContent=he?he.emptyScript:"";for(let w=0;w<S;w++)a.append(v[w],ne()),J.nextNode(),m.push({type:2,index:++i});a.append(v[S],ne())}}}else if(a.nodeType===8)if(a.data===Ze)m.push({type:2,index:i});else{let v=-1;for(;(v=a.data.indexOf(B,v+1))!==-1;)m.push({type:7,index:i}),v+=B.length-1}i++}}static createElement(t,e){let r=W.createElement("template");return r.innerHTML=t,r}};function Q(o,t,e=o,r){if(t===Z)return t;let a=r!==void 0?e._$Co?.[r]:e._$Cl,i=oe(t)?void 0:t._$litDirective$;return a?.constructor!==i&&(a?._$AO?.(!1),i===void 0?a=void 0:(a=new i(o),a._$AT(o,e,r)),r!==void 0?(e._$Co??=[])[r]=a:e._$Cl=a),a!==void 0&&(t=Q(o,a._$AS(o,t.values),a,r)),t}var Se=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,a=(t?.creationScope??W).importNode(e,!0);J.currentNode=a;let i=J.nextNode(),n=0,c=0,m=r[0];for(;m!==void 0;){if(n===m.index){let u;m.type===2?u=new ce(i,i.nextSibling,this,t):m.type===1?u=new m.ctor(i,m.name,m.strings,this,t):m.type===6&&(u=new Pe(i,this,t)),this._$AV.push(u),m=r[++c]}n!==m?.index&&(i=J.nextNode(),n++)}return J.currentNode=W,a}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++}},ce=class o{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,e,r,a){this.type=2,this._$AH=l,this._$AN=void 0,this._$AA=t,this._$AB=e,this._$AM=r,this.options=a,this._$Cv=a?.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=Q(this,t,e),oe(t)?t===l||t==null||t===""?(this._$AH!==l&&this._$AR(),this._$AH=l):t!==this._$AH&&t!==Z&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):_r(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!==l&&oe(this._$AH)?this._$AA.nextSibling.data=t:this.T(W.createTextNode(t)),this._$AH=t}$(t){let{values:e,_$litType$:r}=t,a=typeof r=="number"?this._$AC(t):(r.el===void 0&&(r.el=le.createElement(Qe(r.h,r.h[0]),this.options)),r);if(this._$AH?._$AD===a)this._$AH.p(e);else{let i=new Se(a,this),n=i.u(this.options);i.p(e),this.T(n),this._$AH=i}}_$AC(t){let e=Je.get(t.strings);return e===void 0&&Je.set(t.strings,e=new le(t)),e}k(t){Te(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,r,a=0;for(let i of t)a===e.length?e.push(r=new o(this.O(ne()),this.O(ne()),this,this.options)):r=e[a],r._$AI(i),a++;a<e.length&&(this._$AR(r&&r._$AB.nextSibling,a),e.length=a)}_$AR(t=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);t!==this._$AB;){let r=Be(t).nextSibling;Be(t).remove(),t=r}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}},ee=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,e,r,a,i){this.type=1,this._$AH=l,this._$AN=void 0,this.element=t,this.name=e,this._$AM=a,this.options=i,r.length>2||r[0]!==""||r[1]!==""?(this._$AH=Array(r.length-1).fill(new String),this.strings=r):this._$AH=l}_$AI(t,e=this,r,a){let i=this.strings,n=!1;if(i===void 0)t=Q(this,t,e,0),n=!oe(t)||t!==this._$AH&&t!==Z,n&&(this._$AH=t);else{let c=t,m,u;for(t=i[0],m=0;m<i.length-1;m++)u=Q(this,c[r+m],e,m),u===Z&&(u=this._$AH[m]),n||=!oe(u)||u!==this._$AH[m],u===l?t=l:t!==l&&(t+=(u??"")+i[m+1]),this._$AH[m]=u}n&&!a&&this.j(t)}j(t){t===l?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}},Ae=class extends ee{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===l?void 0:t}},Ee=class extends ee{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==l)}},_e=class extends ee{constructor(t,e,r,a,i){super(t,e,r,a,i),this.type=5}_$AI(t,e=this){if((t=Q(this,t,e,0)??l)===Z)return;let r=this._$AH,a=t===l&&r!==l||t.capture!==r.capture||t.once!==r.once||t.passive!==r.passive,i=t!==l&&(r===l||a);a&&this.element.removeEventListener(this.name,this,r),i&&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)}},Pe=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){Q(this,t)}};var zr=ze.litHtmlPolyfillSupport;zr?.(le,ce),(ze.litHtmlVersions??=[]).push("3.3.2");var er=(o,t,e)=>{let r=e?.renderBefore??t,a=r._$litPart$;if(a===void 0){let i=e?.renderBefore??null;r._$litPart$=a=new ce(t.insertBefore(ne(),i),i,void 0,e??{})}return a._$AI(o),a};var Le=globalThis,g=class extends z{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=er(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Z}};g._$litElement$=!0,g.finalized=!0,Le.litElementHydrateSupport?.({LitElement:g});var Tr=Le.litElementPolyfillSupport;Tr?.({LitElement:g});(Le.litElementVersions??=[]).push("4.2.2");var x=o=>(t,e)=>{e!==void 0?e.addInitializer(()=>{customElements.define(o,t)}):customElements.define(o,t)};var Mr={attribute:!0,type:String,converter:se,reflect:!1,hasChanged:ue},Lr=(o=Mr,t,e)=>{let{kind:r,metadata:a}=e,i=globalThis.litPropertyMetadata.get(a);if(i===void 0&&globalThis.litPropertyMetadata.set(a,i=new Map),r==="setter"&&((o=Object.create(o)).wrapped=!0),i.set(e.name,o),r==="accessor"){let{name:n}=e;return{set(c){let m=t.get.call(this);t.set.call(this,c),this.requestUpdate(n,m,o,!0,c)},init(c){return c!==void 0&&this.C(n,void 0,o,c),c}}}if(r==="setter"){let{name:n}=e;return function(c){let m=this[n];t.call(this,c),this.requestUpdate(n,m,o,!0,c)}}throw Error("Unsupported decorator location: "+r)};function p(o){return(t,e)=>typeof e=="object"?Lr(o,t,e):((r,a,i)=>{let n=a.hasOwnProperty(i);return a.constructor.createProperty(i,r),n?Object.getOwnPropertyDescriptor(a,i):void 0})(o,t,e)}function _(o){return p({...o,state:!0,attribute:!1})}var f=y`
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
+ `;var rr={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},T=class extends g{constructor(){super(...arguments);this.data=null;this.mode="daily"}render(){let e=this.data;return e?this.mode==="critical-days"&&e.criticalDays?.length?this.renderCritical(e):this.mode==="forecast"&&e.days?.length?this.renderForecast(e):this.renderDaily(e):s`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.cycles??{},a=Object.entries(r);return s`<section class="wrap" aria-label="Daily biorhythm">
86
+ <header class="head">
87
+ <h2 class="title">Biorhythm</h2>
88
+ ${typeof e.energyRating=="number"?s`<span class="energy">Energy ${e.energyRating}/10</span>`:l}
89
+ </header>
90
+ <div class="bars" role="list">
91
+ ${a.map(([i,n])=>{let c=typeof n=="number"?n:0,m=(c+1)/2*100,u=rr[i]??"var(--roxy-accent, #f59e0b)";return s`<div class="bar" role="listitem">
92
+ <span style="text-transform: capitalize">${i}</span>
93
+ <span class="track">
94
+ <span
95
+ class="fill"
96
+ style="width: ${m}%; background: ${u}"
97
+ ></span>
98
+ </span>
99
+ <span class="value">${(c*100).toFixed(0)}%</span>
100
+ </div>`})}
101
+ </div>
102
+ ${e.interpretation?s`<p class="advice">${e.interpretation}</p>`:l}
103
+ ${e.advice?s`<p class="advice">${e.advice}</p>`:l}
104
+ ${e.criticalAlerts?.length?s`<div>
105
+ ${e.criticalAlerts.map(i=>s`<p class="alert">${i}</p>`)}
106
+ </div>`:l}
107
+ </section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return s`<div class="roxy-empty" role="status">No forecast</div>`;let a=600,i=160,n=a/Math.max(r.length-1,1),c=Object.keys(r[0]?.cycles??{});return s`<section class="wrap" aria-label="Biorhythm forecast">
108
+ <header class="head">
109
+ <h2 class="title">Forecast</h2>
110
+ <span class="energy"
111
+ >${e.startDate??""} - ${e.endDate??""}</span
112
+ >
113
+ </header>
114
+ <svg
115
+ viewBox="0 0 ${a} ${i}"
116
+ role="img"
117
+ aria-label="Biorhythm cycle lines across the forecast window"
118
+ >
119
+ <title>Biorhythm forecast</title>
120
+ <line
121
+ x1="0"
122
+ y1=${i/2}
123
+ x2=${a}
124
+ y2=${i/2}
125
+ stroke="var(--roxy-border, #e4e4e7)"
126
+ stroke-width="1"
127
+ />
128
+ ${c.map(m=>{let u=r.map((v,S)=>{let w=v.cycles?.[m]??0,X=S*n,pr=i/2-w*(i/2-8);return`${X.toFixed(2)},${pr.toFixed(2)}`}).join(" "),h=rr[m]??"#475569";return $`<polyline points=${u} fill="none" stroke=${h} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}
129
+ </svg>
130
+ ${e.summary?.periodAdvice?s`<p class="advice">${e.summary.periodAdvice}</p>`:l}
131
+ </section>`}renderCritical(e){return s`<section class="wrap" aria-label="Critical days">
132
+ <header class="head">
133
+ <h2 class="title">Critical days</h2>
134
+ <span class="energy"
135
+ >${e.totalCriticalDays??e.criticalDays?.length??0} total</span
136
+ >
137
+ </header>
138
+ <div>
139
+ ${(e.criticalDays??[]).map(r=>s`<span class="crit"
140
+ >${r.date} · ${r.cycle??""} ${r.severity??""}</span
141
+ >`)}
142
+ </div>
143
+ </section>`}};T.styles=[f,y`
144
+ .wrap {
145
+ display: grid;
146
+ gap: var(--roxy-space-md, 1rem);
147
+ }
148
+ .head {
149
+ display: flex;
150
+ justify-content: space-between;
151
+ align-items: center;
152
+ flex-wrap: wrap;
153
+ gap: var(--roxy-space-sm, 0.5rem);
154
+ }
155
+ .title {
156
+ margin: 0;
157
+ font-size: var(--roxy-text-lg, 1.125rem);
158
+ font-weight: var(--roxy-weight-bold, 600);
159
+ }
160
+ .energy {
161
+ font-variant-numeric: tabular-nums;
162
+ color: var(--roxy-accent-fg, #b45309);
163
+ font-weight: var(--roxy-weight-bold, 600);
164
+ }
165
+ .bars {
166
+ display: grid;
167
+ gap: var(--roxy-space-xs, 0.25rem);
168
+ }
169
+ .bar {
170
+ display: grid;
171
+ grid-template-columns: 8rem 1fr 3.5rem;
172
+ gap: var(--roxy-space-sm, 0.5rem);
173
+ align-items: center;
174
+ font-size: var(--roxy-text-sm, 0.875rem);
175
+ }
176
+ .track {
177
+ height: 14px;
178
+ background: var(--roxy-border, #e4e4e7);
179
+ border-radius: var(--roxy-radius-full, 9999px);
180
+ overflow: hidden;
181
+ position: relative;
182
+ }
183
+ .fill {
184
+ display: block;
185
+ height: 100%;
186
+ transition:
187
+ width var(--roxy-motion-duration, 200ms)
188
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
189
+ }
190
+ .value {
191
+ font-variant-numeric: tabular-nums;
192
+ text-align: right;
193
+ color: var(--roxy-muted, #71717a);
194
+ }
195
+ .advice {
196
+ color: var(--roxy-fg, #0a0a0a);
197
+ }
198
+ .alert {
199
+ background: color-mix(in srgb, var(--roxy-warning, #ea580c) 12%, transparent);
200
+ border: 1px solid color-mix(in srgb, var(--roxy-warning, #ea580c) 32%, transparent);
201
+ border-radius: var(--roxy-radius-md, 8px);
202
+ padding: var(--roxy-space-sm, 0.5rem);
203
+ font-size: var(--roxy-text-sm, 0.875rem);
204
+ margin: 0;
205
+ }
206
+ svg {
207
+ display: block;
208
+ width: 100%;
209
+ height: auto;
210
+ }
211
+ .crit {
212
+ background: color-mix(in srgb, var(--roxy-danger, #dc2626) 12%, transparent);
213
+ border-radius: var(--roxy-radius-sm, 4px);
214
+ padding: 4px 8px;
215
+ font-size: var(--roxy-text-xs, 0.75rem);
216
+ display: inline-block;
217
+ margin: 2px;
218
+ }
219
+ `],d([p({attribute:!1})],T.prototype,"data",2),d([p({type:String,reflect:!0})],T.prototype,"mode",2),T=d([x("roxy-biorhythm-chart")],T);var M=class extends g{constructor(){super(...arguments);this.data=null;this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if(e.categoryScores)return e.categoryScores;if(e.categoryBreakdown)return e.categoryBreakdown;let r={};return typeof e.emotional=="number"&&(r.emotional=e.emotional),typeof e.communication=="number"&&(r.communication=e.communication),typeof e.romance=="number"&&(r.romance=e.romance),e.elementBalance&&Object.assign(r,e.elementBalance),r}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore??e.score,a=this.getBreakdown();return s`<article
220
+ class="card"
221
+ aria-label=${`Compatibility (${this.mode})`}
222
+ >
223
+ <div class="head">
224
+ <h2>${this.mode} compatibility</h2>
225
+ <div>
226
+ ${typeof r=="number"?s`<div class="score">${r}</div>`:l}
227
+ ${e.rating?s`<div class="rating">${e.rating}</div>`:l}
228
+ </div>
229
+ </div>
230
+
231
+ ${Object.keys(a).length>0?s`<div role="list">
232
+ ${Object.entries(a).map(([i,n])=>s`<div class="bar-row" role="listitem">
233
+ <span style="text-transform: capitalize">${i}</span>
234
+ <span class="bar"
235
+ ><span style="width: ${Math.max(0,Math.min(100,n))}%"></span
236
+ ></span>
237
+ <span>${n}</span>
238
+ </div>`)}
239
+ </div>`:l}
240
+ ${e.relationshipArchetype?s`<p>
241
+ <span class="archetype">${e.relationshipArchetype}</span>
242
+ </p>`:l}
243
+ ${e.summary?s`<p>${e.summary}</p>`:l}
244
+ ${e.advice?s`<p>${e.advice}</p>`:l}
245
+ ${(e.strengths?.length??0)>0||(e.challenges?.length??0)>0?s`<div class="lists">
246
+ ${e.strengths?.length?s`<div>
247
+ <h3>Strengths</h3>
248
+ <ul>
249
+ ${e.strengths.map(i=>s`<li>${i}</li>`)}
250
+ </ul>
251
+ </div>`:l}
252
+ ${e.challenges?.length?s`<div>
253
+ <h3>Challenges</h3>
254
+ <ul>
255
+ ${e.challenges.map(i=>s`<li>${i}</li>`)}
256
+ </ul>
257
+ </div>`:l}
258
+ ${e.keyAspects?.length?s`<div>
259
+ <h3>Key aspects</h3>
260
+ <ul>
261
+ ${e.keyAspects.map(i=>s`<li>${i}</li>`)}
262
+ </ul>
263
+ </div>`:l}
264
+ </div>`:l}
265
+ </article>`}};M.styles=[f,y`
266
+ .card {
267
+ background: var(--roxy-bg, #fff);
268
+ border: 1px solid var(--roxy-border, #e4e4e7);
269
+ border-radius: var(--roxy-radius-md, 8px);
270
+ padding: var(--roxy-space-lg, 1.5rem);
271
+ box-shadow: var(--roxy-shadow-sm);
272
+ display: grid;
273
+ gap: var(--roxy-space-md, 1rem);
274
+ }
275
+
276
+ .head {
277
+ display: grid;
278
+ grid-template-columns: 1fr auto;
279
+ align-items: center;
280
+ gap: var(--roxy-space-md, 1rem);
281
+ }
282
+ .head h2 {
283
+ margin: 0;
284
+ font-size: var(--roxy-text-lg, 1.125rem);
285
+ font-weight: var(--roxy-weight-bold, 600);
286
+ text-transform: capitalize;
287
+ }
288
+
289
+ .score {
290
+ font-variant-numeric: tabular-nums;
291
+ font-size: 2rem;
292
+ font-weight: var(--roxy-weight-bold, 600);
293
+ color: var(--roxy-accent-fg, #b45309);
294
+ line-height: 1;
295
+ }
296
+ .rating {
297
+ color: var(--roxy-secondary, #475569);
298
+ font-size: var(--roxy-text-sm, 0.875rem);
299
+ }
300
+
301
+ .bar-row {
302
+ display: grid;
303
+ grid-template-columns: 8rem 1fr 3.5rem;
304
+ gap: var(--roxy-space-sm, 0.5rem);
305
+ align-items: center;
306
+ font-size: var(--roxy-text-sm, 0.875rem);
307
+ }
308
+ .bar {
309
+ height: 8px;
310
+ background: var(--roxy-border, #e4e4e7);
311
+ border-radius: var(--roxy-radius-full, 9999px);
312
+ overflow: hidden;
313
+ }
314
+ .bar > span {
315
+ display: block;
316
+ height: 100%;
317
+ background: var(--roxy-accent, #f59e0b);
318
+ transition:
319
+ width var(--roxy-motion-duration, 200ms)
320
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
321
+ }
322
+ .bar-row > span:last-child {
323
+ font-variant-numeric: tabular-nums;
324
+ color: var(--roxy-muted, #71717a);
325
+ text-align: right;
326
+ }
327
+
328
+ .archetype {
329
+ color: var(--roxy-info, #0284c7);
330
+ font-weight: var(--roxy-weight-bold, 600);
331
+ }
332
+
333
+ .lists {
334
+ display: grid;
335
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
336
+ gap: var(--roxy-space-md, 1rem);
337
+ }
338
+ .lists h3 {
339
+ margin: 0 0 var(--roxy-space-xs, 0.25rem);
340
+ font-size: var(--roxy-text-xs, 0.75rem);
341
+ color: var(--roxy-muted, #71717a);
342
+ text-transform: uppercase;
343
+ letter-spacing: 0.06em;
344
+ }
345
+ .lists ul {
346
+ margin: 0;
347
+ padding-left: var(--roxy-space-md, 1rem);
348
+ }
349
+ `],d([p({attribute:!1})],M.prototype,"data",2),d([p({type:String,reflect:!0})],M.prototype,"mode",2),M=d([x("roxy-compatibility-card")],M);var L=class extends g{constructor(){super(...arguments);this.data=null;this.period="current"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),a=r.length?Math.max(...r.map(i=>i.durationYears??i.years??1)):0;return s`<div class="wrap" aria-label="Dasha timeline">
350
+ <header class="head">
351
+ <h2 class="title">
352
+ ${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}
353
+ </h2>
354
+ ${e.nakshatraName||e.moonNakshatra?s`<div class="nakshatra">
355
+ Moon nakshatra: ${e.nakshatraName??e.moonNakshatra}
356
+ ${e.nakshatraLord?s`(lord ${e.nakshatraLord})`:l}
357
+ </div>`:l}
358
+ </header>
359
+
360
+ ${this.period==="current"?this.renderCurrent(e):l}
361
+ ${r.length>0?s`<div class="timeline" role="list">
362
+ ${r.map(i=>this.renderBar(i,a))}
363
+ </div>`:l}
364
+ </div>`}renderCurrent(e){return s`<div class="current">
365
+ ${e.mahadasha?s`<div>
366
+ <span>Mahadasha</span>
367
+ <strong>${e.mahadasha.lord??e.mahadasha.mahadashaLord}</strong>
368
+ ${typeof e.remainingInMahadasha=="number"?s`<small>${e.remainingInMahadasha.toFixed(1)} years left</small>`:l}
369
+ </div>`:l}
370
+ ${e.antardasha?s`<div>
371
+ <span>Antardasha</span>
372
+ <strong>${e.antardasha.lord??e.antardasha.antardashaLord}</strong>
373
+ ${typeof e.remainingInAntardasha=="number"?s`<small>${e.remainingInAntardasha.toFixed(1)} years left</small>`:l}
374
+ </div>`:l}
375
+ ${e.pratyantardasha?s`<div>
376
+ <span>Pratyantardasha</span>
377
+ <strong
378
+ >${e.pratyantardasha.lord??e.pratyantardasha.pratyantardashaLord}</strong
379
+ >
380
+ ${typeof e.remainingInPratyantardasha=="number"?s`<small
381
+ >${e.remainingInPratyantardasha.toFixed(2)} years left</small
382
+ >`:l}
383
+ </div>`:l}
384
+ </div>`}collectPeriods(e){return this.period==="major"&&e.mahadashas?.length?e.mahadashas:this.period==="sub"&&e.antardashas?.length?e.antardashas:e.mahadashas??e.antardashas??[]}renderBar(e,r){let a=e.lord??e.mahadashaLord??e.antardashaLord??e.planet??"",i=e.durationYears??e.years??0,n=r>0?i/r*100:0;return s`<div class="bar" role="listitem">
385
+ <span>${a}</span>
386
+ <span class="bar-track"><span style="width: ${n}%"></span></span>
387
+ <span class="dates">
388
+ ${e.startDate?tr(e.startDate):""}
389
+ ${e.endDate?s`- ${tr(e.endDate)}`:""}
390
+ </span>
391
+ </div>`}};L.styles=[f,y`
392
+ .wrap {
393
+ display: grid;
394
+ gap: var(--roxy-space-md, 1rem);
395
+ }
396
+ .head {
397
+ display: flex;
398
+ justify-content: space-between;
399
+ align-items: center;
400
+ flex-wrap: wrap;
401
+ gap: var(--roxy-space-sm, 0.5rem);
402
+ }
403
+ .title {
404
+ margin: 0;
405
+ font-size: var(--roxy-text-lg, 1.125rem);
406
+ font-weight: var(--roxy-weight-bold, 600);
407
+ }
408
+ .nakshatra {
409
+ color: var(--roxy-muted, #71717a);
410
+ font-size: var(--roxy-text-sm, 0.875rem);
411
+ }
412
+
413
+ .current {
414
+ display: grid;
415
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
416
+ gap: var(--roxy-space-md, 1rem);
417
+ background: var(--roxy-bg, #fff);
418
+ border: 1px solid var(--roxy-border, #e4e4e7);
419
+ border-radius: var(--roxy-radius-md, 8px);
420
+ padding: var(--roxy-space-md, 1rem);
421
+ box-shadow: var(--roxy-shadow-sm);
422
+ }
423
+ .current div span:first-child {
424
+ display: block;
425
+ color: var(--roxy-muted, #71717a);
426
+ font-size: var(--roxy-text-xs, 0.75rem);
427
+ text-transform: uppercase;
428
+ letter-spacing: 0.06em;
429
+ }
430
+ .current div strong {
431
+ font-size: var(--roxy-text-base, 1rem);
432
+ color: var(--roxy-fg, #0a0a0a);
433
+ }
434
+
435
+ .timeline {
436
+ display: grid;
437
+ gap: var(--roxy-space-xs, 0.25rem);
438
+ }
439
+ .bar {
440
+ display: grid;
441
+ grid-template-columns: 5rem 1fr 8rem;
442
+ gap: var(--roxy-space-sm, 0.5rem);
443
+ align-items: center;
444
+ font-size: var(--roxy-text-sm, 0.875rem);
445
+ }
446
+ .bar-track {
447
+ height: 14px;
448
+ background: var(--roxy-border, #e4e4e7);
449
+ border-radius: var(--roxy-radius-full, 9999px);
450
+ overflow: hidden;
451
+ }
452
+ .bar-track > span {
453
+ display: block;
454
+ height: 100%;
455
+ background: var(--roxy-accent, #f59e0b);
456
+ transition:
457
+ width var(--roxy-motion-duration, 200ms)
458
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
459
+ }
460
+ .dates {
461
+ color: var(--roxy-muted, #71717a);
462
+ font-size: var(--roxy-text-xs, 0.75rem);
463
+ font-variant-numeric: tabular-nums;
464
+ text-align: right;
465
+ }
466
+ `],d([p({attribute:!1})],L.prototype,"data",2),d([p({type:String,reflect:!0})],L.prototype,"period",2),L=d([x("roxy-dasha-timeline")],L);function tr(o){let t=o.match(/^(\d{4})/);return t?t[1]:o}var Nr=["title","name","label","heading","overview","summary"],Cr=["imageUrl","image","icon","symbol"],Dr=["imageUrl","image"],K=class extends g{constructor(){super(...arguments);this.data=null}render(){return this.data==null?s`<div class="roxy-empty" role="status">No data</div>`:s`<div
467
+ class="roxy-card"
468
+ aria-label="Generic data display"
469
+ >
470
+ ${this.renderValue(this.data)}
471
+ </div>`}renderValue(e){return e==null?l:typeof e=="string"?s`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?s`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?s`<div class="roxy-empty" role="status">Empty list</div>`:e.every(i=>i===null||["string","number","boolean"].includes(typeof i))?s`<ul class="roxy-chips">
472
+ ${e.map(i=>s`<li>${String(i)}</li>`)}
473
+ </ul>`:e.every(i=>i!==null&&typeof i=="object"&&!Array.isArray(i))?this.renderTable(e):s`<ol>
474
+ ${e.map(i=>s`<li>${this.renderValue(i)}</li>`)}
475
+ </ol>`}renderTable(e){let r=this.collectKeys(e);return s`<table class="roxy-table" role="table">
476
+ <thead>
477
+ <tr>
478
+ ${r.map(a=>s`<th>${this.humanize(a)}</th>`)}
479
+ </tr>
480
+ </thead>
481
+ <tbody>
482
+ ${e.map(a=>s`<tr>
483
+ ${r.map(i=>s`<td>${this.formatPrimitive(a[i])}</td>`)}
484
+ </tr>`)}
485
+ </tbody>
486
+ </table>`}renderObject(e){let r=Nr.find(c=>typeof e[c]=="string"),a=Cr.find(c=>typeof e[c]=="string"&&e[c].startsWith("http")),i=r!=="summary"&&typeof e.summary=="string"?"summary":null,n=Object.entries(e).filter(([c,m])=>c!==r&&c!==i&&!Dr.includes(c)&&m!==null&&m!==void 0);return s`
487
+ ${a?s`<img
488
+ class="roxy-image"
489
+ src=${String(e[a])}
490
+ alt=${r?String(e[r]):"illustration"}
491
+ loading="lazy"
492
+ />`:l}
493
+ ${r?s`<h3 class="roxy-title">${e[r]}</h3>`:l}
494
+ ${i?s`<p class="roxy-summary">${e[i]}</p>`:l}
495
+ ${n.length>0?s`<dl class="roxy-rows">
496
+ ${n.map(([c,m])=>s`
497
+ <dt>${this.humanize(c)}</dt>
498
+ <dd>${this.renderField(m)}</dd>
499
+ `)}
500
+ </dl>`:l}
501
+ `}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(a=>["string","number","boolean"].includes(typeof a))?s`<ul class="roxy-chips">
502
+ ${e.map(a=>s`<li>${String(a)}</li>`)}
503
+ </ul>`:s`<roxy-data .data=${e}></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let a of e)for(let i of Object.keys(a))r.add(i);return Array.from(r)}humanize(e){return e.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,r=>r.toUpperCase())}};K.styles=[f,y`
504
+ .roxy-card {
505
+ background: var(--roxy-bg, #fff);
506
+ border: 1px solid var(--roxy-border, #e4e4e7);
507
+ border-radius: var(--roxy-radius-md, 8px);
508
+ padding: var(--roxy-space-md, 1rem);
509
+ box-shadow: var(--roxy-shadow-sm);
510
+ }
511
+
512
+ .roxy-title {
513
+ font-size: var(--roxy-text-lg, 1.125rem);
514
+ font-weight: var(--roxy-weight-bold, 600);
515
+ margin: 0 0 var(--roxy-space-sm, 0.5rem) 0;
516
+ color: var(--roxy-primary, #0f172a);
517
+ letter-spacing: var(--roxy-tracking-tight);
518
+ }
519
+
520
+ .roxy-summary {
521
+ color: var(--roxy-secondary, #475569);
522
+ margin: 0 0 var(--roxy-space-md, 1rem) 0;
523
+ font-size: var(--roxy-text-sm, 0.875rem);
524
+ }
525
+
526
+ dl.roxy-rows {
527
+ margin: 0;
528
+ display: grid;
529
+ grid-template-columns: minmax(8ch, max-content) 1fr;
530
+ gap: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
531
+ }
532
+ dl.roxy-rows dt {
533
+ color: var(--roxy-muted, #71717a);
534
+ font-size: var(--roxy-text-sm, 0.875rem);
535
+ text-transform: capitalize;
536
+ }
537
+ dl.roxy-rows dd {
538
+ margin: 0;
539
+ color: var(--roxy-fg, #0a0a0a);
540
+ font-size: var(--roxy-text-sm, 0.875rem);
541
+ word-break: break-word;
542
+ }
543
+
544
+ ul.roxy-chips {
545
+ display: flex;
546
+ flex-wrap: wrap;
547
+ gap: var(--roxy-space-xs, 0.25rem);
548
+ padding: 0;
549
+ margin: 0;
550
+ list-style: none;
551
+ }
552
+ ul.roxy-chips li {
553
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
554
+ color: var(--roxy-fg, #0a0a0a);
555
+ padding: 2px 8px;
556
+ border-radius: var(--roxy-radius-full, 9999px);
557
+ font-size: var(--roxy-text-xs, 0.75rem);
558
+ }
559
+
560
+ table.roxy-table {
561
+ width: 100%;
562
+ border-collapse: collapse;
563
+ font-size: var(--roxy-text-sm, 0.875rem);
564
+ }
565
+ table.roxy-table th,
566
+ table.roxy-table td {
567
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
568
+ padding: var(--roxy-space-sm, 0.5rem);
569
+ text-align: left;
570
+ text-transform: none;
571
+ }
572
+ table.roxy-table th {
573
+ color: var(--roxy-muted, #71717a);
574
+ font-weight: var(--roxy-weight-bold, 600);
575
+ text-transform: capitalize;
576
+ font-size: var(--roxy-text-xs, 0.75rem);
577
+ letter-spacing: 0.04em;
578
+ }
579
+
580
+ .roxy-image {
581
+ max-width: 100%;
582
+ height: auto;
583
+ border-radius: var(--roxy-radius-md, 8px);
584
+ margin-bottom: var(--roxy-space-md, 1rem);
585
+ }
586
+
587
+ .roxy-section {
588
+ margin-bottom: var(--roxy-space-md, 1rem);
589
+ }
590
+ .roxy-section h4 {
591
+ font-size: var(--roxy-text-sm, 0.875rem);
592
+ font-weight: var(--roxy-weight-bold, 600);
593
+ color: var(--roxy-secondary, #475569);
594
+ margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
595
+ text-transform: capitalize;
596
+ }
597
+ `],d([p({attribute:!1})],K.prototype,"data",2),K=d([x("roxy-data")],K);var Or={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},N=class extends g{constructor(){super(...arguments);this.data=null;this.type="manglik"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,a=Or[this.type]??this.type,i=(e.severity??"").toLowerCase();return s`<article
598
+ class="card"
599
+ aria-label=${a}
600
+ >
601
+ <header class="head">
602
+ <h2 class="title">${a}</h2>
603
+ <div style="display:flex; gap:0.5rem; align-items:center;">
604
+ <span class=${`badge ${r?"present":"absent"}`}>
605
+ ${r?"Present":"Absent"}
606
+ </span>
607
+ ${e.severity?s`<span
608
+ class=${`severity ${i}`}
609
+ role="img"
610
+ aria-label=${`Severity ${e.severity}`}
611
+ >
612
+ <span></span><span></span><span></span>
613
+ </span>`:l}
614
+ </div>
615
+ </header>
616
+ ${e.description?s`<p class="description">${e.description}</p>`:l}
617
+ ${this.renderEffects(e.effects)}
618
+ ${e.remedies&&e.remedies.length>0?s`<div>
619
+ <h3>Remedies</h3>
620
+ <ul>
621
+ ${e.remedies.map(n=>s`<li>${n}</li>`)}
622
+ </ul>
623
+ </div>`:l}
624
+ ${e.exceptions&&e.exceptions.length>0?s`<div>
625
+ <h3>Exceptions</h3>
626
+ <ul>
627
+ ${e.exceptions.map(n=>s`<li>${n}</li>`)}
628
+ </ul>
629
+ </div>`:l}
630
+ </article>`}renderEffects(e){if(!e)return l;if(typeof e=="string")return s`<p>${e}</p>`;let r=Object.entries(e).filter(([,a])=>typeof a=="string"&&a.length>0);return r.length===0?l:s`<div class="effects">
631
+ ${r.map(([a,i])=>s`<div>
632
+ <h3>${a}</h3>
633
+ <p>${i}</p>
634
+ </div>`)}
635
+ </div>`}};N.styles=[f,y`
636
+ .card {
637
+ background: var(--roxy-bg, #fff);
638
+ border: 1px solid var(--roxy-border, #e4e4e7);
639
+ border-radius: var(--roxy-radius-md, 8px);
640
+ padding: var(--roxy-space-lg, 1.5rem);
641
+ box-shadow: var(--roxy-shadow-sm);
642
+ display: grid;
643
+ gap: var(--roxy-space-md, 1rem);
644
+ }
645
+ .head {
646
+ display: flex;
647
+ align-items: center;
648
+ justify-content: space-between;
649
+ gap: var(--roxy-space-md, 1rem);
650
+ flex-wrap: wrap;
651
+ }
652
+ .title {
653
+ margin: 0;
654
+ font-size: var(--roxy-text-lg, 1.125rem);
655
+ font-weight: var(--roxy-weight-bold, 600);
656
+ text-transform: capitalize;
657
+ }
658
+ .badge {
659
+ display: inline-flex;
660
+ align-items: center;
661
+ gap: var(--roxy-space-xs, 0.25rem);
662
+ padding: 4px 10px;
663
+ border-radius: var(--roxy-radius-full, 9999px);
664
+ font-size: var(--roxy-text-xs, 0.75rem);
665
+ font-weight: var(--roxy-weight-bold, 600);
666
+ text-transform: uppercase;
667
+ letter-spacing: 0.06em;
668
+ }
669
+ .badge.absent {
670
+ background: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);
671
+ color: var(--roxy-success, #16a34a);
672
+ }
673
+ .badge.present {
674
+ background: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);
675
+ color: var(--roxy-danger, #dc2626);
676
+ }
677
+ .severity {
678
+ display: flex;
679
+ align-items: center;
680
+ gap: 4px;
681
+ }
682
+ .severity span {
683
+ width: 14px;
684
+ height: 4px;
685
+ border-radius: 2px;
686
+ background: var(--roxy-border, #e4e4e7);
687
+ }
688
+ .severity.mild span:nth-child(1) {
689
+ background: var(--roxy-warning, #ea580c);
690
+ }
691
+ .severity.moderate span:nth-child(-n + 2) {
692
+ background: var(--roxy-warning, #ea580c);
693
+ }
694
+ .severity.severe span {
695
+ background: var(--roxy-danger, #dc2626);
696
+ }
697
+
698
+ .description {
699
+ margin: 0;
700
+ color: var(--roxy-fg, #0a0a0a);
701
+ }
702
+
703
+ h3 {
704
+ margin: 0 0 var(--roxy-space-xs, 0.25rem);
705
+ font-size: var(--roxy-text-xs, 0.75rem);
706
+ color: var(--roxy-muted, #71717a);
707
+ text-transform: uppercase;
708
+ letter-spacing: 0.06em;
709
+ }
710
+ ul {
711
+ margin: 0;
712
+ padding-left: var(--roxy-space-md, 1rem);
713
+ font-size: var(--roxy-text-sm, 0.875rem);
714
+ }
715
+ .effects {
716
+ display: grid;
717
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
718
+ gap: var(--roxy-space-md, 1rem);
719
+ }
720
+ .effects p {
721
+ margin: 0;
722
+ font-size: var(--roxy-text-sm, 0.875rem);
723
+ }
724
+ `],d([p({attribute:!1})],N.prototype,"data",2),d([p({type:String,reflect:!0})],N.prototype,"type",2),N=d([x("roxy-dosha-card")],N);var A=class extends g{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(a=>a.required).filter(a=>this.values[a.name]===void 0||this.values[a.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(a=>a.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){try{let e=await fetch(this.specUrl);if(!e.ok)throw new Error(`HTTP ${e.status}`);let r=await e.json(),a=`/${this.endpoint.replace(/^\//,"")}`,i=r.paths?.[a]?.[this.method.toLowerCase()];if(!i)return;let n=r.components?.schemas??{},c=[],m;if(i.requestBody){let h=i.requestBody.content?.["application/json"]?.schema;m=this.resolve(h,n)}if(m?.properties){let h=new Set(m.required??[]);for(let[v,S]of Object.entries(m.properties)){let w=this.resolve(S,n)??{};c.push({name:v,type:this.fieldType(w),required:h.has(v),description:w.description,enum:w.enum,min:w.minimum,max:w.maximum,default:w.default})}}for(let h of i.parameters??[])if(h.in==="path"||h.in==="query"){let v=this.resolve(h.schema,n)??{};c.push({name:h.name,type:this.fieldType(v),required:!!h.required,description:v.description,enum:v.enum,default:v.default})}this.fields=c,this.hasLocation=c.some(h=>h.name==="latitude")&&c.some(h=>h.name==="longitude")&&c.some(h=>h.name==="timezone");let u={};for(let h of c)h.default!==void 0&&(u[h.name]=h.default);this.values=u,this.loaded=!0}catch{this.loaded=!0}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let a=e.$ref.split("/").pop();return a?r[a]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return s`<form><div class="roxy-skeleton" style="height: 8rem"></div></form>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return l;let a=`roxy-form-${r.name}`;return s`<div class="field">
725
+ <label for=${a}>
726
+ ${ar(r.name)}${r.required?s`<span class="req" aria-hidden="true">*</span>`:l}
727
+ </label>
728
+ ${r.enum?s`<select
729
+ id=${a}
730
+ ?required=${r.required}
731
+ @change=${i=>this.setValue(r.name,i.target.value)}
732
+ >
733
+ <option value="">Choose</option>
734
+ ${r.enum.map(i=>s`<option value=${i} ?selected=${this.values[r.name]===i}>
735
+ ${i}
736
+ </option>`)}
737
+ </select>`:s`<input
738
+ id=${a}
739
+ type=${this.htmlType(r.type)}
740
+ ?required=${r.required}
741
+ min=${r.min??""}
742
+ max=${r.max??""}
743
+ step=${r.type==="number"?"any":""}
744
+ .value=${this.values[r.name]??""}
745
+ @input=${i=>this.setValue(r.name,this.coerce(r.type,i.target.value))}
746
+ />`}
747
+ ${r.description?s`<small class="help">${r.description}</small>`:l}
748
+ </div>`};return s`<form @submit=${this.onSubmit}>
749
+ <h2 class="title">${ar(this.endpoint.split("/").pop()??"")}</h2>
750
+ ${this.hasLocation?s`<div class="location-block">
751
+ <label>Birth location</label>
752
+ <roxy-location-search
753
+ @roxy-location-select=${this.onLocation}
754
+ placeholder="City of birth"
755
+ ></roxy-location-search>
756
+ <small class="help">
757
+ Required: latitude, longitude, timezone. Pick a city to autofill.
758
+ </small>
759
+ </div>`:l}
760
+ <div class="fields">
761
+ ${this.fields.map(r=>e(r))}
762
+ </div>
763
+ <button class="submit" type="submit">${this.submitLabel}</button>
764
+ </form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let a=Number(r);return Number.isFinite(a)?a:void 0}return r}}};A.styles=[f,y`
765
+ form {
766
+ display: grid;
767
+ gap: var(--roxy-space-md, 1rem);
768
+ background: var(--roxy-bg, #fff);
769
+ border: 1px solid var(--roxy-border, #e4e4e7);
770
+ border-radius: var(--roxy-radius-md, 8px);
771
+ padding: var(--roxy-space-lg, 1.5rem);
772
+ box-shadow: var(--roxy-shadow-sm);
773
+ }
774
+ .title {
775
+ margin: 0;
776
+ font-size: var(--roxy-text-lg, 1.125rem);
777
+ font-weight: var(--roxy-weight-bold, 600);
778
+ }
779
+ .fields {
780
+ display: grid;
781
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
782
+ gap: var(--roxy-space-md, 1rem);
783
+ }
784
+ .field {
785
+ display: grid;
786
+ gap: var(--roxy-space-xs, 0.25rem);
787
+ }
788
+ label {
789
+ font-size: var(--roxy-text-sm, 0.875rem);
790
+ color: var(--roxy-secondary, #475569);
791
+ }
792
+ label .req {
793
+ color: var(--roxy-danger, #dc2626);
794
+ margin-left: 4px;
795
+ }
796
+ input,
797
+ select {
798
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
799
+ font-size: var(--roxy-text-base, 1rem);
800
+ font-family: inherit;
801
+ color: var(--roxy-fg, #0a0a0a);
802
+ background: var(--roxy-bg, #fff);
803
+ border: 1px solid var(--roxy-border, #e4e4e7);
804
+ border-radius: var(--roxy-radius-md, 8px);
805
+ }
806
+ input:focus,
807
+ select:focus {
808
+ outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
809
+ outline-offset: 2px;
810
+ border-color: var(--roxy-accent-fg, #b45309);
811
+ }
812
+ .help {
813
+ color: var(--roxy-muted, #71717a);
814
+ font-size: var(--roxy-text-xs, 0.75rem);
815
+ }
816
+ .location-block {
817
+ display: grid;
818
+ gap: var(--roxy-space-xs, 0.25rem);
819
+ grid-column: 1 / -1;
820
+ }
821
+ .coords {
822
+ display: grid;
823
+ grid-template-columns: repeat(3, 1fr);
824
+ gap: var(--roxy-space-sm, 0.5rem);
825
+ }
826
+ .coords input {
827
+ font-size: var(--roxy-text-sm, 0.875rem);
828
+ }
829
+ button.submit {
830
+ justify-self: start;
831
+ background: var(--roxy-accent-fg, #b45309);
832
+ color: #fff;
833
+ border: 0;
834
+ border-radius: var(--roxy-radius-md, 8px);
835
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-lg, 1.5rem);
836
+ font-size: var(--roxy-text-base, 1rem);
837
+ font-weight: var(--roxy-weight-bold, 600);
838
+ cursor: pointer;
839
+ transition:
840
+ transform var(--roxy-motion-duration, 200ms)
841
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
842
+ }
843
+ button.submit:hover {
844
+ transform: scale(1.02);
845
+ }
846
+ button.submit:focus-visible {
847
+ outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
848
+ outline-offset: 2px;
849
+ }
850
+ `],d([p({type:String,attribute:"data-endpoint"})],A.prototype,"endpoint",2),d([p({type:String})],A.prototype,"method",2),d([p({type:String,attribute:"spec-url"})],A.prototype,"specUrl",2),d([p({type:String,attribute:"submit-label"})],A.prototype,"submitLabel",2),d([_()],A.prototype,"fields",2),d([_()],A.prototype,"values",2),d([_()],A.prototype,"hasLocation",2),d([_()],A.prototype,"loaded",2),A=d([x("roxy-endpoint-form")],A);function ar(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,t=>t.toUpperCase())}var G=class extends g{constructor(){super(...arguments);this.data=null}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=e.total??e.totalScore??0,a=e.maxScore??36,i=(e.breakdown??[]).filter(n=>n&&(n.name||n.score!==void 0));return s`<article class="card" aria-label="Guna Milan score">
851
+ <div class="score-bar">
852
+ <div>
853
+ <span class="total">${r}</span>
854
+ <span class="over"> / ${a}</span>
855
+ ${typeof e.percentage=="number"?s`<small style="margin-left: 0.5rem; color: var(--roxy-muted)">
856
+ ${e.percentage}%
857
+ </small>`:l}
858
+ </div>
859
+ ${e.recommendation?s`<span class="recommendation">${e.recommendation}</span>`:l}
860
+ </div>
861
+
862
+ ${i.length>0?s`<table>
863
+ <thead>
864
+ <tr>
865
+ <th>Category</th>
866
+ <th>Progress</th>
867
+ <th class="score">Score</th>
868
+ </tr>
869
+ </thead>
870
+ <tbody>
871
+ ${i.map(n=>{let c=n.score??0,m=n.max??n.maxScore??Hr(n.name),u=m?c/m*100:0;return s`<tr>
872
+ <td>${n.name??""}</td>
873
+ <td class="bar-cell">
874
+ <div class="mini-bar">
875
+ <span style="width: ${u}%"></span>
876
+ </div>
877
+ </td>
878
+ <td class="score">${c} / ${m}</td>
879
+ </tr>`})}
880
+ </tbody>
881
+ </table>`:l}
882
+ ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?s`<div class="tags">
883
+ ${e.doshas?.map(n=>s`<span class="dosha">${n}</span>`)}
884
+ ${e.doshaCancellations?.map(n=>s`<span class="cancel">${n}</span>`)}
885
+ </div>`:l}
886
+ </article>`}};G.styles=[f,y`
887
+ .card {
888
+ background: var(--roxy-bg, #fff);
889
+ border: 1px solid var(--roxy-border, #e4e4e7);
890
+ border-radius: var(--roxy-radius-md, 8px);
891
+ padding: var(--roxy-space-lg, 1.5rem);
892
+ box-shadow: var(--roxy-shadow-sm);
893
+ display: grid;
894
+ gap: var(--roxy-space-md, 1rem);
895
+ }
896
+
897
+ .score-bar {
898
+ display: grid;
899
+ grid-template-columns: 1fr auto;
900
+ align-items: center;
901
+ gap: var(--roxy-space-md, 1rem);
902
+ }
903
+ .total {
904
+ font-size: 2.25rem;
905
+ font-weight: var(--roxy-weight-bold, 600);
906
+ color: var(--roxy-accent-fg, #b45309);
907
+ font-variant-numeric: tabular-nums;
908
+ line-height: 1;
909
+ }
910
+ .over {
911
+ color: var(--roxy-muted, #71717a);
912
+ font-size: var(--roxy-text-base, 1rem);
913
+ }
914
+ .recommendation {
915
+ font-size: var(--roxy-text-sm, 0.875rem);
916
+ color: var(--roxy-secondary, #475569);
917
+ }
918
+
919
+ table {
920
+ width: 100%;
921
+ border-collapse: collapse;
922
+ font-size: var(--roxy-text-sm, 0.875rem);
923
+ }
924
+ th,
925
+ td {
926
+ padding: var(--roxy-space-sm, 0.5rem);
927
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
928
+ text-align: left;
929
+ }
930
+ th {
931
+ color: var(--roxy-muted, #71717a);
932
+ font-weight: var(--roxy-weight-bold, 600);
933
+ text-transform: uppercase;
934
+ font-size: var(--roxy-text-xs, 0.75rem);
935
+ letter-spacing: 0.06em;
936
+ }
937
+ td.score {
938
+ text-align: right;
939
+ font-variant-numeric: tabular-nums;
940
+ color: var(--roxy-fg, #0a0a0a);
941
+ font-weight: var(--roxy-weight-bold, 600);
942
+ }
943
+ td.bar-cell {
944
+ width: 30%;
945
+ }
946
+ .mini-bar {
947
+ height: 8px;
948
+ background: var(--roxy-border, #e4e4e7);
949
+ border-radius: var(--roxy-radius-full, 9999px);
950
+ overflow: hidden;
951
+ }
952
+ .mini-bar > span {
953
+ display: block;
954
+ height: 100%;
955
+ background: var(--roxy-accent, #f59e0b);
956
+ transition:
957
+ width var(--roxy-motion-duration, 200ms)
958
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
959
+ }
960
+
961
+ .tags {
962
+ display: flex;
963
+ flex-wrap: wrap;
964
+ gap: var(--roxy-space-xs, 0.25rem);
965
+ }
966
+ .tags span {
967
+ padding: 2px 8px;
968
+ border-radius: var(--roxy-radius-full, 9999px);
969
+ font-size: var(--roxy-text-xs, 0.75rem);
970
+ }
971
+ .tags .dosha {
972
+ background: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);
973
+ color: var(--roxy-danger, #dc2626);
974
+ }
975
+ .tags .cancel {
976
+ background: color-mix(in srgb, var(--roxy-success, #16a34a) 18%, transparent);
977
+ color: var(--roxy-success, #16a34a);
978
+ }
979
+ `],d([p({attribute:!1})],G.prototype,"data",2),G=d([x("roxy-guna-milan")],G);function Hr(o){if(!o)return 1;switch(o.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var xe={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"},sr={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},re={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},ir={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"};var Ne={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},nr={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var C=class extends g{constructor(){super(...arguments);this.data=null;this.mode="lookup"}getHexagram(){return this.data?"hexagram"in this.data&&this.data.hexagram?{...this.data.hexagram,lines:this.data.lines,changingLinePositions:this.data.changingLinePositions}:this.data:null}render(){let e=this.getHexagram();if(!e)return s`<div class="roxy-empty" role="status">No hexagram data</div>`;let r=e.lines??this.derivedLines(e),a=new Set(e.changingLinePositions??[]);return s`<article class="card" aria-label="I Ching hexagram">
980
+ <div class="glyphs">
981
+ ${e.symbol?s`<div class="symbol">${e.symbol}</div>`:l}
982
+ <div class="lines" aria-hidden="true">
983
+ ${r.slice().reverse().map((i,n)=>{let c=r.length-1-n+1,m=a.has(c),u=i===6||i===8;return s`<div class="line ${`${u?"broken":"solid"}${m?" changing":""}`}">
984
+ ${u?$`<span class="seg"></span><span class="seg"></span>`:$`<span class="seg"></span>`}
985
+ </div>`})}
986
+ </div>
987
+ </div>
988
+ <div>
989
+ <h2 class="title">
990
+ ${e.number?s`${e.number}. `:l}${e.english??e.chinese??"Hexagram"}
991
+ </h2>
992
+ <p class="subtitle">
993
+ ${e.chinese?s`${e.chinese}`:l}
994
+ ${e.pinyin?s` · ${e.pinyin}`:l}
995
+ </p>
996
+ <div class="trigrams">
997
+ ${e.upperTrigram?s`<div>
998
+ Upper
999
+ <span class="tri-glyph"
1000
+ >${Ne[e.upperTrigram]??""}</span
1001
+ >${e.upperTrigram}
1002
+ </div>`:l}
1003
+ ${e.lowerTrigram?s`<div>
1004
+ Lower
1005
+ <span class="tri-glyph"
1006
+ >${Ne[e.lowerTrigram]??""}</span
1007
+ >${e.lowerTrigram}
1008
+ </div>`:l}
1009
+ </div>
1010
+ ${e.judgment?s`<p class="judgment">${e.judgment}</p>`:l}
1011
+ ${e.image?s`<p class="image">${e.image}</p>`:l}
1012
+ ${e.dailyMessage?s`<p class="message">${e.dailyMessage}</p>`:l}
1013
+ ${e.interpretation?.general?s`<p>${e.interpretation.general}</p>`:l}
1014
+ ${a.size>0?s`<div class="changing">
1015
+ Changing lines: ${Array.from(a).sort((i,n)=>i-n).join(", ")}.
1016
+ ${e.resultingHexagram?.english?s` Becomes hexagram ${e.resultingHexagram.number}
1017
+ ${e.resultingHexagram.english}.`:l}
1018
+ </div>`:l}
1019
+ </div>
1020
+ </article>`}derivedLines(e){if(!e.symbol)return Array.from({length:6},()=>7);let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let a=r-19904,i=[];for(let n=0;n<6;n++){let c=a>>n&1;i.push(c?8:7)}return i}return Array.from({length:6},()=>7)}};C.styles=[f,y`
1021
+ .card {
1022
+ background: var(--roxy-bg, #fff);
1023
+ border: 1px solid var(--roxy-border, #e4e4e7);
1024
+ border-radius: var(--roxy-radius-md, 8px);
1025
+ padding: var(--roxy-space-lg, 1.5rem);
1026
+ box-shadow: var(--roxy-shadow-sm);
1027
+ display: grid;
1028
+ grid-template-columns: 6rem 1fr;
1029
+ gap: var(--roxy-space-lg, 1.5rem);
1030
+ }
1031
+
1032
+ @container (max-width: 480px) {
1033
+ .card {
1034
+ grid-template-columns: 1fr;
1035
+ }
1036
+ }
1037
+
1038
+ .glyphs {
1039
+ display: grid;
1040
+ gap: var(--roxy-space-md, 1rem);
1041
+ justify-items: center;
1042
+ }
1043
+ .symbol {
1044
+ font-size: 3rem;
1045
+ line-height: 1;
1046
+ color: var(--roxy-accent-fg, #b45309);
1047
+ }
1048
+ .lines {
1049
+ display: grid;
1050
+ gap: 4px;
1051
+ width: 4rem;
1052
+ }
1053
+ .line {
1054
+ display: flex;
1055
+ gap: 4px;
1056
+ justify-content: center;
1057
+ align-items: center;
1058
+ height: 8px;
1059
+ }
1060
+ .seg {
1061
+ display: block;
1062
+ height: 6px;
1063
+ background: var(--roxy-fg, #0a0a0a);
1064
+ border-radius: 1px;
1065
+ }
1066
+ .line.broken .seg {
1067
+ width: 1.4rem;
1068
+ }
1069
+ .line.solid .seg {
1070
+ width: 3rem;
1071
+ }
1072
+ .line.changing .seg {
1073
+ background: var(--roxy-accent, #f59e0b);
1074
+ }
1075
+
1076
+ .title {
1077
+ margin: 0;
1078
+ font-size: var(--roxy-text-xl, 1.5rem);
1079
+ font-weight: var(--roxy-weight-bold, 600);
1080
+ letter-spacing: var(--roxy-tracking-tight);
1081
+ }
1082
+ .subtitle {
1083
+ color: var(--roxy-muted, #71717a);
1084
+ font-size: var(--roxy-text-sm, 0.875rem);
1085
+ margin: 0 0 var(--roxy-space-sm, 0.5rem);
1086
+ }
1087
+ .trigrams {
1088
+ display: flex;
1089
+ gap: var(--roxy-space-md, 1rem);
1090
+ margin-bottom: var(--roxy-space-sm, 0.5rem);
1091
+ color: var(--roxy-secondary, #475569);
1092
+ font-size: var(--roxy-text-xs, 0.75rem);
1093
+ text-transform: uppercase;
1094
+ letter-spacing: 0.06em;
1095
+ }
1096
+ .tri-glyph {
1097
+ font-size: var(--roxy-text-xl, 1.5rem);
1098
+ color: var(--roxy-accent-fg, #b45309);
1099
+ margin-right: 4px;
1100
+ vertical-align: middle;
1101
+ }
1102
+ .judgment,
1103
+ .image,
1104
+ .message {
1105
+ margin: 0 0 var(--roxy-space-sm, 0.5rem);
1106
+ font-size: var(--roxy-text-sm, 0.875rem);
1107
+ color: var(--roxy-fg, #0a0a0a);
1108
+ }
1109
+ .judgment::before {
1110
+ content: 'Judgment. ';
1111
+ font-weight: var(--roxy-weight-bold, 600);
1112
+ color: var(--roxy-secondary, #475569);
1113
+ }
1114
+ .image::before {
1115
+ content: 'Image. ';
1116
+ font-weight: var(--roxy-weight-bold, 600);
1117
+ color: var(--roxy-secondary, #475569);
1118
+ }
1119
+
1120
+ .changing {
1121
+ margin-top: var(--roxy-space-md, 1rem);
1122
+ padding-top: var(--roxy-space-md, 1rem);
1123
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
1124
+ color: var(--roxy-accent-fg, #b45309);
1125
+ font-size: var(--roxy-text-sm, 0.875rem);
1126
+ }
1127
+ `],d([p({attribute:!1})],C.prototype,"data",2),d([p({type:String,reflect:!0})],C.prototype,"mode",2),C=d([x("roxy-hexagram")],C);var D=class extends g{constructor(){super(...arguments);this.data=null;this.period="daily"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",a=r?re[jr(r)]??"":"",i=typeof e.energyRating=="number"?e.energyRating:null,n=e.date??e.week??e.month??"";return s`<article
1128
+ class="card"
1129
+ aria-label=${`${this.period} horoscope for ${r}`}
1130
+ >
1131
+ <header class="head">
1132
+ <span class="glyph" aria-hidden="true">${a}</span>
1133
+ <div>
1134
+ <h2 class="title">${r} ${this.period}</h2>
1135
+ ${n?s`<div class="date">${n}</div>`:l}
1136
+ </div>
1137
+ ${i!==null?s`<span class="energy" aria-label=${`Energy ${i} of 10`}>
1138
+ Energy ${i}/10
1139
+ <span class="energy-bar"
1140
+ ><span style="width: ${i/10*100}%"></span
1141
+ ></span>
1142
+ </span>`:l}
1143
+ </header>
1144
+
1145
+ ${e.overview?s`<p class="overview">${e.overview}</p>`:l}
1146
+
1147
+ <div class="sections">
1148
+ ${e.love?s`<div class="section">
1149
+ <h3>Love</h3>
1150
+ <p>${e.love}</p>
1151
+ </div>`:l}
1152
+ ${e.career?s`<div class="section">
1153
+ <h3>Career</h3>
1154
+ <p>${e.career}</p>
1155
+ </div>`:l}
1156
+ ${e.health?s`<div class="section">
1157
+ <h3>Health</h3>
1158
+ <p>${e.health}</p>
1159
+ </div>`:l}
1160
+ ${e.finance?s`<div class="section">
1161
+ <h3>Finance</h3>
1162
+ <p>${e.finance}</p>
1163
+ </div>`:l}
1164
+ ${e.advice?s`<div class="section">
1165
+ <h3>Advice</h3>
1166
+ <p>${e.advice}</p>
1167
+ </div>`:l}
1168
+ </div>
1169
+
1170
+ ${e.luckyNumber||e.luckyColor||(e.compatibleSigns?.length??0)>0?s`<div class="lucky">
1171
+ ${e.luckyNumber!==void 0?s`<span>Lucky number <strong>${e.luckyNumber}</strong></span>`:l}
1172
+ ${e.luckyColor?s`<span>Lucky color <strong>${e.luckyColor}</strong></span>`:l}
1173
+ ${e.luckyNumbers?.length?s`<span
1174
+ >Lucky numbers
1175
+ <strong>${e.luckyNumbers.join(", ")}</strong></span
1176
+ >`:l}
1177
+ ${e.luckyDays?.length?s`<span
1178
+ >Lucky days <strong>${e.luckyDays.join(", ")}</strong></span
1179
+ >`:l}
1180
+ ${e.compatibleSigns?.length?s`<span class="compat-wrap">
1181
+ Best with
1182
+ <span class="compat"
1183
+ >${e.compatibleSigns.map(c=>s`<span>${c}</span>`)}</span
1184
+ >
1185
+ </span>`:l}
1186
+ </div>`:l}
1187
+ </article>`}};D.styles=[f,y`
1188
+ .card {
1189
+ background: var(--roxy-bg, #fff);
1190
+ border: 1px solid var(--roxy-border, #e4e4e7);
1191
+ border-radius: var(--roxy-radius-md, 8px);
1192
+ padding: var(--roxy-space-lg, 1.5rem);
1193
+ box-shadow: var(--roxy-shadow-sm);
1194
+ display: grid;
1195
+ gap: var(--roxy-space-md, 1rem);
1196
+ }
1197
+
1198
+ .head {
1199
+ display: flex;
1200
+ align-items: center;
1201
+ gap: var(--roxy-space-md, 1rem);
1202
+ }
1203
+
1204
+ .glyph {
1205
+ font-size: 2.25rem;
1206
+ color: var(--roxy-accent-fg, #b45309);
1207
+ line-height: 1;
1208
+ }
1209
+
1210
+ .title {
1211
+ font-size: var(--roxy-text-xl, 1.5rem);
1212
+ font-weight: var(--roxy-weight-bold, 600);
1213
+ margin: 0;
1214
+ letter-spacing: var(--roxy-tracking-tight);
1215
+ text-transform: capitalize;
1216
+ }
1217
+
1218
+ .date {
1219
+ font-size: var(--roxy-text-sm, 0.875rem);
1220
+ color: var(--roxy-muted, #71717a);
1221
+ }
1222
+
1223
+ .energy {
1224
+ margin-left: auto;
1225
+ font-variant-numeric: tabular-nums;
1226
+ font-size: var(--roxy-text-sm, 0.875rem);
1227
+ color: var(--roxy-secondary, #475569);
1228
+ }
1229
+ .energy-bar {
1230
+ display: inline-block;
1231
+ width: 6rem;
1232
+ height: 6px;
1233
+ background: var(--roxy-border, #e4e4e7);
1234
+ border-radius: var(--roxy-radius-full, 9999px);
1235
+ overflow: hidden;
1236
+ margin-left: 6px;
1237
+ vertical-align: middle;
1238
+ }
1239
+ .energy-bar > span {
1240
+ display: block;
1241
+ height: 100%;
1242
+ background: var(--roxy-accent, #f59e0b);
1243
+ transition:
1244
+ width var(--roxy-motion-duration, 200ms)
1245
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
1246
+ }
1247
+
1248
+ .overview {
1249
+ font-size: var(--roxy-text-base, 1rem);
1250
+ color: var(--roxy-fg, #0a0a0a);
1251
+ margin: 0;
1252
+ }
1253
+
1254
+ .sections {
1255
+ display: grid;
1256
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
1257
+ gap: var(--roxy-space-md, 1rem);
1258
+ }
1259
+
1260
+ .section h3 {
1261
+ margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
1262
+ font-size: var(--roxy-text-xs, 0.75rem);
1263
+ color: var(--roxy-muted, #71717a);
1264
+ font-weight: var(--roxy-weight-bold, 600);
1265
+ text-transform: uppercase;
1266
+ letter-spacing: 0.06em;
1267
+ }
1268
+ .section p {
1269
+ margin: 0;
1270
+ font-size: var(--roxy-text-sm, 0.875rem);
1271
+ color: var(--roxy-fg, #0a0a0a);
1272
+ }
1273
+
1274
+ .lucky {
1275
+ display: flex;
1276
+ flex-wrap: wrap;
1277
+ gap: var(--roxy-space-sm, 0.5rem);
1278
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
1279
+ padding-top: var(--roxy-space-md, 1rem);
1280
+ font-size: var(--roxy-text-sm, 0.875rem);
1281
+ color: var(--roxy-secondary, #475569);
1282
+ }
1283
+
1284
+ .lucky strong {
1285
+ color: var(--roxy-fg, #0a0a0a);
1286
+ font-weight: var(--roxy-weight-bold, 600);
1287
+ }
1288
+
1289
+ .compat {
1290
+ display: flex;
1291
+ flex-wrap: wrap;
1292
+ gap: var(--roxy-space-xs, 0.25rem);
1293
+ }
1294
+ .compat span {
1295
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 16%, transparent);
1296
+ color: var(--roxy-fg, #0a0a0a);
1297
+ padding: 2px 8px;
1298
+ border-radius: var(--roxy-radius-full, 9999px);
1299
+ font-size: var(--roxy-text-xs, 0.75rem);
1300
+ text-transform: capitalize;
1301
+ }
1302
+ `],d([p({attribute:!1})],D.prototype,"data",2),d([p({type:String,reflect:!0})],D.prototype,"period",2),D=d([x("roxy-horoscope-card")],D);function jr(o){return o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()}var Y=class extends g{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return s`<div
1303
+ class="wrap"
1304
+ aria-label="KP planets table"
1305
+ tabindex="0"
1306
+ >
1307
+ <header class="head">
1308
+ <h2 class="title">KP planets</h2>
1309
+ ${this.data.ayanamsa?s`<span class="ayanamsa">Ayanamsa: ${this.data.ayanamsa}</span>`:l}
1310
+ </header>
1311
+ <table role="table">
1312
+ <thead>
1313
+ <tr>
1314
+ <th scope="col">Planet</th>
1315
+ <th scope="col">Sign</th>
1316
+ <th scope="col">Sign lord</th>
1317
+ <th scope="col">Nakshatra</th>
1318
+ <th scope="col">Star lord</th>
1319
+ <th scope="col">Sub lord</th>
1320
+ <th scope="col">Sub sub lord</th>
1321
+ <th scope="col">KP no.</th>
1322
+ </tr>
1323
+ </thead>
1324
+ <tbody>
1325
+ ${e.map(r=>s`<tr>
1326
+ <td class="planet">
1327
+ ${r.planet??r.name??""}
1328
+ ${r.retrograde?s`<span class="retro">R</span>`:l}
1329
+ </td>
1330
+ <td>${r.sign??""}</td>
1331
+ <td>${r.signLord??""}</td>
1332
+ <td>${r.nakshatra??""}</td>
1333
+ <td>${r.starLord??r.nakshatraLord??""}</td>
1334
+ <td>${r.subLord??""}</td>
1335
+ <td>${r.subSubLord??""}</td>
1336
+ <td>${r.kpNumber??""}</td>
1337
+ </tr>`)}
1338
+ </tbody>
1339
+ </table>
1340
+ </div>`}};Y.styles=[f,y`
1341
+ .wrap {
1342
+ border: 1px solid var(--roxy-border, #e4e4e7);
1343
+ border-radius: var(--roxy-radius-md, 8px);
1344
+ background: var(--roxy-bg, #fff);
1345
+ overflow: auto;
1346
+ box-shadow: var(--roxy-shadow-sm);
1347
+ }
1348
+ .head {
1349
+ padding: var(--roxy-space-md, 1rem);
1350
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
1351
+ display: flex;
1352
+ justify-content: space-between;
1353
+ flex-wrap: wrap;
1354
+ gap: var(--roxy-space-sm, 0.5rem);
1355
+ }
1356
+ .title {
1357
+ margin: 0;
1358
+ font-size: var(--roxy-text-lg, 1.125rem);
1359
+ font-weight: var(--roxy-weight-bold, 600);
1360
+ }
1361
+ .ayanamsa {
1362
+ color: var(--roxy-muted, #71717a);
1363
+ font-size: var(--roxy-text-sm, 0.875rem);
1364
+ }
1365
+ table {
1366
+ width: 100%;
1367
+ border-collapse: collapse;
1368
+ font-size: var(--roxy-text-sm, 0.875rem);
1369
+ min-width: 560px;
1370
+ }
1371
+ thead {
1372
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 20%, transparent);
1373
+ }
1374
+ th,
1375
+ td {
1376
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
1377
+ text-align: left;
1378
+ white-space: nowrap;
1379
+ }
1380
+ th {
1381
+ color: var(--roxy-muted, #71717a);
1382
+ font-weight: var(--roxy-weight-bold, 600);
1383
+ text-transform: uppercase;
1384
+ font-size: var(--roxy-text-xs, 0.75rem);
1385
+ letter-spacing: 0.04em;
1386
+ }
1387
+ tbody tr {
1388
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
1389
+ }
1390
+ td.planet {
1391
+ font-weight: var(--roxy-weight-bold, 600);
1392
+ color: var(--roxy-fg, #0a0a0a);
1393
+ }
1394
+ .retro {
1395
+ color: var(--roxy-warning, #ea580c);
1396
+ font-size: var(--roxy-text-xs, 0.75rem);
1397
+ margin-left: 4px;
1398
+ }
1399
+ `],d([p({attribute:!1})],Y.prototype,"data",2),Y=d([x("roxy-kp-planets-table")],Y);function or(o,t){let e;return((...r)=>{e&&clearTimeout(e),e=setTimeout(()=>o(...r),t)})}var k=class extends g{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.debouncedFetch=or(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler)}async fetchResults(e){this.isLoading=!0;try{let r=new URL(this.endpoint);r.searchParams.set("q",e),r.searchParams.set("limit","8");let a={Accept:"application/json"};this.apiKey&&(a["X-API-Key"]=this.apiKey),this.publishableKey&&(a["X-API-Key"]=this.publishableKey);let i=await fetch(r,{headers:a});if(!i.ok)throw new Error(`HTTP ${i.status}`);let n=await i.json();this.results=n.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch{this.results=[],this.isOpen=!1}finally{this.isLoading=!1}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return s`<div class="field">
1400
+ <input
1401
+ type="text"
1402
+ role="combobox"
1403
+ aria-expanded=${this.isOpen?"true":"false"}
1404
+ aria-controls="roxy-location-listbox"
1405
+ aria-autocomplete="list"
1406
+ autocomplete="off"
1407
+ placeholder=${this.placeholder}
1408
+ .value=${this.query}
1409
+ @input=${this.onInput}
1410
+ @keydown=${this.onKeyDown}
1411
+ @focus=${()=>{this.results.length>0&&(this.isOpen=!0)}}
1412
+ />
1413
+ ${this.isLoading?s`<span class="spinner" role="status" aria-label="Loading"></span>`:l}
1414
+ ${this.isOpen?s`<ul
1415
+ id="roxy-location-listbox"
1416
+ class="results"
1417
+ role="listbox"
1418
+ >
1419
+ ${this.results.length===0?s`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>s`<li role="presentation">
1420
+ <button
1421
+ type="button"
1422
+ class="option"
1423
+ role="option"
1424
+ aria-selected=${this.highlight===r?"true":"false"}
1425
+ @click=${()=>this.select(e)}
1426
+ @mouseenter=${()=>{this.highlight=r}}
1427
+ >
1428
+ <span class="city">${e.city}</span>
1429
+ <span class="where"
1430
+ >${e.province?s`${e.province}, `:""}${e.country}</span
1431
+ >
1432
+ <span class="tz"
1433
+ >UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span
1434
+ >
1435
+ </button>
1436
+ </li>`)}
1437
+ </ul>`:l}
1438
+ </div>`}};k.styles=[f,y`
1439
+ :host {
1440
+ display: block;
1441
+ position: relative;
1442
+ }
1443
+ .field {
1444
+ position: relative;
1445
+ }
1446
+ input {
1447
+ width: 100%;
1448
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
1449
+ font-size: var(--roxy-text-base, 1rem);
1450
+ font-family: inherit;
1451
+ color: var(--roxy-fg, #0a0a0a);
1452
+ background: var(--roxy-bg, #fff);
1453
+ border: 1px solid var(--roxy-border, #e4e4e7);
1454
+ border-radius: var(--roxy-radius-md, 8px);
1455
+ transition:
1456
+ border-color var(--roxy-motion-duration, 200ms)
1457
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
1458
+ box-sizing: border-box;
1459
+ }
1460
+ input:focus {
1461
+ outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
1462
+ outline-offset: 2px;
1463
+ border-color: var(--roxy-accent-fg, #b45309);
1464
+ }
1465
+ .spinner {
1466
+ position: absolute;
1467
+ right: 12px;
1468
+ top: 50%;
1469
+ transform: translateY(-50%);
1470
+ width: 14px;
1471
+ height: 14px;
1472
+ border: 2px solid var(--roxy-muted, #71717a);
1473
+ border-top-color: transparent;
1474
+ border-radius: 50%;
1475
+ animation: roxy-spin 700ms linear infinite;
1476
+ }
1477
+ @keyframes roxy-spin {
1478
+ to {
1479
+ transform: translateY(-50%) rotate(360deg);
1480
+ }
1481
+ }
1482
+ @media (prefers-reduced-motion: reduce) {
1483
+ .spinner {
1484
+ animation: none;
1485
+ }
1486
+ }
1487
+
1488
+ .results {
1489
+ position: absolute;
1490
+ z-index: 50;
1491
+ top: calc(100% + 4px);
1492
+ left: 0;
1493
+ right: 0;
1494
+ background: var(--roxy-bg, #fff);
1495
+ border: 1px solid var(--roxy-border, #e4e4e7);
1496
+ border-radius: var(--roxy-radius-md, 8px);
1497
+ box-shadow: var(--roxy-shadow-md);
1498
+ max-height: 22rem;
1499
+ overflow-y: auto;
1500
+ animation: roxy-fade-in var(--roxy-motion-duration, 200ms)
1501
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
1502
+ }
1503
+ .option {
1504
+ display: flex;
1505
+ align-items: baseline;
1506
+ gap: var(--roxy-space-sm, 0.5rem);
1507
+ width: 100%;
1508
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
1509
+ background: transparent;
1510
+ border: 0;
1511
+ text-align: left;
1512
+ font-family: inherit;
1513
+ font-size: var(--roxy-text-sm, 0.875rem);
1514
+ color: var(--roxy-fg, #0a0a0a);
1515
+ cursor: pointer;
1516
+ transition: background-color var(--roxy-motion-duration, 200ms);
1517
+ }
1518
+ .option:hover,
1519
+ .option[aria-selected='true'] {
1520
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 10%, transparent);
1521
+ }
1522
+ .option .city {
1523
+ font-weight: var(--roxy-weight-bold, 600);
1524
+ }
1525
+ .option .where {
1526
+ color: var(--roxy-muted, #71717a);
1527
+ flex-grow: 1;
1528
+ }
1529
+ .option .tz {
1530
+ color: var(--roxy-muted, #71717a);
1531
+ font-size: var(--roxy-text-xs, 0.75rem);
1532
+ font-variant-numeric: tabular-nums;
1533
+ }
1534
+ .empty {
1535
+ padding: var(--roxy-space-md, 1rem);
1536
+ color: var(--roxy-muted, #71717a);
1537
+ font-size: var(--roxy-text-sm, 0.875rem);
1538
+ }
1539
+ `],d([p({type:String,attribute:"api-key"})],k.prototype,"apiKey",2),d([p({type:String,attribute:"publishable-key"})],k.prototype,"publishableKey",2),d([p({type:String})],k.prototype,"endpoint",2),d([p({type:String})],k.prototype,"placeholder",2),d([p({type:String,attribute:"default-value"})],k.prototype,"defaultValue",2),d([_()],k.prototype,"query",2),d([_()],k.prototype,"results",2),d([_()],k.prototype,"isOpen",2),d([_()],k.prototype,"isLoading",2),d([_()],k.prototype,"highlight",2),k=d([x("roxy-location-search")],k);var O=class extends g{constructor(){super(...arguments);this.data=null;this.mode="current"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No moon phase data</div>`;let r=e.phases??e.upcoming??[];return this.mode!=="current"&&r.length>0?s`<article
1540
+ class="card"
1541
+ aria-label="Moon phase calendar"
1542
+ >
1543
+ <h2 class="label">${e.month??"Moon phases"} ${e.year??""}</h2>
1544
+ <div class="list" role="list">
1545
+ ${r.map(a=>this.renderListItem(a))}
1546
+ </div>
1547
+ </article>`:this.renderSingle(e)}renderSingle(e){let r=lr(e.phase);return s`<article class="card" aria-label="Current moon phase">
1548
+ <div class="hero">
1549
+ <span class="emoji" aria-hidden="true">${r}</span>
1550
+ <div>
1551
+ <h2 class="label">${e.phase??"Moon"}</h2>
1552
+ ${e.date?s`<div class="date">${e.date}</div>`:l}
1553
+ </div>
1554
+ </div>
1555
+ <div class="stats">
1556
+ ${typeof e.illumination=="number"?s`<div>
1557
+ <span>Illumination</span>
1558
+ <strong>${(e.illumination*100).toFixed(0)}%</strong>
1559
+ </div>`:l}
1560
+ ${typeof e.age=="number"?s`<div>
1561
+ <span>Age</span>
1562
+ <strong>${e.age.toFixed(1)} days</strong>
1563
+ </div>`:l}
1564
+ ${e.sign?s`<div>
1565
+ <span>Sign</span>
1566
+ <strong>${e.sign}</strong>
1567
+ </div>`:l}
1568
+ ${typeof e.distance=="number"?s`<div>
1569
+ <span>Distance</span>
1570
+ <strong>${(e.distance/1e3).toFixed(0)}k km</strong>
1571
+ </div>`:l}
1572
+ </div>
1573
+ ${e.meaning?.description?s`<p class="meaning">${e.meaning.description}</p>`:l}
1574
+ ${e.meaning?.keywords?.length?s`<div class="keywords">
1575
+ ${e.meaning.keywords.map(a=>s`<span>${a}</span>`)}
1576
+ </div>`:l}
1577
+ </article>`}renderListItem(e){let r=lr(e.phase);return s`<div class="list-item" role="listitem">
1578
+ <span aria-hidden="true">${r}</span>
1579
+ <span>${e.phase}</span>
1580
+ <span>${e.date??""}</span>
1581
+ </div>`}};O.styles=[f,y`
1582
+ .card {
1583
+ background: var(--roxy-bg, #fff);
1584
+ border: 1px solid var(--roxy-border, #e4e4e7);
1585
+ border-radius: var(--roxy-radius-md, 8px);
1586
+ padding: var(--roxy-space-lg, 1.5rem);
1587
+ box-shadow: var(--roxy-shadow-sm);
1588
+ display: grid;
1589
+ gap: var(--roxy-space-md, 1rem);
1590
+ }
1591
+
1592
+ .hero {
1593
+ display: flex;
1594
+ align-items: center;
1595
+ gap: var(--roxy-space-md, 1rem);
1596
+ }
1597
+ .emoji {
1598
+ font-size: 3rem;
1599
+ line-height: 1;
1600
+ }
1601
+ .label {
1602
+ margin: 0;
1603
+ font-size: var(--roxy-text-lg, 1.125rem);
1604
+ font-weight: var(--roxy-weight-bold, 600);
1605
+ text-transform: capitalize;
1606
+ }
1607
+ .date {
1608
+ color: var(--roxy-muted, #71717a);
1609
+ font-size: var(--roxy-text-sm, 0.875rem);
1610
+ }
1611
+
1612
+ .stats {
1613
+ display: grid;
1614
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
1615
+ gap: var(--roxy-space-md, 1rem);
1616
+ font-size: var(--roxy-text-sm, 0.875rem);
1617
+ color: var(--roxy-secondary, #475569);
1618
+ }
1619
+ .stats div span:first-child {
1620
+ display: block;
1621
+ color: var(--roxy-muted, #71717a);
1622
+ font-size: var(--roxy-text-xs, 0.75rem);
1623
+ text-transform: uppercase;
1624
+ letter-spacing: 0.06em;
1625
+ }
1626
+ .stats strong {
1627
+ color: var(--roxy-fg, #0a0a0a);
1628
+ font-variant-numeric: tabular-nums;
1629
+ }
1630
+
1631
+ .meaning {
1632
+ color: var(--roxy-fg, #0a0a0a);
1633
+ }
1634
+ .keywords {
1635
+ display: flex;
1636
+ flex-wrap: wrap;
1637
+ gap: var(--roxy-space-xs, 0.25rem);
1638
+ margin-top: var(--roxy-space-sm, 0.5rem);
1639
+ }
1640
+ .keywords span {
1641
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
1642
+ padding: 2px 8px;
1643
+ border-radius: var(--roxy-radius-full, 9999px);
1644
+ font-size: var(--roxy-text-xs, 0.75rem);
1645
+ }
1646
+
1647
+ .list {
1648
+ display: grid;
1649
+ gap: var(--roxy-space-sm, 0.5rem);
1650
+ }
1651
+ .list-item {
1652
+ display: grid;
1653
+ grid-template-columns: 2.5rem 1fr auto;
1654
+ gap: var(--roxy-space-sm, 0.5rem);
1655
+ align-items: center;
1656
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
1657
+ padding: var(--roxy-space-sm, 0.5rem) 0;
1658
+ font-size: var(--roxy-text-sm, 0.875rem);
1659
+ }
1660
+ .list-item:last-child {
1661
+ border-bottom: none;
1662
+ }
1663
+ `],d([p({attribute:!1})],O.prototype,"data",2),d([p({type:String,reflect:!0})],O.prototype,"mode",2),O=d([x("roxy-moon-phase")],O);function lr(o){return o?nr[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function P(o,t,e,r){let a=r*Math.PI/180;return{x:o+e*Math.cos(a),y:t+e*Math.sin(a)}}var De=320,b=De/2,cr=150,Ur=134,Ce=110,fe=88,H=class extends g{constructor(){super(...arguments);this.data=null;this.houseSystem="placidus"}getPlanets(){let e=this.data?.planets;return e?Array.isArray(e)?e:Object.entries(e).map(([r,a])=>({...a,name:r})):[]}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[];return s`<div class="wrap">
1664
+ <header>
1665
+ <h2 class="title">Natal chart</h2>
1666
+ ${this.data.birthDetails?s`<div class="meta">
1667
+ ${[this.data.birthDetails.date,this.data.birthDetails.time,this.data.birthDetails.location].filter(Boolean).join(" \xB7 ")}
1668
+ </div>`:l}
1669
+ </header>
1670
+ <svg
1671
+ viewBox="0 0 ${De} ${De}"
1672
+ role="img"
1673
+ aria-label="Natal chart wheel with twelve houses, planets, and aspects"
1674
+ >
1675
+ <title>Natal chart wheel</title>
1676
+ <desc>
1677
+ Twelve zodiac sign segments around a circular wheel. Planet glyphs are
1678
+ placed at their ecliptic longitudes. Aspect lines connect related planets.
1679
+ </desc>
1680
+ <circle
1681
+ class="wheel-line"
1682
+ cx=${b}
1683
+ cy=${b}
1684
+ r=${cr}
1685
+ stroke-width="1.5"
1686
+ />
1687
+ <circle
1688
+ class="wheel-line"
1689
+ cx=${b}
1690
+ cy=${b}
1691
+ r=${Ce}
1692
+ stroke-width="1"
1693
+ />
1694
+ <circle
1695
+ class="wheel-line"
1696
+ cx=${b}
1697
+ cy=${b}
1698
+ r=${fe-16}
1699
+ stroke-width="0.5"
1700
+ />
1701
+ ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()}
1702
+ ${this.renderAspects(e,r)} ${this.renderPlanets(e)}
1703
+ </svg>
1704
+ <div class="legend">
1705
+ <span>${e.length} planets</span>
1706
+ <span>${r.length} aspects</span>
1707
+ <span>House system: ${this.houseSystem}</span>
1708
+ </div>
1709
+ </div>`}renderSpokes(){return Array.from({length:12},(e,r)=>{let a=r*30-90,i=P(b,b,Ce,a),n=P(b,b,cr,a);return $`<line class="wheel-line" x1=${i.x} y1=${i.y} x2=${n.x} y2=${n.y} stroke-width="0.8" />`})}renderSigns(){return["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"].map((r,a)=>{let i=a*30+15-90,n=P(b,b,Ur,i);return $`<text class="sign-glyph" x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central">${re[r]}</text>`})}renderHouseNumbers(){return Array.from({length:12},(e,r)=>{let a=r*30+15-90,i=P(b,b,Ce-12,a);return $`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r+1}</text>`})}renderPlanets(e){return e.map(r=>{let a=typeof r.longitude=="number"?r.longitude:typeof r.degree=="number"?r.degree:NaN;if(!Number.isFinite(a))return l;let i=a-90,n=P(b,b,fe,i),c=r.name??r.planet??"",m=xe[ve(c)]??c.slice(0,2),u=r.retrograde||r.isRetrograde?" R":"";return $`<text class="planet-glyph" x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central"><title>${c}${u}</title>${m}</text>`})}renderAspects(e,r){let a=new Map;for(let i of e){let n=typeof i.longitude=="number"?i.longitude:typeof i.degree=="number"?i.degree:null;if(n===null)continue;let c=ve(i.name??i.planet??"");c&&a.set(c,n)}return r.map(i=>{let n=a.get(ve(i.planet1??"")),c=a.get(ve(i.planet2??""));if(n===void 0||c===void 0)return l;let m=P(b,b,fe-18,n-90),u=P(b,b,fe-18,c-90);return $`<line class="aspect" x1=${m.x} y1=${m.y} x2=${u.x} y2=${u.y} />`})}};H.styles=[f,y`
1710
+ .wrap {
1711
+ width: 100%;
1712
+ display: grid;
1713
+ gap: var(--roxy-space-md, 1rem);
1714
+ }
1715
+
1716
+ .title {
1717
+ font-size: var(--roxy-text-lg, 1.125rem);
1718
+ font-weight: var(--roxy-weight-bold, 600);
1719
+ margin: 0;
1720
+ color: var(--roxy-primary, #0f172a);
1721
+ }
1722
+
1723
+ .meta {
1724
+ color: var(--roxy-muted, #71717a);
1725
+ font-size: var(--roxy-text-sm, 0.875rem);
1726
+ }
1727
+
1728
+ svg {
1729
+ display: block;
1730
+ width: 100%;
1731
+ max-width: 360px;
1732
+ height: auto;
1733
+ margin: 0 auto;
1734
+ }
1735
+
1736
+ .wheel-line {
1737
+ fill: none;
1738
+ stroke: var(--roxy-border, #e4e4e7);
1739
+ }
1740
+
1741
+ .sign-glyph {
1742
+ fill: var(--roxy-secondary, #475569);
1743
+ font-size: 14px;
1744
+ font-family: var(--roxy-font-sans);
1745
+ }
1746
+
1747
+ .planet-glyph {
1748
+ fill: var(--roxy-accent, #f59e0b);
1749
+ font-size: 14px;
1750
+ font-weight: 600;
1751
+ font-family: var(--roxy-font-sans);
1752
+ }
1753
+
1754
+ .house-num {
1755
+ fill: var(--roxy-muted, #71717a);
1756
+ font-size: 9px;
1757
+ font-family: var(--roxy-font-sans);
1758
+ }
1759
+
1760
+ .aspect {
1761
+ stroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 32%, transparent);
1762
+ stroke-width: 0.6;
1763
+ fill: none;
1764
+ }
1765
+
1766
+ .legend {
1767
+ font-size: var(--roxy-text-xs, 0.75rem);
1768
+ color: var(--roxy-muted, #71717a);
1769
+ display: flex;
1770
+ flex-wrap: wrap;
1771
+ gap: var(--roxy-space-md, 1rem);
1772
+ }
1773
+ `],d([p({attribute:!1})],H.prototype,"data",2),d([p({type:String,attribute:"house-system",reflect:!0})],H.prototype,"houseSystem",2),H=d([x("roxy-natal-chart")],H);function ve(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}var j=class extends g{constructor(){super(...arguments);this.data=null;this.type="life-path"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No numerology data</div>`;let r=Rr[this.type]??this.type,a=e.personalYear??e.number,i=e.coreNumbers?Object.entries(e.coreNumbers).filter(([,n])=>n!=null):[];return s`<article
1774
+ class="card"
1775
+ aria-label=${r}
1776
+ >
1777
+ <div class="hero">
1778
+ ${typeof a=="number"?s`<div class="numeral">${a}</div>`:l}
1779
+ <div>
1780
+ <p class="label">${r}</p>
1781
+ ${e.title?s`<h2 class="title">${e.title}</h2>`:e.type?s`<h2 class="title">
1782
+ ${e.type==="master"?"Master number":"Single digit"}
1783
+ </h2>`:l}
1784
+ </div>
1785
+ </div>
1786
+ ${e.theme?s`<p><strong>Theme:</strong> ${e.theme}</p>`:l}
1787
+ ${e.meaning?s`<p class="meaning">${e.meaning}</p>`:l}
1788
+ ${e.advice?s`<p>${e.advice}</p>`:l}
1789
+ ${e.calculation?s`<pre class="calc">${e.calculation}</pre>`:l}
1790
+ ${e.keywords?.length?s`<div class="chips">
1791
+ ${e.keywords.map(n=>s`<span>${n}</span>`)}
1792
+ </div>`:l}
1793
+ ${i.length>0?s`<div class="cores">
1794
+ ${i.map(([n,c])=>{let m=typeof c=="number"?c:c.number;return s`<div class="item">
1795
+ <span>${Ir(n)}</span>
1796
+ <strong>${m??""}</strong>
1797
+ </div>`})}
1798
+ </div>`:l}
1799
+ ${e.hasKarmicDebt&&e.karmicDebtNumber?s`<div class="karmic">
1800
+ Karmic debt ${e.karmicDebtNumber}.
1801
+ ${e.karmicDebtMeaning?e.karmicDebtMeaning:""}
1802
+ </div>`:l}
1803
+ </article>`}};j.styles=[f,y`
1804
+ .card {
1805
+ background: var(--roxy-bg, #fff);
1806
+ border: 1px solid var(--roxy-border, #e4e4e7);
1807
+ border-radius: var(--roxy-radius-md, 8px);
1808
+ padding: var(--roxy-space-lg, 1.5rem);
1809
+ box-shadow: var(--roxy-shadow-sm);
1810
+ display: grid;
1811
+ gap: var(--roxy-space-md, 1rem);
1812
+ }
1813
+
1814
+ .hero {
1815
+ display: flex;
1816
+ align-items: center;
1817
+ gap: var(--roxy-space-md, 1rem);
1818
+ }
1819
+ .numeral {
1820
+ font-size: 4rem;
1821
+ line-height: 1;
1822
+ font-weight: var(--roxy-weight-bold, 600);
1823
+ color: var(--roxy-accent-fg, #b45309);
1824
+ font-variant-numeric: tabular-nums;
1825
+ }
1826
+ .label {
1827
+ margin: 0;
1828
+ font-size: var(--roxy-text-xs, 0.75rem);
1829
+ color: var(--roxy-muted, #71717a);
1830
+ text-transform: uppercase;
1831
+ letter-spacing: 0.06em;
1832
+ }
1833
+ .title {
1834
+ margin: 0;
1835
+ font-size: var(--roxy-text-lg, 1.125rem);
1836
+ font-weight: var(--roxy-weight-bold, 600);
1837
+ }
1838
+ .meaning {
1839
+ margin: 0;
1840
+ color: var(--roxy-fg, #0a0a0a);
1841
+ }
1842
+
1843
+ .calc {
1844
+ margin: 0;
1845
+ font-family: var(--roxy-font-mono);
1846
+ font-size: var(--roxy-text-xs, 0.75rem);
1847
+ color: var(--roxy-muted, #71717a);
1848
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 30%, transparent);
1849
+ padding: var(--roxy-space-sm, 0.5rem);
1850
+ border-radius: var(--roxy-radius-sm, 4px);
1851
+ word-break: break-all;
1852
+ }
1853
+
1854
+ .chips {
1855
+ display: flex;
1856
+ flex-wrap: wrap;
1857
+ gap: var(--roxy-space-xs, 0.25rem);
1858
+ }
1859
+ .chips span {
1860
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
1861
+ padding: 2px 8px;
1862
+ border-radius: var(--roxy-radius-full, 9999px);
1863
+ font-size: var(--roxy-text-xs, 0.75rem);
1864
+ }
1865
+
1866
+ .cores {
1867
+ display: grid;
1868
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
1869
+ gap: var(--roxy-space-sm, 0.5rem);
1870
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
1871
+ padding-top: var(--roxy-space-md, 1rem);
1872
+ }
1873
+ .cores .item {
1874
+ display: flex;
1875
+ align-items: baseline;
1876
+ gap: var(--roxy-space-xs, 0.25rem);
1877
+ font-size: var(--roxy-text-sm, 0.875rem);
1878
+ }
1879
+ .cores .item span:first-child {
1880
+ color: var(--roxy-muted, #71717a);
1881
+ text-transform: capitalize;
1882
+ }
1883
+ .cores .item strong {
1884
+ color: var(--roxy-accent-fg, #b45309);
1885
+ font-variant-numeric: tabular-nums;
1886
+ font-size: var(--roxy-text-base, 1rem);
1887
+ font-weight: var(--roxy-weight-bold, 600);
1888
+ }
1889
+
1890
+ .karmic {
1891
+ background: color-mix(in srgb, var(--roxy-warning, #ea580c) 12%, transparent);
1892
+ border: 1px solid color-mix(in srgb, var(--roxy-warning, #ea580c) 32%, transparent);
1893
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
1894
+ border-radius: var(--roxy-radius-md, 8px);
1895
+ font-size: var(--roxy-text-sm, 0.875rem);
1896
+ color: var(--roxy-fg, #0a0a0a);
1897
+ }
1898
+ `],d([p({attribute:!1})],j.prototype,"data",2),d([p({type:String,reflect:!0})],j.prototype,"type",2),j=d([x("roxy-numerology-card")],j);var Rr={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Ir(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,t=>t.toUpperCase())}var U=class extends g{constructor(){super(...arguments);this.data=null;this.detail="detailed"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No panchang data</div>`;let r=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)],["Vara",e.vara??""]],a=[["Brahma Muhurta",e.brahmaMuhurta],["Abhijit Muhurta",e.abhijitMuhurta],["Vijaya Muhurta",e.vijayaMuhurta],["Godhuli Muhurta",e.godhuliMuhurta],["Nishita Muhurta",e.nishitaMuhurta],["Pratah Sandhya",e.pratahSandhya],["Sayahna Sandhya",e.sayahnaSandhya]],i=[["Rahu Kaal",e.rahuKaal],["Yamaganda",e.yamaganda],["Gulika",e.gulika]];return s`<div class="wrap" aria-label="Panchang">
1899
+ <header class="head">
1900
+ <h2 class="title">Panchang</h2>
1901
+ <span class="date">${e.date??""}</span>
1902
+ </header>
1903
+ <table>
1904
+ <tbody>
1905
+ ${r.map(([n,c])=>s`<tr>
1906
+ <th>${n}</th>
1907
+ <td>${c}</td>
1908
+ </tr>`)}
1909
+ ${e.sunrise?s`<tr>
1910
+ <th>Sunrise</th>
1911
+ <td>${e.sunrise}</td>
1912
+ </tr>`:l}
1913
+ ${e.sunset?s`<tr>
1914
+ <th>Sunset</th>
1915
+ <td>${e.sunset}</td>
1916
+ </tr>`:l}
1917
+ ${e.moonrise?s`<tr>
1918
+ <th>Moonrise</th>
1919
+ <td>${e.moonrise}</td>
1920
+ </tr>`:l}
1921
+ ${e.moonset?s`<tr>
1922
+ <th>Moonset</th>
1923
+ <td>${e.moonset}</td>
1924
+ </tr>`:l}
1925
+ </tbody>
1926
+ </table>
1927
+ ${this.detail==="detailed"&&(a.some(n=>!!n[1])||i.some(n=>!!n[1]))?s`
1928
+ <div class="section">Auspicious muhurtas</div>
1929
+ <table>
1930
+ <tbody>
1931
+ ${a.filter(([,n])=>!!n).map(([n,c])=>s`<tr>
1932
+ <th>${n}</th>
1933
+ <td>${dr(c)}</td>
1934
+ </tr>`)}
1935
+ </tbody>
1936
+ </table>
1937
+ <div class="section">Inauspicious periods</div>
1938
+ <table>
1939
+ <tbody>
1940
+ ${i.filter(([,n])=>!!n).map(([n,c])=>s`<tr>
1941
+ <th>${n}</th>
1942
+ <td>${dr(c)}</td>
1943
+ </tr>`)}
1944
+ </tbody>
1945
+ </table>
1946
+ `:l}
1947
+ </div>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.lord?`(${r.lord})`:"",r.phase].filter(Boolean).join(" ")}return String(e)}};U.styles=[f,y`
1948
+ .wrap {
1949
+ border: 1px solid var(--roxy-border, #e4e4e7);
1950
+ border-radius: var(--roxy-radius-md, 8px);
1951
+ background: var(--roxy-bg, #fff);
1952
+ overflow: hidden;
1953
+ box-shadow: var(--roxy-shadow-sm);
1954
+ }
1955
+ .head {
1956
+ padding: var(--roxy-space-md, 1rem);
1957
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
1958
+ display: flex;
1959
+ justify-content: space-between;
1960
+ flex-wrap: wrap;
1961
+ gap: var(--roxy-space-sm, 0.5rem);
1962
+ }
1963
+ .title {
1964
+ margin: 0;
1965
+ font-size: var(--roxy-text-lg, 1.125rem);
1966
+ font-weight: var(--roxy-weight-bold, 600);
1967
+ }
1968
+ .date {
1969
+ color: var(--roxy-muted, #71717a);
1970
+ font-size: var(--roxy-text-sm, 0.875rem);
1971
+ }
1972
+ table {
1973
+ width: 100%;
1974
+ border-collapse: collapse;
1975
+ font-size: var(--roxy-text-sm, 0.875rem);
1976
+ }
1977
+ tbody tr:nth-child(odd) {
1978
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 24%, transparent);
1979
+ }
1980
+ th,
1981
+ td {
1982
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
1983
+ text-align: left;
1984
+ vertical-align: top;
1985
+ }
1986
+ th {
1987
+ color: var(--roxy-muted, #71717a);
1988
+ font-weight: var(--roxy-weight-bold, 600);
1989
+ width: 38%;
1990
+ text-transform: capitalize;
1991
+ }
1992
+ td {
1993
+ color: var(--roxy-fg, #0a0a0a);
1994
+ font-variant-numeric: tabular-nums;
1995
+ }
1996
+ .section {
1997
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
1998
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
1999
+ font-size: var(--roxy-text-xs, 0.75rem);
2000
+ color: var(--roxy-muted, #71717a);
2001
+ font-weight: var(--roxy-weight-bold, 600);
2002
+ text-transform: uppercase;
2003
+ letter-spacing: 0.06em;
2004
+ }
2005
+ `],d([p({attribute:!1})],U.prototype,"data",2),d([p({type:String,reflect:!0})],U.prototype,"detail",2),U=d([x("roxy-panchang-table")],U);function dr(o){return o?o.start&&o.end?`${o.start} - ${o.end}`:o.start??o.end??"":""}var Oe=360,E=Oe/2,mr=170,qr=154,Br=124,be=96,F=class extends g{constructor(){super(...arguments);this.data=null}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:a,summary:i,interAspects:n=[]}=this.data,c=this.normalizePlanets(e?.planets),m=this.normalizePlanets(r?.planets);return s`<div
2006
+ class="wrap"
2007
+ aria-label="Synastry compatibility chart"
2008
+ >
2009
+ <div class="head">
2010
+ <h2 class="title">Synastry</h2>
2011
+ ${typeof a=="number"?s`<span class="score" aria-label=${`Score ${a} of 100`}
2012
+ >${a} / 100</span
2013
+ >`:l}
2014
+ </div>
2015
+ <svg
2016
+ viewBox="0 0 ${Oe} ${Oe}"
2017
+ role="img"
2018
+ aria-label="Dual chart wheel comparing two natal charts"
2019
+ >
2020
+ <title>Synastry dual wheel</title>
2021
+ <circle
2022
+ class="wheel-line"
2023
+ cx=${E}
2024
+ cy=${E}
2025
+ r=${mr}
2026
+ stroke-width="1.5"
2027
+ />
2028
+ <circle
2029
+ class="wheel-line"
2030
+ cx=${E}
2031
+ cy=${E}
2032
+ r=${be+14}
2033
+ stroke-width="0.8"
2034
+ />
2035
+ <circle
2036
+ class="wheel-line"
2037
+ cx=${E}
2038
+ cy=${E}
2039
+ r=${be-14}
2040
+ stroke-width="0.6"
2041
+ />
2042
+ ${this.renderSpokes()} ${this.renderSigns()}
2043
+ ${this.renderRing(c,Br,"p1")} ${this.renderRing(m,be,"p2")}
2044
+ </svg>
2045
+ ${i?s`<p class="summary">${i}</p>`:l}
2046
+ ${n.length>0?this.renderAspects(n):l}
2047
+ ${(this.data.strengths?.length??0)>0||(this.data.challenges?.length??0)>0?s`<div class="lists">
2048
+ ${this.data.strengths?.length?s`<div>
2049
+ <h3>Strengths</h3>
2050
+ <ul>
2051
+ ${this.data.strengths.map(u=>s`<li>${u}</li>`)}
2052
+ </ul>
2053
+ </div>`:l}
2054
+ ${this.data.challenges?.length?s`<div>
2055
+ <h3>Challenges</h3>
2056
+ <ul>
2057
+ ${this.data.challenges.map(u=>s`<li>${u}</li>`)}
2058
+ </ul>
2059
+ </div>`:l}
2060
+ </div>`:l}
2061
+ </div>`}normalizePlanets(e){return e?Array.isArray(e)?e:Object.entries(e).map(([r,a])=>({...a,name:r})):[]}renderSpokes(){return Array.from({length:12},(e,r)=>{let a=r*30-90,i=P(E,E,be-14,a),n=P(E,E,mr,a);return $`<line class="wheel-line" x1=${i.x} y1=${i.y} x2=${n.x} y2=${n.y} stroke-width="0.6" />`})}renderSigns(){return["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"].map((r,a)=>{let i=a*30+15-90,n=P(E,E,qr,i);return $`<text class="sign" x=${n.x} y=${n.y} text-anchor="middle" dominant-baseline="central">${re[r]}</text>`})}renderRing(e,r,a){return e.map(i=>{let n=typeof i.longitude=="number"?i.longitude:typeof i.degree=="number"?i.degree:NaN;if(!Number.isFinite(n))return l;let c=P(E,E,r,n-90),m=i.name??i.planet??"",u=xe[Kr(m)]??m.slice(0,2);return $`<text class=${a} x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central"><title>${m}</title>${u}</text>`})}renderAspects(e){return s`<table>
2062
+ <thead>
2063
+ <tr>
2064
+ <th>Planet 1</th>
2065
+ <th>Planet 2</th>
2066
+ <th>Aspect</th>
2067
+ <th>Orb</th>
2068
+ <th>Strength</th>
2069
+ </tr>
2070
+ </thead>
2071
+ <tbody>
2072
+ ${e.slice(0,16).map(r=>s`<tr>
2073
+ <td>${r.planet1??""}</td>
2074
+ <td>${r.planet2??""}</td>
2075
+ <td>${r.aspect??""}</td>
2076
+ <td class="orb">
2077
+ ${typeof r.orb=="number"?r.orb.toFixed(1):""}
2078
+ </td>
2079
+ <td>${r.strength??""}</td>
2080
+ </tr>`)}
2081
+ </tbody>
2082
+ </table>`}};F.styles=[f,y`
2083
+ .wrap {
2084
+ display: grid;
2085
+ gap: var(--roxy-space-md, 1rem);
2086
+ }
2087
+
2088
+ .head {
2089
+ display: flex;
2090
+ justify-content: space-between;
2091
+ align-items: center;
2092
+ gap: var(--roxy-space-md, 1rem);
2093
+ flex-wrap: wrap;
2094
+ }
2095
+
2096
+ .title {
2097
+ font-size: var(--roxy-text-lg, 1.125rem);
2098
+ font-weight: var(--roxy-weight-bold, 600);
2099
+ margin: 0;
2100
+ }
2101
+
2102
+ .score {
2103
+ font-variant-numeric: tabular-nums;
2104
+ font-weight: var(--roxy-weight-bold, 600);
2105
+ color: var(--roxy-accent-fg, #b45309);
2106
+ font-size: var(--roxy-text-xl, 1.5rem);
2107
+ }
2108
+
2109
+ svg {
2110
+ display: block;
2111
+ width: 100%;
2112
+ max-width: 400px;
2113
+ margin: 0 auto;
2114
+ }
2115
+
2116
+ .wheel-line {
2117
+ fill: none;
2118
+ stroke: var(--roxy-border, #e4e4e7);
2119
+ }
2120
+ .sign {
2121
+ fill: var(--roxy-secondary, #475569);
2122
+ font-size: 14px;
2123
+ }
2124
+ .p1 {
2125
+ fill: var(--roxy-accent, #f59e0b);
2126
+ font-weight: 600;
2127
+ font-size: 13px;
2128
+ }
2129
+ .p2 {
2130
+ fill: var(--roxy-info, #0284c7);
2131
+ font-weight: 600;
2132
+ font-size: 13px;
2133
+ }
2134
+
2135
+ .summary {
2136
+ margin: 0;
2137
+ color: var(--roxy-fg, #0a0a0a);
2138
+ font-size: var(--roxy-text-base, 1rem);
2139
+ }
2140
+
2141
+ table {
2142
+ width: 100%;
2143
+ border-collapse: collapse;
2144
+ font-size: var(--roxy-text-sm, 0.875rem);
2145
+ }
2146
+ th,
2147
+ td {
2148
+ padding: var(--roxy-space-sm, 0.5rem);
2149
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
2150
+ text-align: left;
2151
+ }
2152
+ th {
2153
+ color: var(--roxy-muted, #71717a);
2154
+ font-weight: var(--roxy-weight-bold, 600);
2155
+ text-transform: uppercase;
2156
+ font-size: var(--roxy-text-xs, 0.75rem);
2157
+ letter-spacing: 0.06em;
2158
+ }
2159
+ td.orb {
2160
+ font-variant-numeric: tabular-nums;
2161
+ color: var(--roxy-muted, #71717a);
2162
+ }
2163
+
2164
+ .lists {
2165
+ display: grid;
2166
+ grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
2167
+ gap: var(--roxy-space-md, 1rem);
2168
+ }
2169
+ .lists h3 {
2170
+ margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
2171
+ font-size: var(--roxy-text-xs, 0.75rem);
2172
+ color: var(--roxy-muted, #71717a);
2173
+ text-transform: uppercase;
2174
+ letter-spacing: 0.06em;
2175
+ }
2176
+ .lists ul {
2177
+ margin: 0;
2178
+ padding-left: var(--roxy-space-md, 1rem);
2179
+ font-size: var(--roxy-text-sm, 0.875rem);
2180
+ }
2181
+ `],d([p({attribute:!1})],F.prototype,"data",2),F=d([x("roxy-synastry-chart")],F);function Kr(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}var R=class extends g{constructor(){super(...arguments);this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}getCard(){return this.data?"card"in this.data&&this.data.card?this.data.card:this.data:null}render(){let e=this.getCard();if(!e)return s`<div class="roxy-empty" role="status">No tarot data</div>`;let r=this.flipped!==!!e.reversed,a=typeof e.meaning=="string"?e.meaning:(r?e.meaning?.reversed:e.meaning?.upright)??e.meaning?.spiritual??e.upright?.meaning,i=this.data&&"dailyMessage"in this.data?this.data.dailyMessage:void 0;return s`<article class="card" aria-label=${e.name??"Tarot card"}>
2182
+ <div class="image-wrap">
2183
+ ${e.imageUrl?s`<img
2184
+ class=${`image ${r?"reversed":""}`}
2185
+ src=${e.imageUrl}
2186
+ alt=${e.name??"Tarot card"}
2187
+ tabindex="0"
2188
+ @click=${this.toggleFlip}
2189
+ @keydown=${n=>{(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),this.toggleFlip())}}
2190
+ />`:s`<div
2191
+ class=${`image ${r?"reversed":""}`}
2192
+ style="aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)"
2193
+ >
2194
+ ${e.name??"?"}
2195
+ </div>`}
2196
+ </div>
2197
+ <div>
2198
+ <div class="meta">
2199
+ ${e.arcana?s`${e.arcana} arcana`:l}
2200
+ ${e.number!==void 0&&e.number!==null?s` · ${e.number}`:l}
2201
+ ${r?s` · reversed`:l}
2202
+ ${e.position?s`<span class="position">${e.position}</span>`:l}
2203
+ </div>
2204
+ <h2 class="title">${e.name??"Tarot card"}</h2>
2205
+ ${i?s`<p class="message">${i}</p>`:l}
2206
+ ${a?s`<p>${a}</p>`:l}
2207
+ ${e.keywords?.length?s`<div class="chips">
2208
+ ${e.keywords.map(n=>s`<span>${n}</span>`)}
2209
+ </div>`:l}
2210
+ <button
2211
+ class="flip"
2212
+ type="button"
2213
+ @click=${this.toggleFlip}
2214
+ aria-pressed=${this.flipped?"true":"false"}
2215
+ >
2216
+ Flip card
2217
+ </button>
2218
+ </div>
2219
+ </article>`}};R.styles=[f,y`
2220
+ .card {
2221
+ background: var(--roxy-bg, #fff);
2222
+ border: 1px solid var(--roxy-border, #e4e4e7);
2223
+ border-radius: var(--roxy-radius-md, 8px);
2224
+ padding: var(--roxy-space-lg, 1.5rem);
2225
+ box-shadow: var(--roxy-shadow-sm);
2226
+ display: grid;
2227
+ grid-template-columns: minmax(0, 9rem) 1fr;
2228
+ gap: var(--roxy-space-lg, 1.5rem);
2229
+ align-items: start;
2230
+ }
2231
+
2232
+ @container (max-width: 480px) {
2233
+ .card {
2234
+ grid-template-columns: 1fr;
2235
+ }
2236
+ }
2237
+
2238
+ .image-wrap {
2239
+ perspective: 800px;
2240
+ }
2241
+ .image {
2242
+ display: block;
2243
+ width: 100%;
2244
+ height: auto;
2245
+ border-radius: var(--roxy-radius-md, 8px);
2246
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
2247
+ transition:
2248
+ transform var(--roxy-motion-duration, 200ms)
2249
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
2250
+ cursor: pointer;
2251
+ }
2252
+ .image.reversed {
2253
+ transform: rotate(180deg);
2254
+ }
2255
+ .image:focus-visible {
2256
+ outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
2257
+ outline-offset: 2px;
2258
+ }
2259
+
2260
+ .title {
2261
+ margin: 0;
2262
+ font-size: var(--roxy-text-xl, 1.5rem);
2263
+ font-weight: var(--roxy-weight-bold, 600);
2264
+ letter-spacing: var(--roxy-tracking-tight);
2265
+ }
2266
+ .meta {
2267
+ color: var(--roxy-muted, #71717a);
2268
+ font-size: var(--roxy-text-sm, 0.875rem);
2269
+ text-transform: uppercase;
2270
+ letter-spacing: 0.06em;
2271
+ margin-bottom: var(--roxy-space-sm, 0.5rem);
2272
+ }
2273
+ .position {
2274
+ color: var(--roxy-info, #0284c7);
2275
+ margin-left: var(--roxy-space-xs, 0.25rem);
2276
+ text-transform: capitalize;
2277
+ }
2278
+
2279
+ .message {
2280
+ color: var(--roxy-fg, #0a0a0a);
2281
+ margin: var(--roxy-space-sm, 0.5rem) 0 var(--roxy-space-md, 1rem);
2282
+ }
2283
+
2284
+ .chips {
2285
+ display: flex;
2286
+ flex-wrap: wrap;
2287
+ gap: var(--roxy-space-xs, 0.25rem);
2288
+ margin-top: var(--roxy-space-sm, 0.5rem);
2289
+ }
2290
+ .chips span {
2291
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
2292
+ padding: 2px 8px;
2293
+ border-radius: var(--roxy-radius-full, 9999px);
2294
+ font-size: var(--roxy-text-xs, 0.75rem);
2295
+ }
2296
+
2297
+ .flip {
2298
+ margin-top: var(--roxy-space-sm, 0.5rem);
2299
+ background: transparent;
2300
+ border: 1px solid var(--roxy-border, #e4e4e7);
2301
+ border-radius: var(--roxy-radius-md, 8px);
2302
+ padding: 4px 12px;
2303
+ font-family: inherit;
2304
+ font-size: var(--roxy-text-xs, 0.75rem);
2305
+ color: var(--roxy-secondary, #475569);
2306
+ cursor: pointer;
2307
+ transition:
2308
+ transform var(--roxy-motion-duration, 200ms)
2309
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
2310
+ }
2311
+ .flip:hover {
2312
+ transform: scale(1.02);
2313
+ }
2314
+ `],d([p({attribute:!1})],R.prototype,"data",2),d([_()],R.prototype,"flipped",2),R=d([x("roxy-tarot-card")],R);var I=class extends g{constructor(){super(...arguments);this.data=null;this.spread="three-card"}render(){let e=this.data;if(!e)return s`<div class="roxy-empty" role="status">No tarot spread</div>`;let r=e.positions??e.cards??[],a=!!e.answer,i=a?(e.answer??"").toLowerCase().replace(/[^a-z]/g,""):"";return s`<article class="wrap" aria-label="Tarot spread">
2315
+ <header class="head">
2316
+ <h2 class="title">${e.spread??this.spread.replace(/-/g," ")}</h2>
2317
+ ${e.question?s`<span class="question">"${e.question}"</span>`:l}
2318
+ </header>
2319
+ ${a?s`<div>
2320
+ <span class=${`answer ${i}`}>${e.answer}</span>
2321
+ ${e.strength?s`<small> · ${e.strength}</small>`:l}
2322
+ </div>`:l}
2323
+ ${r.length>0?s`<div class="grid">
2324
+ ${r.map(n=>s`<div class="card">
2325
+ <p class="label">${n.label??n.name??n.position??""}</p>
2326
+ <div class="image">
2327
+ ${n.card?.imageUrl?s`<img
2328
+ src=${n.card.imageUrl}
2329
+ alt=${n.card.name??"tarot card"}
2330
+ class=${n.card.reversed?"reversed":""}
2331
+ />`:s`${n.card?.name??"?"}`}
2332
+ </div>
2333
+ <p class="name">
2334
+ ${n.card?.name??""}
2335
+ ${n.card?.reversed?s`<small>(reversed)</small>`:l}
2336
+ </p>
2337
+ ${n.interpretation?s`<p class="interp">${n.interpretation}</p>`:l}
2338
+ </div>`)}
2339
+ </div>`:l}
2340
+ ${e.reading?s`<p class="reading">${e.reading}</p>`:l}
2341
+ ${e.interpretation&&!e.reading?s`<p class="reading">${e.interpretation}</p>`:l}
2342
+ </article>`}};I.styles=[f,y`
2343
+ .wrap {
2344
+ display: grid;
2345
+ gap: var(--roxy-space-md, 1rem);
2346
+ }
2347
+
2348
+ .head {
2349
+ display: flex;
2350
+ justify-content: space-between;
2351
+ gap: var(--roxy-space-md, 1rem);
2352
+ flex-wrap: wrap;
2353
+ align-items: baseline;
2354
+ }
2355
+ .title {
2356
+ margin: 0;
2357
+ font-size: var(--roxy-text-lg, 1.125rem);
2358
+ font-weight: var(--roxy-weight-bold, 600);
2359
+ text-transform: capitalize;
2360
+ }
2361
+ .question {
2362
+ color: var(--roxy-muted, #71717a);
2363
+ font-size: var(--roxy-text-sm, 0.875rem);
2364
+ font-style: italic;
2365
+ }
2366
+
2367
+ .answer {
2368
+ display: inline-block;
2369
+ padding: 4px 14px;
2370
+ border-radius: var(--roxy-radius-full, 9999px);
2371
+ font-weight: var(--roxy-weight-bold, 600);
2372
+ font-size: var(--roxy-text-base, 1rem);
2373
+ text-transform: uppercase;
2374
+ letter-spacing: 0.06em;
2375
+ }
2376
+ .answer.yes {
2377
+ background: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);
2378
+ color: var(--roxy-success, #16a34a);
2379
+ }
2380
+ .answer.no {
2381
+ background: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);
2382
+ color: var(--roxy-danger, #dc2626);
2383
+ }
2384
+ .answer.maybe {
2385
+ background: color-mix(in srgb, var(--roxy-warning, #ea580c) 16%, transparent);
2386
+ color: var(--roxy-warning, #ea580c);
2387
+ }
2388
+
2389
+ .grid {
2390
+ display: grid;
2391
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
2392
+ gap: var(--roxy-space-md, 1rem);
2393
+ }
2394
+
2395
+ .card {
2396
+ border: 1px solid var(--roxy-border, #e4e4e7);
2397
+ border-radius: var(--roxy-radius-md, 8px);
2398
+ padding: var(--roxy-space-sm, 0.5rem);
2399
+ background: var(--roxy-bg, #fff);
2400
+ display: grid;
2401
+ gap: var(--roxy-space-xs, 0.25rem);
2402
+ }
2403
+ .label {
2404
+ font-size: var(--roxy-text-xs, 0.75rem);
2405
+ color: var(--roxy-muted, #71717a);
2406
+ text-transform: uppercase;
2407
+ letter-spacing: 0.06em;
2408
+ margin: 0;
2409
+ }
2410
+ .image {
2411
+ width: 100%;
2412
+ aspect-ratio: 0.6;
2413
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
2414
+ border-radius: var(--roxy-radius-sm, 4px);
2415
+ display: flex;
2416
+ align-items: center;
2417
+ justify-content: center;
2418
+ font-size: var(--roxy-text-xs, 0.75rem);
2419
+ color: var(--roxy-muted, #71717a);
2420
+ overflow: hidden;
2421
+ }
2422
+ .image img {
2423
+ width: 100%;
2424
+ height: 100%;
2425
+ object-fit: cover;
2426
+ transition:
2427
+ transform var(--roxy-motion-duration, 200ms)
2428
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
2429
+ }
2430
+ .image img.reversed {
2431
+ transform: rotate(180deg);
2432
+ }
2433
+ .name {
2434
+ margin: 0;
2435
+ font-size: var(--roxy-text-sm, 0.875rem);
2436
+ font-weight: var(--roxy-weight-bold, 600);
2437
+ }
2438
+ .interp {
2439
+ margin: 0;
2440
+ font-size: var(--roxy-text-xs, 0.75rem);
2441
+ color: var(--roxy-secondary, #475569);
2442
+ }
2443
+
2444
+ .reading {
2445
+ margin: 0;
2446
+ color: var(--roxy-fg, #0a0a0a);
2447
+ }
2448
+ `],d([p({attribute:!1})],I.prototype,"data",2),d([p({type:String,reflect:!0})],I.prototype,"spread",2),I=d([x("roxy-tarot-spread")],I);var Gr={1:{x:150,y:58},2:{x:205,y:52},3:{x:253,y:112},4:{x:243,y:150},5:{x:253,y:188},6:{x:205,y:248},7:{x:150,y:242},8:{x:95,y:248},9:{x:47,y:188},10:{x:57,y:150},11:{x:47,y:112},12:{x:95,y:52}},Yr={1:{x:150,y:35},2:{x:222,y:40},3:{x:265,y:100},4:{x:265,y:150},5:{x:265,y:200},6:{x:222,y:260},7:{x:150,y:265},8:{x:78,y:260},9:{x:35,y:200},10:{x:35,y:150},11:{x:35,y:100},12:{x:78,y:40}},Fr=["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"],Vr={aries:"Aries",taurus:"Taurus",gemini:"Gemini",cancer:"Cancer",leo:"Leo",virgo:"Virgo",libra:"Libra",scorpio:"Scorpio",sagittarius:"Sagittarius",capricorn:"Capricorn",aquarius:"Aquarius",pisces:"Pisces"},q=class extends g{constructor(){super(...arguments);this.data=null;this.chartStyle="south"}buildHouses(){if(!this.data)return[];let e=[];if(Array.isArray(this.data.houses)){for(let r of this.data.houses)e.push({house:r.house??r.number??e.length+1,sign:r.sign??"",planets:r.planets??[]});if(e.length>0)return e}for(let r=0;r<12;r++){let a=Fr[r],n=(this.data[a]?.signs??[]).map(c=>c.planet??"").filter(Boolean);e.push({house:r+1,sign:Vr[a]??"",planets:n})}return e}render(){if(!this.data)return s`<div class="roxy-empty" role="status">No kundli data</div>`;let e=this.buildHouses();return s`<div class="wrap">
2449
+ <h2 class="title">Vedic kundli</h2>
2450
+ <svg
2451
+ viewBox="0 0 300 300"
2452
+ role="img"
2453
+ aria-label="Vedic birth chart with twelve sign houses"
2454
+ >
2455
+ <title>Vedic kundli</title>
2456
+ <polygon class="line" points="150,10 290,150 150,290 10,150" stroke-width="1.5" />
2457
+ <polygon
2458
+ class="line"
2459
+ points="220,80 220,220 80,220 80,80"
2460
+ stroke-width="1"
2461
+ fill="none"
2462
+ />
2463
+ <line class="line" x1="150" y1="10" x2="80" y2="80" stroke-width="1" />
2464
+ <line class="line" x1="150" y1="10" x2="220" y2="80" stroke-width="1" />
2465
+ <line class="line" x1="290" y1="150" x2="220" y2="80" stroke-width="1" />
2466
+ <line class="line" x1="290" y1="150" x2="220" y2="220" stroke-width="1" />
2467
+ <line class="line" x1="150" y1="290" x2="220" y2="220" stroke-width="1" />
2468
+ <line class="line" x1="150" y1="290" x2="80" y2="220" stroke-width="1" />
2469
+ <line class="line" x1="10" y1="150" x2="80" y2="220" stroke-width="1" />
2470
+ <line class="line" x1="10" y1="150" x2="80" y2="80" stroke-width="1" />
2471
+ ${e.map(r=>this.renderHouseGroup(r))}
2472
+ </svg>
2473
+ </div>`}renderHouseGroup(e){let r=Gr[e.house],a=Yr[e.house];if(!r||!a)return l;let i=ir[e.sign]??"",n=e.planets??[];return $`
2474
+ <g>
2475
+ ${i?$`<text class="sign-text" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${i}</text>`:l}
2476
+ ${n.map((c,m)=>{let u=sr[Jr(c)]??c.slice(0,2),h=13,S=r.y-(n.length-1)*h/2+m*h;return $`<text class="planet-text" x=${r.x} y=${S} text-anchor="middle" dominant-baseline="central">${u}</text>`})}
2477
+ </g>
2478
+ `}};q.styles=[f,y`
2479
+ .wrap {
2480
+ display: grid;
2481
+ gap: var(--roxy-space-md, 1rem);
2482
+ }
2483
+ .title {
2484
+ font-size: var(--roxy-text-lg, 1.125rem);
2485
+ font-weight: var(--roxy-weight-bold, 600);
2486
+ margin: 0;
2487
+ }
2488
+ svg {
2489
+ display: block;
2490
+ width: 100%;
2491
+ max-width: 360px;
2492
+ margin: 0 auto;
2493
+ }
2494
+ .line {
2495
+ fill: transparent;
2496
+ stroke: var(--roxy-border, #e4e4e7);
2497
+ }
2498
+ .sign-text {
2499
+ fill: var(--roxy-muted, #71717a);
2500
+ font-size: 9px;
2501
+ font-weight: 500;
2502
+ font-family: var(--roxy-font-sans);
2503
+ }
2504
+ .planet-text {
2505
+ fill: var(--roxy-fg, #0a0a0a);
2506
+ font-size: 11px;
2507
+ font-weight: 600;
2508
+ font-family: var(--roxy-font-sans);
2509
+ }
2510
+ `],d([p({attribute:!1})],q.prototype,"data",2),d([p({type:String,reflect:!0,attribute:"chart-style"})],q.prototype,"chartStyle",2),q=d([x("roxy-vedic-kundli")],q);function Jr(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}var Wr="0.1.0",Zr=["natal-chart","horoscope-card","synastry-chart","compatibility-card","moon-phase","vedic-kundli","panchang-table","dasha-timeline","dosha-card","guna-milan","kp-planets-table","numerology-card","tarot-card","tarot-spread","biorhythm-chart","hexagram","endpoint-form","location-search","data"];return xr(Xr);})();
2511
+ /*! Bundled license information:
2512
+
2513
+ @lit/reactive-element/css-tag.js:
2514
+ (**
2515
+ * @license
2516
+ * Copyright 2019 Google LLC
2517
+ * SPDX-License-Identifier: BSD-3-Clause
2518
+ *)
2519
+
2520
+ @lit/reactive-element/reactive-element.js:
2521
+ lit-html/lit-html.js:
2522
+ lit-element/lit-element.js:
2523
+ @lit/reactive-element/decorators/custom-element.js:
2524
+ @lit/reactive-element/decorators/property.js:
2525
+ @lit/reactive-element/decorators/state.js:
2526
+ @lit/reactive-element/decorators/event-options.js:
2527
+ @lit/reactive-element/decorators/base.js:
2528
+ @lit/reactive-element/decorators/query.js:
2529
+ @lit/reactive-element/decorators/query-all.js:
2530
+ @lit/reactive-element/decorators/query-async.js:
2531
+ @lit/reactive-element/decorators/query-assigned-nodes.js:
2532
+ (**
2533
+ * @license
2534
+ * Copyright 2017 Google LLC
2535
+ * SPDX-License-Identifier: BSD-3-Clause
2536
+ *)
2537
+
2538
+ lit-html/is-server.js:
2539
+ (**
2540
+ * @license
2541
+ * Copyright 2022 Google LLC
2542
+ * SPDX-License-Identifier: BSD-3-Clause
2543
+ *)
2544
+
2545
+ @lit/reactive-element/decorators/query-assigned-elements.js:
2546
+ (**
2547
+ * @license
2548
+ * Copyright 2021 Google LLC
2549
+ * SPDX-License-Identifier: BSD-3-Clause
2550
+ *)
2551
+ */
2552
+ //# sourceMappingURL=roxy-ui.js.map