@roxyapi/ui 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/AGENTS.md +53 -27
  2. package/README.md +42 -12
  3. package/components-catalog.json +1022 -0
  4. package/dist/cdn/components/angel-number-card.js +52 -0
  5. package/dist/cdn/components/angel-number-card.js.map +7 -0
  6. package/dist/cdn/components/angel-number-lookup.js +52 -0
  7. package/dist/cdn/components/angel-number-lookup.js.map +7 -0
  8. package/dist/cdn/components/ashtakavarga-grid.js +10 -3
  9. package/dist/cdn/components/ashtakavarga-grid.js.map +4 -4
  10. package/dist/cdn/components/aspects-table.js +52 -0
  11. package/dist/cdn/components/aspects-table.js.map +7 -0
  12. package/dist/cdn/components/biorhythm-chart.js +10 -3
  13. package/dist/cdn/components/biorhythm-chart.js.map +4 -4
  14. package/dist/cdn/components/bodygraph.js +17 -10
  15. package/dist/cdn/components/bodygraph.js.map +4 -4
  16. package/dist/cdn/components/choghadiya-grid.js +10 -3
  17. package/dist/cdn/components/choghadiya-grid.js.map +4 -4
  18. package/dist/cdn/components/compatibility-card.js +10 -3
  19. package/dist/cdn/components/compatibility-card.js.map +4 -4
  20. package/dist/cdn/components/crystal-card.js +52 -0
  21. package/dist/cdn/components/crystal-card.js.map +7 -0
  22. package/dist/cdn/components/crystal-grid.js +52 -0
  23. package/dist/cdn/components/crystal-grid.js.map +7 -0
  24. package/dist/cdn/components/dasha-timeline.js +10 -3
  25. package/dist/cdn/components/dasha-timeline.js.map +4 -4
  26. package/dist/cdn/components/data.js +10 -3
  27. package/dist/cdn/components/data.js.map +4 -4
  28. package/dist/cdn/components/divisional-chart.js +31 -24
  29. package/dist/cdn/components/divisional-chart.js.map +4 -4
  30. package/dist/cdn/components/dosha-card.js +10 -3
  31. package/dist/cdn/components/dosha-card.js.map +4 -4
  32. package/dist/cdn/components/dream-card.js +52 -0
  33. package/dist/cdn/components/dream-card.js.map +7 -0
  34. package/dist/cdn/components/dream-search.js +52 -0
  35. package/dist/cdn/components/dream-search.js.map +7 -0
  36. package/dist/cdn/components/endpoint-form.js +3 -3
  37. package/dist/cdn/components/endpoint-form.js.map +3 -3
  38. package/dist/cdn/components/forecast-digest.js +52 -0
  39. package/dist/cdn/components/forecast-digest.js.map +7 -0
  40. package/dist/cdn/components/forecast-timeline.js +10 -3
  41. package/dist/cdn/components/forecast-timeline.js.map +4 -4
  42. package/dist/cdn/components/guna-milan.js +10 -3
  43. package/dist/cdn/components/guna-milan.js.map +4 -4
  44. package/dist/cdn/components/hd-connection.js +52 -0
  45. package/dist/cdn/components/hd-connection.js.map +7 -0
  46. package/dist/cdn/components/hd-penta.js +52 -0
  47. package/dist/cdn/components/hd-penta.js.map +7 -0
  48. package/dist/cdn/components/hd-variables.js +52 -0
  49. package/dist/cdn/components/hd-variables.js.map +7 -0
  50. package/dist/cdn/components/hexagram.js +10 -3
  51. package/dist/cdn/components/hexagram.js.map +4 -4
  52. package/dist/cdn/components/hora-table.js +52 -0
  53. package/dist/cdn/components/hora-table.js.map +7 -0
  54. package/dist/cdn/components/horoscope-card.js +10 -3
  55. package/dist/cdn/components/horoscope-card.js.map +4 -4
  56. package/dist/cdn/components/kp-chart.js +10 -3
  57. package/dist/cdn/components/kp-chart.js.map +4 -4
  58. package/dist/cdn/components/kp-planets-table.js +10 -3
  59. package/dist/cdn/components/kp-planets-table.js.map +4 -4
  60. package/dist/cdn/components/kp-ruling-planets.js +10 -3
  61. package/dist/cdn/components/kp-ruling-planets.js.map +4 -4
  62. package/dist/cdn/components/location-search.js +3 -3
  63. package/dist/cdn/components/location-search.js.map +2 -2
  64. package/dist/cdn/components/moon-phase.js +10 -3
  65. package/dist/cdn/components/moon-phase.js.map +4 -4
  66. package/dist/cdn/components/nakshatra-card.js +10 -3
  67. package/dist/cdn/components/nakshatra-card.js.map +4 -4
  68. package/dist/cdn/components/natal-chart.js +16 -9
  69. package/dist/cdn/components/natal-chart.js.map +4 -4
  70. package/dist/cdn/components/numerology-card.js +10 -3
  71. package/dist/cdn/components/numerology-card.js.map +4 -4
  72. package/dist/cdn/components/panchang-table.js +10 -3
  73. package/dist/cdn/components/panchang-table.js.map +4 -4
  74. package/dist/cdn/components/reference-card.js +52 -0
  75. package/dist/cdn/components/reference-card.js.map +7 -0
  76. package/dist/cdn/components/shadbala-table.js +10 -3
  77. package/dist/cdn/components/shadbala-table.js.map +4 -4
  78. package/dist/cdn/components/synastry-chart.js +16 -9
  79. package/dist/cdn/components/synastry-chart.js.map +4 -4
  80. package/dist/cdn/components/tarot-card.js +10 -3
  81. package/dist/cdn/components/tarot-card.js.map +4 -4
  82. package/dist/cdn/components/tarot-catalog.js +52 -0
  83. package/dist/cdn/components/tarot-catalog.js.map +7 -0
  84. package/dist/cdn/components/tarot-spread.js +10 -3
  85. package/dist/cdn/components/tarot-spread.js.map +4 -4
  86. package/dist/cdn/components/transits-table.js +10 -3
  87. package/dist/cdn/components/transits-table.js.map +4 -4
  88. package/dist/cdn/components/vedic-aspects.js +52 -0
  89. package/dist/cdn/components/vedic-aspects.js.map +7 -0
  90. package/dist/cdn/components/vedic-kundli.js +31 -24
  91. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  92. package/dist/cdn/components/vedic-planets-table.js +10 -3
  93. package/dist/cdn/components/vedic-planets-table.js.map +4 -4
  94. package/dist/cdn/components/western-planets-table.js +10 -3
  95. package/dist/cdn/components/western-planets-table.js.map +4 -4
  96. package/dist/cdn/components/yoga-list.js +10 -3
  97. package/dist/cdn/components/yoga-list.js.map +4 -4
  98. package/dist/cdn/roxy-ui.js +92 -81
  99. package/dist/cdn/roxy-ui.js.map +4 -4
  100. package/dist/components/angel-number-card.d.ts +17 -0
  101. package/dist/components/angel-number-card.d.ts.map +1 -0
  102. package/dist/components/angel-number-card.js +2 -0
  103. package/dist/components/angel-number-card.js.map +7 -0
  104. package/dist/components/angel-number-lookup.d.ts +21 -0
  105. package/dist/components/angel-number-lookup.d.ts.map +1 -0
  106. package/dist/components/angel-number-lookup.js +2 -0
  107. package/dist/components/angel-number-lookup.js.map +7 -0
  108. package/dist/components/ashtakavarga-grid.d.ts +4 -5
  109. package/dist/components/ashtakavarga-grid.d.ts.map +1 -1
  110. package/dist/components/ashtakavarga-grid.js +1 -1
  111. package/dist/components/ashtakavarga-grid.js.map +4 -4
  112. package/dist/components/aspects-table.d.ts +23 -0
  113. package/dist/components/aspects-table.d.ts.map +1 -0
  114. package/dist/components/aspects-table.js +2 -0
  115. package/dist/components/aspects-table.js.map +7 -0
  116. package/dist/components/biorhythm-chart.d.ts +4 -5
  117. package/dist/components/biorhythm-chart.d.ts.map +1 -1
  118. package/dist/components/biorhythm-chart.js +1 -1
  119. package/dist/components/biorhythm-chart.js.map +4 -4
  120. package/dist/components/bodygraph.d.ts +4 -5
  121. package/dist/components/bodygraph.d.ts.map +1 -1
  122. package/dist/components/bodygraph.js +9 -9
  123. package/dist/components/bodygraph.js.map +4 -4
  124. package/dist/components/choghadiya-grid.d.ts +4 -5
  125. package/dist/components/choghadiya-grid.d.ts.map +1 -1
  126. package/dist/components/choghadiya-grid.js +1 -1
  127. package/dist/components/choghadiya-grid.js.map +4 -4
  128. package/dist/components/compatibility-card.d.ts +4 -5
  129. package/dist/components/compatibility-card.d.ts.map +1 -1
  130. package/dist/components/compatibility-card.js +1 -1
  131. package/dist/components/compatibility-card.js.map +4 -4
  132. package/dist/components/crystal-card.d.ts +19 -0
  133. package/dist/components/crystal-card.d.ts.map +1 -0
  134. package/dist/components/crystal-card.js +2 -0
  135. package/dist/components/crystal-card.js.map +7 -0
  136. package/dist/components/crystal-grid.d.ts +26 -0
  137. package/dist/components/crystal-grid.d.ts.map +1 -0
  138. package/dist/components/crystal-grid.js +2 -0
  139. package/dist/components/crystal-grid.js.map +7 -0
  140. package/dist/components/dasha-timeline.d.ts +4 -5
  141. package/dist/components/dasha-timeline.d.ts.map +1 -1
  142. package/dist/components/dasha-timeline.js +1 -1
  143. package/dist/components/dasha-timeline.js.map +4 -4
  144. package/dist/components/data.d.ts +5 -8
  145. package/dist/components/data.d.ts.map +1 -1
  146. package/dist/components/data.js +1 -1
  147. package/dist/components/data.js.map +4 -4
  148. package/dist/components/divisional-chart.d.ts +4 -5
  149. package/dist/components/divisional-chart.d.ts.map +1 -1
  150. package/dist/components/divisional-chart.js +59 -59
  151. package/dist/components/divisional-chart.js.map +4 -4
  152. package/dist/components/dosha-card.d.ts +4 -5
  153. package/dist/components/dosha-card.d.ts.map +1 -1
  154. package/dist/components/dosha-card.js +1 -1
  155. package/dist/components/dosha-card.js.map +4 -4
  156. package/dist/components/dream-card.d.ts +16 -0
  157. package/dist/components/dream-card.d.ts.map +1 -0
  158. package/dist/components/dream-card.js +2 -0
  159. package/dist/components/dream-card.js.map +7 -0
  160. package/dist/components/dream-search.d.ts +18 -0
  161. package/dist/components/dream-search.d.ts.map +1 -0
  162. package/dist/components/dream-search.js +2 -0
  163. package/dist/components/dream-search.js.map +7 -0
  164. package/dist/components/endpoint-form.d.ts +10 -5
  165. package/dist/components/endpoint-form.d.ts.map +1 -1
  166. package/dist/components/endpoint-form.js +1 -1
  167. package/dist/components/endpoint-form.js.map +3 -3
  168. package/dist/components/forecast-digest.d.ts +19 -0
  169. package/dist/components/forecast-digest.d.ts.map +1 -0
  170. package/dist/components/forecast-digest.js +2 -0
  171. package/dist/components/forecast-digest.js.map +7 -0
  172. package/dist/components/forecast-timeline.d.ts +8 -6
  173. package/dist/components/forecast-timeline.d.ts.map +1 -1
  174. package/dist/components/forecast-timeline.js +1 -1
  175. package/dist/components/forecast-timeline.js.map +4 -4
  176. package/dist/components/guna-milan.d.ts +4 -5
  177. package/dist/components/guna-milan.d.ts.map +1 -1
  178. package/dist/components/guna-milan.js +1 -1
  179. package/dist/components/guna-milan.js.map +4 -4
  180. package/dist/components/hd-connection.d.ts +18 -0
  181. package/dist/components/hd-connection.d.ts.map +1 -0
  182. package/dist/components/hd-connection.js +2 -0
  183. package/dist/components/hd-connection.js.map +7 -0
  184. package/dist/components/hd-penta.d.ts +18 -0
  185. package/dist/components/hd-penta.d.ts.map +1 -0
  186. package/dist/components/hd-penta.js +2 -0
  187. package/dist/components/hd-penta.js.map +7 -0
  188. package/dist/components/hd-variables.d.ts +17 -0
  189. package/dist/components/hd-variables.d.ts.map +1 -0
  190. package/dist/components/hd-variables.js +2 -0
  191. package/dist/components/hd-variables.js.map +7 -0
  192. package/dist/components/hexagram.d.ts +4 -5
  193. package/dist/components/hexagram.d.ts.map +1 -1
  194. package/dist/components/hexagram.js +1 -1
  195. package/dist/components/hexagram.js.map +4 -4
  196. package/dist/components/hora-table.d.ts +17 -0
  197. package/dist/components/hora-table.d.ts.map +1 -0
  198. package/dist/components/hora-table.js +2 -0
  199. package/dist/components/hora-table.js.map +7 -0
  200. package/dist/components/horoscope-card.d.ts +4 -5
  201. package/dist/components/horoscope-card.d.ts.map +1 -1
  202. package/dist/components/horoscope-card.js +1 -1
  203. package/dist/components/horoscope-card.js.map +4 -4
  204. package/dist/components/kp-chart.d.ts +4 -5
  205. package/dist/components/kp-chart.d.ts.map +1 -1
  206. package/dist/components/kp-chart.js +1 -1
  207. package/dist/components/kp-chart.js.map +4 -4
  208. package/dist/components/kp-planets-table.d.ts +4 -5
  209. package/dist/components/kp-planets-table.d.ts.map +1 -1
  210. package/dist/components/kp-planets-table.js +1 -1
  211. package/dist/components/kp-planets-table.js.map +4 -4
  212. package/dist/components/kp-ruling-planets.d.ts +4 -5
  213. package/dist/components/kp-ruling-planets.d.ts.map +1 -1
  214. package/dist/components/kp-ruling-planets.js +1 -1
  215. package/dist/components/kp-ruling-planets.js.map +4 -4
  216. package/dist/components/location-search.js +1 -1
  217. package/dist/components/location-search.js.map +2 -2
  218. package/dist/components/moon-phase.d.ts +5 -5
  219. package/dist/components/moon-phase.d.ts.map +1 -1
  220. package/dist/components/moon-phase.js +1 -1
  221. package/dist/components/moon-phase.js.map +4 -4
  222. package/dist/components/nakshatra-card.d.ts +4 -5
  223. package/dist/components/nakshatra-card.d.ts.map +1 -1
  224. package/dist/components/nakshatra-card.js +1 -1
  225. package/dist/components/nakshatra-card.js.map +4 -4
  226. package/dist/components/natal-chart.d.ts +4 -5
  227. package/dist/components/natal-chart.d.ts.map +1 -1
  228. package/dist/components/natal-chart.js +8 -8
  229. package/dist/components/natal-chart.js.map +4 -4
  230. package/dist/components/numerology-card.d.ts +15 -10
  231. package/dist/components/numerology-card.d.ts.map +1 -1
  232. package/dist/components/numerology-card.js +1 -1
  233. package/dist/components/numerology-card.js.map +4 -4
  234. package/dist/components/panchang-table.d.ts +4 -5
  235. package/dist/components/panchang-table.d.ts.map +1 -1
  236. package/dist/components/panchang-table.js +1 -1
  237. package/dist/components/panchang-table.js.map +4 -4
  238. package/dist/components/reference-card.d.ts +19 -0
  239. package/dist/components/reference-card.d.ts.map +1 -0
  240. package/dist/components/reference-card.js +2 -0
  241. package/dist/components/reference-card.js.map +7 -0
  242. package/dist/components/shadbala-table.d.ts +4 -5
  243. package/dist/components/shadbala-table.d.ts.map +1 -1
  244. package/dist/components/shadbala-table.js +1 -1
  245. package/dist/components/shadbala-table.js.map +4 -4
  246. package/dist/components/synastry-chart.d.ts +4 -5
  247. package/dist/components/synastry-chart.d.ts.map +1 -1
  248. package/dist/components/synastry-chart.js +7 -7
  249. package/dist/components/synastry-chart.js.map +4 -4
  250. package/dist/components/tarot-card.d.ts +4 -5
  251. package/dist/components/tarot-card.d.ts.map +1 -1
  252. package/dist/components/tarot-card.js +1 -1
  253. package/dist/components/tarot-card.js.map +4 -4
  254. package/dist/components/tarot-catalog.d.ts +20 -0
  255. package/dist/components/tarot-catalog.d.ts.map +1 -0
  256. package/dist/components/tarot-catalog.js +2 -0
  257. package/dist/components/tarot-catalog.js.map +7 -0
  258. package/dist/components/tarot-spread.d.ts +7 -8
  259. package/dist/components/tarot-spread.d.ts.map +1 -1
  260. package/dist/components/tarot-spread.js +1 -1
  261. package/dist/components/tarot-spread.js.map +4 -4
  262. package/dist/components/transits-table.d.ts +4 -5
  263. package/dist/components/transits-table.d.ts.map +1 -1
  264. package/dist/components/transits-table.js +1 -1
  265. package/dist/components/transits-table.js.map +4 -4
  266. package/dist/components/vedic-aspects.d.ts +16 -0
  267. package/dist/components/vedic-aspects.d.ts.map +1 -0
  268. package/dist/components/vedic-aspects.js +2 -0
  269. package/dist/components/vedic-aspects.js.map +7 -0
  270. package/dist/components/vedic-kundli.d.ts +22 -5
  271. package/dist/components/vedic-kundli.d.ts.map +1 -1
  272. package/dist/components/vedic-kundli.js +63 -63
  273. package/dist/components/vedic-kundli.js.map +4 -4
  274. package/dist/components/vedic-planets-table.d.ts +4 -5
  275. package/dist/components/vedic-planets-table.d.ts.map +1 -1
  276. package/dist/components/vedic-planets-table.js +1 -1
  277. package/dist/components/vedic-planets-table.js.map +4 -4
  278. package/dist/components/western-planets-table.d.ts +4 -5
  279. package/dist/components/western-planets-table.d.ts.map +1 -1
  280. package/dist/components/western-planets-table.js +1 -1
  281. package/dist/components/western-planets-table.js.map +4 -4
  282. package/dist/components/yoga-list.d.ts +6 -7
  283. package/dist/components/yoga-list.d.ts.map +1 -1
  284. package/dist/components/yoga-list.js +1 -1
  285. package/dist/components/yoga-list.js.map +4 -4
  286. package/dist/generated/endpoint-bindings.d.ts +15 -0
  287. package/dist/generated/endpoint-bindings.d.ts.map +1 -0
  288. package/dist/index.cjs +73 -73
  289. package/dist/index.cjs.map +4 -4
  290. package/dist/index.d.ts +16 -0
  291. package/dist/index.d.ts.map +1 -1
  292. package/dist/index.js +71 -71
  293. package/dist/index.js.map +4 -4
  294. package/dist/manifest.d.ts.map +1 -1
  295. package/dist/manifest.json +39 -24
  296. package/dist/styles/tokens-css.d.ts +1 -1
  297. package/dist/styles/tokens-css.d.ts.map +1 -1
  298. package/dist/styles/tokens.css +4 -0
  299. package/dist/types/index.d.ts +1 -1
  300. package/dist/types/index.d.ts.map +1 -1
  301. package/dist/types/types.gen.d.ts +1103 -164
  302. package/dist/types/types.gen.d.ts.map +1 -1
  303. package/dist/utils/angel-sections.d.ts +14 -0
  304. package/dist/utils/angel-sections.d.ts.map +1 -0
  305. package/dist/utils/base-element.d.ts +73 -0
  306. package/dist/utils/base-element.d.ts.map +1 -0
  307. package/dist/utils/base-styles.d.ts.map +1 -1
  308. package/dist/utils/fetch-controller.d.ts +60 -0
  309. package/dist/utils/fetch-controller.d.ts.map +1 -0
  310. package/dist/utils/kundli-render.d.ts +2 -1
  311. package/dist/utils/kundli-render.d.ts.map +1 -1
  312. package/dist/utils/kundli-styles.d.ts.map +1 -1
  313. package/dist/utils/markup-data.d.ts +34 -0
  314. package/dist/utils/markup-data.d.ts.map +1 -1
  315. package/dist/version.d.ts +1 -1
  316. package/dist/version.d.ts.map +1 -1
  317. package/package.json +2 -1
  318. package/src/components/angel-number-card.ts +210 -0
  319. package/src/components/angel-number-lookup.ts +207 -0
  320. package/src/components/ashtakavarga-grid.ts +15 -20
  321. package/src/components/aspects-table.ts +329 -0
  322. package/src/components/biorhythm-chart.ts +14 -18
  323. package/src/components/bodygraph.ts +9 -20
  324. package/src/components/choghadiya-grid.ts +15 -19
  325. package/src/components/compatibility-card.ts +9 -19
  326. package/src/components/crystal-card.ts +242 -0
  327. package/src/components/crystal-grid.ts +182 -0
  328. package/src/components/dasha-timeline.ts +9 -20
  329. package/src/components/data.ts +8 -27
  330. package/src/components/divisional-chart.ts +10 -18
  331. package/src/components/dosha-card.ts +8 -19
  332. package/src/components/dream-card.ts +88 -0
  333. package/src/components/dream-search.ts +135 -0
  334. package/src/components/endpoint-form.ts +149 -55
  335. package/src/components/forecast-digest.ts +213 -0
  336. package/src/components/forecast-timeline.ts +24 -19
  337. package/src/components/guna-milan.ts +8 -19
  338. package/src/components/hd-connection.ts +188 -0
  339. package/src/components/hd-penta.ts +165 -0
  340. package/src/components/hd-variables.ts +128 -0
  341. package/src/components/hexagram.ts +10 -18
  342. package/src/components/hora-table.ts +149 -0
  343. package/src/components/horoscope-card.ts +9 -19
  344. package/src/components/kp-chart.ts +11 -20
  345. package/src/components/kp-planets-table.ts +11 -20
  346. package/src/components/kp-ruling-planets.ts +8 -18
  347. package/src/components/moon-phase.ts +10 -19
  348. package/src/components/nakshatra-card.ts +11 -20
  349. package/src/components/natal-chart.ts +20 -23
  350. package/src/components/numerology-card.ts +90 -31
  351. package/src/components/panchang-table.ts +9 -19
  352. package/src/components/reference-card.ts +212 -0
  353. package/src/components/shadbala-table.ts +15 -18
  354. package/src/components/synastry-chart.ts +17 -20
  355. package/src/components/tarot-card.ts +9 -20
  356. package/src/components/tarot-catalog.ts +129 -0
  357. package/src/components/tarot-spread.ts +20 -21
  358. package/src/components/transits-table.ts +17 -20
  359. package/src/components/vedic-aspects.ts +188 -0
  360. package/src/components/vedic-kundli.ts +46 -19
  361. package/src/components/vedic-planets-table.ts +11 -19
  362. package/src/components/western-planets-table.ts +11 -19
  363. package/src/components/yoga-list.ts +17 -23
  364. package/src/generated/endpoint-bindings.ts +655 -0
  365. package/src/index.ts +27 -0
  366. package/src/manifest.ts +198 -6
  367. package/src/styles/tokens-css.ts +4 -0
  368. package/src/styles/tokens.css +4 -0
  369. package/src/types/index.ts +1 -1
  370. package/src/types/types.gen.ts +1123 -164
  371. package/src/utils/angel-sections.ts +38 -0
  372. package/src/utils/base-element.ts +183 -0
  373. package/src/utils/base-styles.ts +33 -0
  374. package/src/utils/fetch-controller.ts +166 -0
  375. package/src/utils/kundli-render.ts +9 -2
  376. package/src/utils/kundli-styles.ts +7 -1
  377. package/src/utils/markup-data.ts +45 -0
  378. package/src/version.ts +1 -1
package/dist/index.js CHANGED
@@ -1,92 +1,92 @@
1
- var oa=Object.defineProperty;var na=Object.getOwnPropertyDescriptor;var d=(o,n,e,r)=>{for(var t=r>1?void 0:r?na(n,e):n,a=o.length-1,s;a>=0;a--)(s=o[a])&&(t=(r?s(n,e,t):s(t))||t);return r&&t&&oa(n,e,t),t};import{css as ca,html as q,LitElement as pa,nothing as ma}from"lit";import{customElement as ga,property as ya,state as ua}from"lit/decorators.js";var C={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},kt={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"},Y={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Br={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},G=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],An=G.map(o=>o.toLowerCase()),Tr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},at={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"},St={"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}"};import{css as ia}from"lit";var g=ia`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var la="roxy-data";function da(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var u=class{constructor(n){this.host=n,n.addController(this)}hostConnected(){if(this.host.data!=null)return;let n=this.read();n!==void 0&&(this.host.data=n,this.host.requestUpdate())}read(){let n=this.findInlineScript();return n?this.parse(n.textContent):void 0}findInlineScript(){for(let n of Array.from(this.host.children))if(da(n)&&n.classList.contains(la))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var ha={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Qe=["sarva","bhinna","pinda"],Pe=class extends pa{constructor(){super();this.data=null;this.activeTab="sarva";new u(this)}render(){if(!this.data)return q`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return q`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?q`<p class="subtitle">${e.length} signs</p>`:ma}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Qe.map(r=>q`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${ha[r]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=Qe.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Qe[(r+1)%Qe.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Qe[(r-1+Qe.length)%Qe.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?q`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,a)=>{let s=r.bindus[a]??0,i=this.sarvaHeat(s);return q`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${Y[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${s}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:q`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?q`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>q`<th scope="col" title="${t}">${Y[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>q`<tr><td>${t.planet}</td>${t.bindus.map(a=>{let s=this.bhinnaHeat(a);return q`<td class="${`heat-cell ${s}`}">${a}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:q`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?q`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>q`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:q`<p class="roxy-empty">No shodhya pinda data</p>`}};Pe.styles=[g,ca`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([ya({attribute:!1})],Pe.prototype,"data",2),d([ua()],Pe.prototype,"activeTab",2),Pe=d([ga("roxy-ashtakavarga-grid")],Pe);import{css as xa,html as le,LitElement as fa,nothing as _r,svg as ba}from"lit";import{customElement as va,property as Ct}from"lit/decorators.js";var Pt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},Le=class extends fa{constructor(){super();this.data=null;this.mode="daily";new u(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):le`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([a,s])=>{let i=typeof s=="number"?s:0,l=Math.abs(i)>1?i/100:i;return[a,l]});return le`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?le`<span class="energy">Energy ${e.energyRating}/10</span>`:_r}</header><div class="bars" role="list">${t.map(([a,s])=>{let i=(s+1)/2*100,l=Pt[a]??"var(--roxy-accent, #f59e0b)";return le`<div class="bar" role="listitem"><span style="text-transform:capitalize">${a}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(s*100)}%</span></div>`})}</div>${e.dailyMessage?le`<p class="advice">${e.dailyMessage}</p>`:_r} ${e.advice?le`<p class="advice">${e.advice}</p>`:_r}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return le`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,a=160,s=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return le`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${a}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${a/2}" x2="${t}" y2="${a/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((p,y)=>{let v=p[l]??0,h=y*s,Xe=a/2-v/100*(a/2-8);return`${h.toFixed(2)},${Xe.toFixed(2)}`}).join(" "),m=Pt[l]??"#475569";return ba`<polyline points=${c} fill="none" stroke=${m} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?le`<p class="advice">${e.summary.periodAdvice}</p>`:_r}</section>`}renderCritical(e){return le`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>le`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};Le.styles=[g,xa`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([Ct({attribute:!1})],Le.prototype,"data",2),d([Ct({type:String,reflect:!0})],Le.prototype,"mode",2),Le=d([va("roxy-biorhythm-chart")],Le);import{css as Ga,html as ce,LitElement as Oa,nothing as Te}from"lit";import{customElement as Ha,property as Ia}from"lit/decorators.js";import{nothing as $a,svg as we}from"lit";var qr=4,Vr=9,Tt=(100+2*Vr)*qr,wa=(100+2*Vr)*qr;function Z(o,n){return{x:(o+Vr)*qr,y:(n+Vr)*qr}}var Rr=50,it=o=>2*Rr-o,st={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},ka={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function Sa(){let o={},n={};for(let[e,[r,t]]of Object.entries(st.spleen))st["solar-plexus"][ka[Number(e)]]=[it(r),t];for(let[e,r]of Object.entries(st))for(let[t,[a,s]]of Object.entries(r))o[Number(t)]=Z(a,s),n[Number(t)]=e;return{points:o,centerOf:n}}var{points:nt,centerOf:Wn}=Sa(),Jn=Tt/2;function Ze(o){return o.map(([n,e])=>Z(n,e))}function ot(o,n,e){return Ze([[Rr-o,n],[Rr+o,n],[Rr+o,e],[Rr-o,e]])}var Lt=[[18.4,68],[18.4,81.8],[34.7,74.9]],Ca=[{id:"head",label:"Head",color:"gold",points:Ze([[40,14.3],[60,14.3],[50,6]]),labelAnchor:Z(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:Ze([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:Z(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:ot(9.5,30.4,43.6),labelAnchor:Z(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:Ze([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:Z(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:Ze([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:Z(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:Ze(Lt),labelAnchor:Z(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:ot(9.5,70.6,83.6),labelAnchor:Z(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:Ze(Lt.map(([o,n])=>[it(o),n])),labelAnchor:Z(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:ot(9.5,87.9,99.9),labelAnchor:Z(50,103),labelAlign:"middle"}],Pa=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],La=Ta();function Ta(){let o=it,n=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${Kr(n[0])}`];for(let r=1;r+2<n.length;r+=3)e.push(`C ${Kr(n[r])} ${Kr(n[r+1])} ${Kr(n[r+2])}`);e.push(`L ${Yr(n[n.length-1],o)}`);for(let r=n.length-3;r>=1;r-=3)e.push(`C ${Yr(n[r+1],o)} ${Yr(n[r],o)} ${Yr(n[r-1],o)}`);return e.push("Z"),e.join(" ")}function Kr([o,n]){let e=Z(o,n);return`${e.x} ${e.y}`}function Yr([o,n],e){let r=Z(e(o),n);return`${r.x} ${r.y}`}function Ra(o){return o.map(n=>`${n.x},${n.y}`).join(" ")}function Rt(o,n){return o<n?`${o}-${n}`:`${n}-${o}`}function Aa(){return we`<path class="bg-body" d=${La} />`}function Ea(o,n){let e=[];for(let[r,t]of Pa){let a=nt[r],s=nt[t];if(!a||!s)continue;if(e.push(we`<line class="bg-channel" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />`),o.has(Rt(r,t))){e.push(we`<line class="bg-channel on" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />`);continue}let i={x:(a.x+s.x)/2,y:(a.y+s.y)/2};n.has(r)&&e.push(we`<line class="bg-half" x1=${a.x} y1=${a.y} x2=${i.x} y2=${i.y} />`),n.has(t)&&e.push(we`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`)}return e}function Na(o,n,e){let r=e.x-n.x,t=e.y-n.y,a=r*r+t*t;if(a===0)return n;let s=Math.max(0,Math.min(1,((o.x-n.x)*r+(o.y-n.y)*t)/a));return{x:n.x+s*r,y:n.y+s*t}}function za(o,n){let e=n[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<n.length;t++){let a=Na(o,n[t],n[(t+1)%n.length]),s=(a.x-o.x)**2+(a.y-o.y)**2;s<r&&(r=s,e=a)}return e}function Ma(o){return Ca.map(n=>{let e=o.has(n.id),r=`bg-center bg-${n.color}${e?" defined":""}`,t=za(n.labelAnchor,n.points);return we`<g>
2
- <line class="bg-leader" x1=${n.labelAnchor.x} y1=${n.labelAnchor.y} x2=${t.x} y2=${t.y} />
3
- <polygon class=${r} points=${Ra(n.points)}><title>${n.label}: ${e?"defined":"open"}</title></polygon>
4
- <text class="bg-center-label" x=${n.labelAnchor.x} y=${n.labelAnchor.y} text-anchor=${n.labelAlign} dominant-baseline="central">${n.label}</text>
5
- </g>`})}function Da(o,n){let e=[];for(let[r,t]of Object.entries(nt)){let a=Number(r);if(!o.has(a))continue;let s=n.get(a);e.push(we`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${a}${s?we`<title>${s}</title>`:$a}</text>`)}return e}function At(o,n){return Rt(o,n)}var Et=`0 0 ${Tt} ${wa}`;function Nt(o){return we`
6
- ${Aa()}
7
- ${Ea(o.activeChannels,o.activeGates)}
8
- ${Ma(o.definedCenters)}
9
- ${Da(o.activeGates,o.gateTitles)}
10
- `}function x(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function de(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,n=>n.toUpperCase())}var er=class extends Oa{constructor(){super();this.data=null;new u(this)}render(){let e=this.data;if(!e)return ce`<div class="roxy-empty" role="status">No bodygraph data</div>`;let r=new Set((e.centers??[]).filter(i=>i.defined).map(i=>i.id)),t=new Set((e.gates??[]).map(i=>i.gate).filter(i=>i!=null)),a=new Set((e.channels??[]).map(i=>At(i.gateA,i.gateB))),s=this.buildGateTitles(e.gates??[]);return ce`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?ce`<div class="type-line">${e.type}${e.profile?ce`· Profile ${e.profile}`:Te}</div>`:Te}</header><div class="layout"><svg viewBox="${Et}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Nt({definedCenters:r,activeChannels:a,activeGates:t,gateTitles:s})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let r=new Map;for(let t of e){if(t.gate==null)continue;let a=[`Gate ${t.gate}`];t.line!=null&&(a[0]+=`.${t.line}`),t.gateName&&a.push(t.gateName);let s=t.planet?x(t.planet):"",i=s?C[s]??s:"";i&&a.push(`${i} ${t.side??""}`.trim()),r.set(t.gate,a.join(" \xB7 "))}return r}renderSummary(e){let r=[{label:"Type",value:e.type},{label:"Strategy",value:e.strategy},{label:"Authority",value:e.authority},{label:"Profile",value:e.profile},{label:"Definition",value:e.definition}],t=e.incarnationCross;return ce`<div class="summary"><div class="facts">${r.map(a=>a.value?ce`<div class="fact"><span>${a.label}</span> <strong>${a.value}</strong></div>`:Te)}</div>${t?.name?ce`<p class="cross">${t.name} ${t.gates?.length?ce`<span class="gates">(${t.gates.join(", ")})</span>`:Te}</p>`:Te} ${e.signature||e.notSelf?ce`<div class="themes">${e.signature?ce`<span class="pill pill--good">Signature: ${e.signature}</span>`:Te} ${e.notSelf?ce`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:Te}</div>`:Te}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};er.styles=[g,Ga`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:340px;height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],d([Ia({attribute:!1})],er.prototype,"data",2),er=d([Ha("roxy-bodygraph")],er);import{css as ja,html as Re,LitElement as Ba,nothing as lt}from"lit";import{customElement as _a,property as Ka}from"lit/decorators.js";function zt(o){try{let n=new Date(o);return Number.isNaN(n.getTime())?o:n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return o}}var rr=class extends Ba{constructor(){super();this.data=null;new u(this)}isCurrent(e){let r=Date.now(),t=Date.parse(e.start),a=Date.parse(e.end);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",t=this.isCurrent(e),a=C[x(e.lord)]??"",s=`${zt(e.start)} - ${zt(e.end)}`;return Re`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?Re`<span class="now-badge">Now</span>`:lt} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${a?Re`<span aria-hidden="true">${a}</span>`:lt} ${e.lord}</span></div>`}render(){if(!this.data)return Re`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return Re`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?Re`<p class="subtitle">${e}</p>`:lt}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(a=>this.renderTile(a)):Re`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(a=>this.renderTile(a)):Re`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};rr.styles=[g,ja`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],d([Ka({attribute:!1})],rr.prototype,"data",2),rr=d([_a("roxy-choghadiya-grid")],rr);import{css as Ya,html as O,LitElement as qa,nothing as te}from"lit";import{customElement as Va,property as Dt}from"lit/decorators.js";function ye(o){if(typeof o!="string"||o.length===0||/^\d{4}-\d{2}-\d{2}$/.test(o))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(o)?`1970-01-01T${o}`:o,r=new Date(e);return Number.isNaN(r.getTime())?o:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Ae(o){if(typeof o!="string"||o.length===0)return"";let n=new Date(/^\d{4}-\d{2}-\d{2}$/.test(o)?`${o}T00:00:00`:o);return Number.isNaN(n.getTime())?o:n.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function dt(o){if(!o)return"";let n=ye(o.start),e=ye(o.end);return n&&e?`${n} - ${e}`:n||e||""}function f(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function Mt(o,n=1){let e=f(o,n);return e?`${e}%`:""}var tr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function hr(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var Ee=class extends qa{constructor(){super();this.data=null;this.mode="astrology";new u(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,a]of Object.entries(e.categories))typeof a=="number"&&Number.isFinite(a)&&(r[t]=a);return r}return{}}render(){let e=this.data;if(!e)return O`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),a="rating"in e?e.rating:void 0,s="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,m="strengths"in e?e.strengths:void 0,p="challenges"in e?e.challenges:void 0,y="keyAspects"in e?e.keyAspects:void 0;return O`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?O`<div class="score">${f(r,0)}</div>`:te} ${a?O`<div class="rating">${a}</div>`:te}</div></div>${Object.keys(t).length>0?O`<div role="list">${Object.entries(t).map(([v,h])=>O`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${v}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,h))}%"></span></span> <span>${f(h,0)}</span></div>`)}</div>`:te} ${s?O`<p><span class="archetype">${s.label}</span> ${s.description?O`· ${s.description}`:te}</p>`:te} ${l?O`<p>${l}</p>`:te} ${c&&!l?O`<p>${c}</p>`:te} ${i?O`<p>${i}</p>`:te} ${(m?.length??0)>0||(p?.length??0)>0?O`<div class="lists">${m?.length?O`<div><h3>Strengths</h3><ul>${m.map(v=>O`<li>${v}</li>`)}</ul></div>`:te} ${p?.length?O`<div><h3>Challenges</h3><ul>${p.map(v=>O`<li>${v}</li>`)}</ul></div>`:te}</div>`:te} ${y?.length?O`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${y.slice(0,6).map(v=>O`<li>${Fa(v)}</li>`)}</ul></div>`:te}</article>`}};Ee.styles=[g,Ya`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([Dt({attribute:!1})],Ee.prototype,"data",2),d([Dt({type:String,reflect:!0})],Ee.prototype,"mode",2),Ee=d([Va("roxy-compatibility-card")],Ee);function Fa(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${f(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}import{css as Ua,html as E,LitElement as Wa,nothing as V}from"lit";import{customElement as Ja,property as Gt}from"lit/decorators.js";var Ne=class extends Wa{constructor(){super();this.data=null;this.period="current";new u(this)}render(){let e=this.data;if(!e)return E`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(a=>a.durationYears)):0;return E`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?E`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?E`(lord ${e.nakshatraLord})`:V}</div>`:V}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):V} ${r.length>0?E`<div class="timeline" role="list">${r.map(a=>this.renderBar(a,t))}</div>`:V} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return V;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",a=r.years??0,s=r.months??0,i=r.days??0,l=[];a&&l.push(`${a}y`),s&&l.push(`${s}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return E`<p class="balance">Birth dasha balance: ${c} of ${t?E`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?E`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:V}renderCurrent(e){return"mahadasha"in e?E`<div class="current">${"mahadasha"in e&&e.mahadasha?E`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?E`<small>${f(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:V}</div>`:V} ${"antardasha"in e&&e.antardasha?E`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?E`<small>${f(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:V}</div>`:V} ${"pratyantardasha"in e&&e.pratyantardasha?E`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?E`<small>${f(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:V}</div>`:V}</div>`:V}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),a=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),a=Date.now();return Number.isNaN(r)||Number.isNaN(t)||a<r||a>=t||t<=r?-1:(a-r)/(t-r)}renderBar(e,r){let t=e.durationYears,a=r>0?t/r*100:0,s=this.isCurrent(e),i=s?this.progressIn(e):-1,l=s?"bar-track bar-now":"bar-track";return E`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?E`<span class="now-badge">Now</span>`:V} </span><span class="${l}"><span class="bar-fill" style="width:${a}%"></span> ${i>=0?E`<span class="bar-progress" style="left:${i*a}%" aria-hidden="true"></span>`:V} </span><span class="dates">${e.startDate?Ot(e.startDate):""} ${e.endDate?E`- ${Ot(e.endDate)}`:""}</span></div>`}};Ne.styles=[g,Ua`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([Gt({attribute:!1})],Ne.prototype,"data",2),d([Gt({type:String,reflect:!0})],Ne.prototype,"period",2),Ne=d([Ja("roxy-dasha-timeline")],Ne);function Ot(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}import{css as Xa,html as L,LitElement as Qa,nothing as Ar}from"lit";import{customElement as Za,property as Ht}from"lit/decorators.js";var es=["title","name","label","heading","overview","summary"],rs=["imageUrl","image","icon","symbol"],ts=["imageUrl","image"],as=6,ze=class extends Qa{constructor(){super();this.data=null;this.depth=0;new u(this)}render(){return this.data==null?L`<div class="roxy-empty" role="status">No data</div>`:this.depth>=as?L`<div class="roxy-empty" role="status">…</div>`:L`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?Ar:typeof e=="string"?L`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?L`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?L`<div class="roxy-empty" role="status">Empty list</div>`:e.every(a=>a===null||["string","number","boolean"].includes(typeof a))?L`<ul class="roxy-chips">${e.map(a=>L`<li>${String(a)}</li>`)}</ul>`:e.every(a=>a!==null&&typeof a=="object"&&!Array.isArray(a))?this.renderTable(e):L`<ol>${e.map(a=>L`<li>${this.renderValue(a)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return L`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>L`<th>${de(t)}</th>`)}</tr></thead><tbody>${e.map(t=>L`<tr>${r.map(a=>L`<td>${this.formatPrimitive(t[a])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=es.find(i=>typeof e[i]=="string"),t=rs.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),a=r!=="summary"&&typeof e.summary=="string"?"summary":null,s=Object.entries(e).filter(([i,l])=>i!==r&&i!==a&&!ts.includes(i)&&l!==null&&l!==void 0);return L`${t?L`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:Ar} ${r?L`<h3 class="roxy-title">${e[r]}</h3>`:Ar} ${a?L`<p class="roxy-summary">${e[a]}</p>`:Ar} ${s.length>0?L`<dl class="roxy-rows">${s.map(([i,l])=>L`<dt>${de(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:Ar}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?L`<ul class="roxy-chips">${e.map(t=>L`<li>${String(t)}</li>`)}</ul>`:L`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let a of Object.keys(t))r.add(a);return Array.from(r)}};ze.styles=[g,Xa`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([Ht({attribute:!1})],ze.prototype,"data",2),d([Ht({attribute:!1})],ze.prototype,"depth",2),ze=d([Za("roxy-data")],ze);import{css as Ls,html as fr,LitElement as Ts,nothing as mt}from"lit";import{customElement as Rs,property as Kt}from"lit/decorators.js";import{nothing as ee,svg as R}from"lit";function ue(o){let n=o%360;return n<0?n+360:n}function he(o){let n=ue(o),e=Math.floor(n/30)%12,r=n%30,t=Math.floor(r),a=(r-t)*60,s=Math.floor(a),i=Math.round((a-s)*60);return{sign:G[e]??"Aries",signIndex:e,degree:t,minute:s,second:i}}function Fr(o){let{sign:n,degree:e,minute:r}=he(o);return`${e}\xB0 ${n} ${String(r).padStart(2,"0")}'`}function ct(o){return ue(o+180)}function It(o,n){let e=ue(o),r=ue(n)-e;return r<0&&(r+=360),ue(e+r/2)}function k(o,n,e,r){let t=r*Math.PI/180;return{x:o+e*Math.cos(t),y:n+e*Math.sin(t)}}import{css as ss,html as jt,nothing as os}from"lit";var Me=ss`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function xr(o){let{items:n,active:e,onSelect:r,label:t,idPrefix:a,controls:s=!1}=o;return jt`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=n.findIndex(v=>v.id===e);if(c===-1)return;let m=l.key==="ArrowRight"?1:-1,p=n[(c+m+n.length)%n.length];if(!p)return;r(p.id);let y=l.currentTarget.getRootNode();requestAnimationFrame(()=>{y.querySelector(`#${a}-tab-${p.id}`)?.focus()})}}">${n.map(l=>jt`<button type="button" class="roxy-tab" role="tab" id="${a}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${s&&e===l.id?`${a}-panel-${l.id}`:os}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var pe=400,S=20,B=pe-2*S,T=pe/2,ns=Object.fromEntries(G.map(o=>[o.toLowerCase(),o])),is=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],ls="\u02B3";function Bt(o,n){return typeof o.longitude!="number"||!Number.isFinite(o.longitude)?!1:he(o.longitude).sign.toLowerCase()!==n.toLowerCase()}function ds(o,n){let e=kt[x(o.graha)]??o.graha.slice(0,2),r=o.isRetrograde?ls:"";if(typeof o.longitude!="number"||!Number.isFinite(o.longitude)||Bt(o,n))return`${e}${r}`;let{degree:t}=he(o.longitude);return`${e} ${t}\xB0${r}`}function cs(o,n){let e=[x(o.graha)],r=Bt(o,n);if(r&&e.push(`in ${n}`),typeof o.longitude=="number"&&Number.isFinite(o.longitude)){let t=he(o.longitude),a=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${a}' ${t.sign}`:`${t.degree}\xB0${a}' ${t.sign}`)}if(o.nakshatra?.name){let t=o.nakshatra.pada?` pada ${o.nakshatra.pada}`:"";e.push(`${o.nakshatra.name}${t}`)}return o.awastha&&e.push(o.awastha),o.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function pt(o,n,e,r,t){let a=r-(o.length-1)*t/2;return o.map((s,i)=>{let l=a+i*t;return R`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${ds(s,n)}<title>${cs(s,n)}</title></text>`})}function Wr(o,n){let e={};for(let t of G)e[t.toLowerCase()]=[];let r="";for(let[t,a]of Object.entries(o??{})){let s=(a?.rashi??"").toLowerCase();if(t==="Lagna"||a?.graha==="Lagna"){r=ns[s]??"";continue}!s||!(s in e)||e[s]?.push({graha:a.graha??t,longitude:a.longitude,nakshatra:a.nakshatra,isRetrograde:a.isRetrograde,awastha:a.awastha})}return{lagnaSign:r,placements:e,divisionLabel:n}}var ar=B/4,ps={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function ms(o){let n=ps[o]??{col:0,row:0};return{x:S+n.col*ar,y:S+n.row*ar,w:ar,h:ar}}function gs(o){let n=S,e=S+ar,r=S+2*ar,t=S+3*ar,a=pe-S;return R`
11
- <rect class="line" x=${n} y=${n} width=${B} height=${B} stroke-width="1.5" fill="none" />
12
- <line class="line" x1=${n} y1=${e} x2=${a} y2=${e} stroke-width="1" />
13
- <line class="line" x1=${n} y1=${t} x2=${a} y2=${t} stroke-width="1" />
14
- <line class="line" x1=${e} y1=${n} x2=${e} y2=${a} stroke-width="1" />
15
- <line class="line" x1=${t} y1=${n} x2=${t} y2=${a} stroke-width="1" />
16
- <line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
17
- <line class="line" x1=${t} y1=${r} x2=${a} y2=${r} stroke-width="1" />
18
- <line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
19
- <line class="line" x1=${r} y1=${t} x2=${r} y2=${a} stroke-width="1" />
20
- ${o?R`<text class="centre-label" x=${T} y=${T} text-anchor="middle" dominant-baseline="central">${o}</text>`:ee}
21
- `}function _t(o,n){let e=G.findIndex(t=>t===n),r=G.findIndex(t=>t===o);return e===-1||r===-1?0:(r-e+12)%12+1}function ys(o,n,e,r){let t=ms(o),a=t.x+t.w/2,s=t.y+t.h/2,i=Br[o]??o.slice(0,2),l=14;return R`
1
+ var Vt=Object.defineProperty;var Yt=Object.getOwnPropertyDescriptor;var d=(n,a,e,r)=>{for(var t=r>1?void 0:r?Yt(a,e):a,s=n.length-1,o;s>=0;s--)(o=n[s])&&(t=(r?o(a,e,t):o(t))||t);return r&&t&&Vt(a,e,t),t};import{css as rs,html as W,nothing as Re}from"lit";import{customElement as as}from"lit/decorators.js";var Ut=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"money",label:"Money"},{key:"twinFlame",label:"Twin flame"}];function Ra(n,a,e){let r=[];if(n)for(let t of Ut){let s=n[t.key];s&&r.push({label:t.label,body:s})}return a&&r.push({label:"Biblical",body:a}),e&&r.push({label:"Shadow",body:e}),r}import{html as la,LitElement as Qt}from"lit";import{property as Ie,state as bt}from"lit/decorators.js";import{ifDefined as es}from"lit/directives/if-defined.js";import{css as Wt}from"lit";var g=Wt`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}:host([bare]){--roxy-surface:transparent;--roxy-shadow-sm:none;--roxy-shadow-md:none}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}.roxy-error{gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-lg,1.5rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}.roxy-surface{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var Jt="https://roxyapi.com/api/v2",Ca=class{constructor(a){this.baseUrl=Jt;this.host=a,a.addController(this)}hostDisconnected(){this.abort?.abort(),this.abort=void 0}async run(a){if(!this.submitUrl&&this.secretKeyRefused())return;this.abort?.abort();let e=new AbortController;this.abort=e,this.host.loading=!0,this.host.error=null;try{let r=this.submitUrl?await fetch(this.submitUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a),signal:e.signal}):await this.callApi(a,e.signal);if(!r.ok)throw new Error(await this.readError(r));let t=await r.json();if(e.signal.aborted)return;this.host.data=t}catch(r){if(r?.name==="AbortError")return;this.host.error=r instanceof Error?r.message:String(r)}finally{this.abort===e&&(this.abort=void 0),e.signal.aborted||(this.host.loading=!1)}}callApi(a,e){let r=new URL(`${this.baseUrl}${a.path}`);for(let[s,o]of Object.entries(a.query??{}))o!=null&&r.searchParams.set(s,String(o));let t={Accept:"application/json"};return this.publishableKey&&(t["X-API-Key"]=this.publishableKey),a.body!=null&&(t["Content-Type"]="application/json"),fetch(r,{method:a.method??"GET",headers:t,body:a.body!=null?JSON.stringify(a.body):void 0,signal:e})}secretKeyRefused(){let a=this.publishableKey;return!a||a.startsWith("pk_")?!1:(this.host.error="Client-side components accept a pk_ publishable key only. Use a publishable key with an origin allowlist, or render server-side.",this.host.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key"},bubbles:!0,composed:!0})),!0)}async readError(a){try{let e=await a.json();if(e?.error)return e.error}catch{}return`Request failed (${a.status})`}};function xt(n,a,e){let r={...e},t=`/${n.replace(/^\//,"")}`.replace(/\{([^}]+)\}/g,(i,l)=>{let c=r[l];return delete r[l],encodeURIComponent(String(c??""))}),s={},o={};for(let[i,l]of Object.entries(r))l===void 0||l===""||(a==="GET"?s[i]=l:o[i]=l);return{path:t,method:a,query:s,body:a==="POST"?o:void 0}}var ht="roxy-data";function ft(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function Xt(n){return`<script type="application/json" class="${ht}">${ft(n)}<\/script>`}function Zt(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var Ta=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(Zt(a)&&a.classList.contains(ht))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var m=class extends Qt{constructor(){super();this.data=null;this.endpoint="";this.method="POST";this.remember=!1;this.loading=!1;this.error=null;this.onFormSubmit=e=>{let r=e.detail;this.remember&&this.writeRemembered(r.values),this.fetcher.run(xt(this.endpoint,this.method,r.values))};new Ta(this),this.fetcher=new Ca(this)}static{this.styles=[g]}willUpdate(e){e.has("publishableKey")&&(this.fetcher.publishableKey=this.publishableKey),e.has("baseUrl")&&this.baseUrl&&(this.fetcher.baseUrl=this.baseUrl),e.has("submitUrl")&&(this.fetcher.submitUrl=this.submitUrl)}render(){return this.loading?this.renderLoading():this.error!=null?this.renderError(this.error):this.data!=null?this.renderData(this.data):this.renderNoData()}renderNoData(){return this.endpoint?this.renderForm():this.renderEmpty()}renderForm(){return la`<roxy-endpoint-form data-endpoint="${this.endpoint}" method="${this.method}" spec-url="${es(this.specUrl)}" .initialValues="${this.remember?this.readRemembered():void 0}" @roxy-submit="${this.onFormSubmit}"></roxy-endpoint-form>`}rememberKey(){return`roxy-ui:form:${this.endpoint}`}readRemembered(){try{let e=sessionStorage.getItem(this.rememberKey());return e?JSON.parse(e):void 0}catch{return}}writeRemembered(e){try{sessionStorage.setItem(this.rememberKey(),JSON.stringify(e))}catch{}}renderEmpty(){return la`<div class="roxy-empty" role="status">No data</div>`}renderLoading(){return la`<div class="roxy-skeleton" style="height:8rem" role="status" aria-label="Loading"></div>`}renderError(e){let r=la`<div class="roxy-error" role="alert">${e}</div>`;return this.endpoint?la`${r}${this.renderForm()}`:r}};d([Ie({attribute:!1})],m.prototype,"data",2),d([Ie({type:String,attribute:"data-endpoint"})],m.prototype,"endpoint",2),d([Ie({type:String})],m.prototype,"method",2),d([Ie({type:String,attribute:"publishable-key"})],m.prototype,"publishableKey",2),d([Ie({type:String,attribute:"base-url"})],m.prototype,"baseUrl",2),d([Ie({type:String,attribute:"spec-url"})],m.prototype,"specUrl",2),d([Ie({type:String,attribute:"submit-url"})],m.prototype,"submitUrl",2),d([Ie({type:Boolean})],m.prototype,"remember",2),d([bt()],m.prototype,"loading",2),d([bt()],m.prototype,"error",2);var Rr=class extends m{renderData(a){let e=(a.energy??"").toLowerCase(),r=e==="positive"||e==="cautionary"||e==="neutral"?e:"",t=a.keywords??[],s=a.actionSteps??[];return W`<article class="card" aria-label="${`Angel number ${a.number??""}`}"><div class="hero">${a.number?W`<div class="numeral">${a.number}</div>`:Re}<div><p class="label">Angel number</p>${a.title?W`<h2 class="title">${a.title}</h2>`:Re}</div></div>${a.coreMessage?W`<p class="core">${a.coreMessage}</p>`:Re}<div class="badges">${a.type?W`<span class="badge">${a.type}</span>`:Re} ${typeof a.digitRoot=="number"?W`<span class="badge">Digit root ${a.digitRoot}</span>`:Re} ${a.energy?W`<span class="${`badge ${r}`}">${a.energy}</span>`:Re}</div>${t.length>0?W`<div class="chips">${t.map(o=>W`<span>${o}</span>`)}</div>`:Re} ${this.renderSections(a)} ${a.affirmation?W`<p class="affirmation">${a.affirmation}</p>`:Re} ${s.length>0?W`<div class="steps"><h3>Action steps</h3><ul>${s.map(o=>W`<li>${o}</li>`)}</ul></div>`:Re}</article>`}renderEmpty(){return W`<div class="roxy-empty" role="status">No angel number</div>`}renderSections(a){let e=Ra(a.meaning,a.biblical,a.shadow);return e.length===0?Re:W`<div class="sections">${e.map((r,t)=>W`<details name="angel-meaning" ?open="${t===0}"><summary>${r.label}</summary><p>${r.body}</p></details>`)}</div>`}};Rr.styles=[g,rs`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.core{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;padding:3px 10px;display:inline-flex}.badge.positive{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.cautionary{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.badge.neutral{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.sections{gap:var(--roxy-space-xs,.25rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);display:grid}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.affirmation{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);border-left:3px solid var(--roxy-accent,#f59e0b);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-sm,4px);color:var(--roxy-fg,#0a0a0a);margin:0;font-style:italic}.steps h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.steps ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);gap:2px;margin:0;display:grid}`],Rr=d([as("roxy-angel-number-card")],Rr);import{css as ts,html as E,nothing as B}from"lit";import{customElement as ss}from"lit/decorators.js";var Cr=class extends m{renderEmpty(){return E`<div class="roxy-empty" role="status">No number analysis</div>`}renderData(a){let e=a.knownMeaning,r=a.digitRootMeaning,t=e?.title??"Number analysis";return E`<article class="card" aria-label="${`Number ${a.number??""}`}"><div class="hero">${a.number?E`<div class="numeral">${a.number}</div>`:B}<div><p class="label">Number analysis</p><h2 class="title">${t}</h2></div></div><div class="badges">${a.type?E`<span class="badge">${a.type}</span>`:B} ${typeof a.digits=="number"?E`<span class="badge">${a.digits} digits</span>`:B} ${typeof a.uniqueDigits=="number"?E`<span class="badge">${a.uniqueDigits} unique</span>`:B} ${typeof a.digitRoot=="number"?E`<span class="badge">Digit root ${a.digitRoot}</span>`:B} ${a.isPalindrome?E`<span class="badge flag">Palindrome</span>`:B} ${a.isRepeating?E`<span class="badge flag">Repeating</span>`:B}</div>${e?E`<div class="section"><p class="label">Known angel number</p>${e.coreMessage?E`<p>${e.coreMessage}</p>`:B} ${e.keywords&&e.keywords.length>0?E`<div class="chips">${e.keywords.map(s=>E`<span>${s}</span>`)}</div>`:B} ${this.renderMeaning(e.meaning,e.biblical,e.shadow)} ${e.affirmation?E`<p><em>${e.affirmation}</em></p>`:B}</div>`:B} ${r?E`<div class="section"><p class="label">Foundational digit root${r.number?` (${r.number})`:""}</p>${r.title?E`<h3>${r.title}</h3>`:B} ${r.coreMessage?E`<p>${r.coreMessage}</p>`:B} ${e?B:this.renderRootMeaning(r)}</div>`:B}</article>`}renderMeaning(a,e,r){let t=Ra(a,e,r);return t.length===0?B:E`${t.map((s,o)=>E`<details name="lookup-meaning" ?open="${o===0}"><summary>${s.label}</summary><p>${s.body}</p></details>`)}`}renderRootMeaning(a){return E`${a.keywords&&a.keywords.length>0?E`<div class="chips">${a.keywords.map(e=>E`<span>${e}</span>`)}</div>`:B}${this.renderMeaning(a.meaning)}${a.affirmation?E`<p><em>${a.affirmation}</em></p>`:B}`}};Cr.styles=[g,ts`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;align-items:center;padding:3px 10px;display:inline-flex}.badge.flag{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.section>.label{margin:0}.section h3{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.section p{color:var(--roxy-fg,#0a0a0a);line-height:1.6;font-size:var(--roxy-text-sm,.875rem);margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem)}`],Cr=d([ss("roxy-angel-number-lookup")],Cr);import{css as os,html as X,nothing as ns}from"lit";import{customElement as is,state as ls}from"lit/decorators.js";var v={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},vt={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"},J={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Ea={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},I=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],el=I.map(n=>n.toLowerCase()),da={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},qa={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"},$t={"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 ds={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},Ze=["sarva","bhinna","pinda"],Qe=class extends m{constructor(){super(...arguments);this.activeTab="sarva"}renderEmpty(){return X`<div class="roxy-empty" role="status">No ashtakavarga data</div>`}renderData(e){let r=e.signs??[];return X`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${r.length?X`<p class="subtitle">${r.length} signs</p>`:ns}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${Ze.map(t=>X`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${ds[t]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(r):this.activeTab==="bhinna"?this.renderBhinna(r):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=Ze.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=Ze[(r+1)%Ze.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=Ze[(r-1+Ze.length)%Ze.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?X`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,s)=>{let o=r.bindus[s]??0,i=this.sarvaHeat(o);return X`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${J[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${o}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:X`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?X`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>X`<th scope="col" title="${t}">${J[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>X`<tr><td>${t.planet}</td>${t.bindus.map(s=>{let o=this.bhinnaHeat(s);return X`<td class="${`heat-cell ${o}`}">${s}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:X`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?X`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>X`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:X`<p class="roxy-empty">No shodhya pinda data</p>`}};Qe.styles=[g,os`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([ls()],Qe.prototype,"activeTab",2),Qe=d([is("roxy-ashtakavarga-grid")],Qe);import{css as ms,html as C,nothing as F}from"lit";import{customElement as gs}from"lit/decorators.js";import{css as cs,html as ps}from"lit";function ce(){return ps`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var Ke=cs`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;function Ce(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,r=new Date(e);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function pe(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Va(n){if(!n)return"";let a=Ce(n.start),e=Ce(n.end);return a&&e?`${a} - ${e}`:a||e||""}function h(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function wt(n,a=1){let e=h(n,a);return e?`${e}%`:""}var er={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function Tr(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}function x(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function D(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var Er=class extends m{renderEmpty(){return C`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e="aspects"in a?a.aspects??[]:[],r="patterns"in a?a.patterns??[]:[],t="summary"in a?a.summary:void 0;return e.length===0&&r.length===0?this.renderEmpty():C`<div class="wrap" aria-label="Aspects"><div class="head"><h2 class="title">Aspects</h2>${e.length>0?C`<p class="subtitle">${e.length} aspects</p>`:F}</div>${t?this.renderSummary(t):F} ${e.length>0?C`<div role="list" aria-label="Aspect list">${e.map((s,o)=>this.renderAspect(s,o))}</div>`:F} ${r.length>0?C`<div><p class="section-label">Patterns</p>${r.map(s=>this.renderPattern(s))}</div>`:F}</div>`}renderSummary(a){let e="totalAspects"in a?a.totalAspects:a.total;return C`<div class="summary-pills" role="region" aria-label="Aspect summary">${typeof e=="number"?C`<span class="pill pill--muted">Total: ${e}</span>`:F} <span class="pill pill--success">Harmonious: ${a.harmonious}</span> <span class="pill pill--danger">Challenging: ${a.challenging}</span> <span class="pill pill--muted">Neutral: ${a.neutral}</span></div>`}renderAspect(a,e){let r=v[x(a.planet1)]??"",t=v[x(a.planet2)]??"",s=(a.interpretation??"neutral").toLowerCase(),o=(a.type??"").toLowerCase().replace(/_/g," "),i=a.isApplying?"Applying":"Separating",l="meaning"in a?a.meaning:void 0,c="transitInterpretation"in a?a.transitInterpretation:void 0,p=!!(l||c),y=C`<span aria-hidden="true" class="glyph">${r}</span>${a.planet1} <span class="nature-badge ${s}">${o}</span> <span aria-hidden="true" class="glyph">${t}</span>${a.planet2} <span class="meta">${i} · orb ${h(a.orb,2)}° · str ${h(a.strength,0)}</span>`;return p?C`<details class="aspect-card" role="listitem" name="aspects" ?open="${e===0}"><summary>${y}${ce()}</summary><div class="interp-body">${l?this.renderMeaning(l):F} ${c?this.renderTransit(c):F}</div></details>`:C`<div class="aspect-card" role="listitem"><div class="summary" style="cursor:default">${y}</div></div>`}renderMeaning(a){let e=a.description?.short??a.description?.long;return C`${e?C`<p>${e}</p>`:F} ${a.keywords?.length?C`<div class="interp-keywords">${a.keywords.map(r=>C`<span class="kw">${r}</span>`)}</div>`:F}`}renderTransit(a){return C`${a.summary?C`<p>${a.summary}</p>`:F} ${a.impact?C`<p><strong>Impact:</strong> ${a.impact}</p>`:F} ${a.timing?C`<p><strong>Timing:</strong> ${a.timing}</p>`:F} ${a.guidance?C`<p><strong>Guidance:</strong> ${a.guidance}</p>`:F} ${a.keywords?.length?C`<div class="interp-keywords">${a.keywords.map(e=>C`<span class="kw">${e}</span>`)}</div>`:F}`}renderPattern(a){let e=a.planets??[];return C`<div class="pattern"><div class="pattern-head"><span class="pattern-name">${a.name??a.kind??"Pattern"}</span> ${e.length?C`<span class="pattern-planets">${e.join(", ")}</span>`:F} ${typeof a.tightness=="number"?C`<span class="pattern-tight">${h(a.tightness,0)}% tight</span>`:F}</div>${a.interpretation?C`<p class="pattern-interp">${a.interpretation}</p>`:F}</div>`}};Er.styles=[g,Ke,ms`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.glyph{font-size:1.1em;line-height:1}.nature-badge{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.pattern{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem);gap:.35rem;display:grid}.pattern-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.pattern-name{font-weight:var(--roxy-weight-bold,600)}.pattern-planets{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}.pattern-tight{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.pattern-interp{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0;line-height:1.45}`],Er=d([gs("roxy-aspects-table")],Er);import{css as ys,html as be,nothing as Da,svg as us}from"lit";import{customElement as xs,property as hs}from"lit/decorators.js";var kt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},rr=class extends m{constructor(){super(...arguments);this.mode="daily"}renderEmpty(){return be`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderData(e){return this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e)}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([s,o])=>{let i=typeof o=="number"?o:0,l=Math.abs(i)>1?i/100:i;return[s,l]});return be`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?be`<span class="energy">Energy ${e.energyRating}/10</span>`:Da}</header><div class="bars" role="list">${t.map(([s,o])=>{let i=(o+1)/2*100,l=kt[s]??"var(--roxy-accent, #f59e0b)";return be`<div class="bar" role="listitem"><span style="text-transform:capitalize">${s}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(o*100)}%</span></div>`})}</div>${e.dailyMessage?be`<p class="advice">${e.dailyMessage}</p>`:Da} ${e.advice?be`<p class="advice">${e.advice}</p>`:Da}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return be`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,s=160,o=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return be`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${s}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${s/2}" x2="${t}" y2="${s/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((y,u)=>{let k=y[l]??0,f=u*o,Xe=s/2-k/100*(s/2-8);return`${f.toFixed(2)},${Xe.toFixed(2)}`}).join(" "),p=kt[l]??"#475569";return us`<polyline points=${c} fill="none" stroke=${p} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?be`<p class="advice">${e.summary.periodAdvice}</p>`:Da}</section>`}renderCritical(e){return be`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>be`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};rr.styles=[g,ys`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,600px);height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([hs({type:String,reflect:!0})],rr.prototype,"mode",2),rr=d([xs("roxy-biorhythm-chart")],rr);import{css as Ns,html as ve,nothing as _e}from"lit";import{customElement as Ls}from"lit/decorators.js";import{nothing as fs,svg as Le}from"lit";var Aa=4,Na=9,Rt=(100+2*Na)*Aa,bs=(100+2*Na)*Aa;function ie(n,a){return{x:(n+Na)*Aa,y:(a+Na)*Aa}}var ca=50,Ja=n=>2*ca-n,Ya={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},vs={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function $s(){let n={},a={};for(let[e,[r,t]]of Object.entries(Ya.spleen))Ya["solar-plexus"][vs[Number(e)]]=[Ja(r),t];for(let[e,r]of Object.entries(Ya))for(let[t,[s,o]]of Object.entries(r))n[Number(t)]=ie(s,o),a[Number(t)]=e;return{points:n,centerOf:a}}var{points:Wa,centerOf:Pl}=$s(),zl=Rt/2;function ar(n){return n.map(([a,e])=>ie(a,e))}function Ua(n,a,e){return ar([[ca-n,a],[ca+n,a],[ca+n,e],[ca-n,e]])}var St=[[18.4,68],[18.4,81.8],[34.7,74.9]],ws=[{id:"head",label:"Head",color:"gold",points:ar([[40,14.3],[60,14.3],[50,6]]),labelAnchor:ie(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:ar([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:ie(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Ua(9.5,30.4,43.6),labelAnchor:ie(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:ar([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:ie(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:ar([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:ie(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:ar(St),labelAnchor:ie(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Ua(9.5,70.6,83.6),labelAnchor:ie(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:ar(St.map(([n,a])=>[Ja(n),a])),labelAnchor:ie(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Ua(9.5,87.9,99.9),labelAnchor:ie(50,103),labelAlign:"middle"}],ks=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],Ss=Rs();function Rs(){let n=Ja,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${Pa(a[0])}`];for(let r=1;r+2<a.length;r+=3)e.push(`C ${Pa(a[r])} ${Pa(a[r+1])} ${Pa(a[r+2])}`);e.push(`L ${za(a[a.length-1],n)}`);for(let r=a.length-3;r>=1;r-=3)e.push(`C ${za(a[r+1],n)} ${za(a[r],n)} ${za(a[r-1],n)}`);return e.push("Z"),e.join(" ")}function Pa([n,a]){let e=ie(n,a);return`${e.x} ${e.y}`}function za([n,a],e){let r=ie(e(n),a);return`${r.x} ${r.y}`}function Cs(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function Ct(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function Ts(){return Le`<path class="bg-body" d=${Ss} />`}function Es(n,a){let e=[];for(let[r,t]of ks){let s=Wa[r],o=Wa[t];if(!s||!o)continue;if(e.push(Le`<line class="bg-channel" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`),n.has(Ct(r,t))){e.push(Le`<line class="bg-channel on" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`);continue}let i={x:(s.x+o.x)/2,y:(s.y+o.y)/2};a.has(r)&&e.push(Le`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`),a.has(t)&&e.push(Le`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`)}return e}function Ds(n,a,e){let r=e.x-a.x,t=e.y-a.y,s=r*r+t*t;if(s===0)return a;let o=Math.max(0,Math.min(1,((n.x-a.x)*r+(n.y-a.y)*t)/s));return{x:a.x+o*r,y:a.y+o*t}}function Ps(n,a){let e=a[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<a.length;t++){let s=Ds(n,a[t],a[(t+1)%a.length]),o=(s.x-n.x)**2+(s.y-n.y)**2;o<r&&(r=o,e=s)}return e}function zs(n){return ws.map(a=>{let e=n.has(a.id),r=`bg-center bg-${a.color}${e?" defined":""}`,t=Ps(a.labelAnchor,a.points);return Le`<g>
2
+ <line class="bg-leader" x1=${a.labelAnchor.x} y1=${a.labelAnchor.y} x2=${t.x} y2=${t.y} />
3
+ <polygon class=${r} points=${Cs(a.points)}><title>${a.label}: ${e?"defined":"open"}</title></polygon>
4
+ <text class="bg-center-label" x=${a.labelAnchor.x} y=${a.labelAnchor.y} text-anchor=${a.labelAlign} dominant-baseline="central">${a.label}</text>
5
+ </g>`})}function As(n,a){let e=[];for(let[r,t]of Object.entries(Wa)){let s=Number(r);if(!n.has(s))continue;let o=a.get(s);e.push(Le`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${s}${o?Le`<title>${o}</title>`:fs}</text>`)}return e}function Tt(n,a){return Ct(n,a)}var Et=`0 0 ${Rt} ${bs}`;function Dt(n){return Le`
6
+ ${Ts()}
7
+ ${Es(n.activeChannels,n.activeGates)}
8
+ ${zs(n.definedCenters)}
9
+ ${As(n.activeGates,n.gateTitles)}
10
+ `}var Dr=class extends m{renderEmpty(){return ve`<div class="roxy-empty" role="status">No bodygraph data</div>`}renderData(a){let e=new Set((a.centers??[]).filter(o=>o.defined).map(o=>o.id)),r=new Set((a.gates??[]).map(o=>o.gate).filter(o=>o!=null)),t=new Set((a.channels??[]).map(o=>Tt(o.gateA,o.gateB))),s=this.buildGateTitles(a.gates??[]);return ve`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${a.type?ve`<div class="type-line">${a.type}${a.profile?ve`· Profile ${a.profile}`:_e}</div>`:_e}</header><div class="layout"><svg viewBox="${Et}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Dt({definedCenters:e,activeChannels:t,activeGates:r,gateTitles:s})}</svg> ${this.renderSummary(a)}</div></div>`}buildGateTitles(a){let e=new Map;for(let r of a){if(r.gate==null)continue;let t=[`Gate ${r.gate}`];r.line!=null&&(t[0]+=`.${r.line}`),r.gateName&&t.push(r.gateName);let s=r.planet?x(r.planet):"",o=s?v[s]??s:"";o&&t.push(`${o} ${r.side??""}`.trim()),e.set(r.gate,t.join(" \xB7 "))}return e}renderSummary(a){let e=[{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile},{label:"Definition",value:a.definition}],r=a.incarnationCross;return ve`<div class="summary"><div class="facts">${e.map(t=>t.value?ve`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:_e)}</div>${r?.name?ve`<p class="cross">${r.name} ${r.gates?.length?ve`<span class="gates">(${r.gates.join(", ")})</span>`:_e}</p>`:_e} ${a.signature||a.notSelf?ve`<div class="themes">${a.signature?ve`<span class="pill pill--good">Signature: ${a.signature}</span>`:_e} ${a.notSelf?ve`<span class="pill pill--shadow">Not-self: ${a.notSelf}</span>`:_e}</div>`:_e}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};Dr.styles=[g,Ns`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:var(--roxy-chart-max-width,340px);height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],Dr=d([Ls("roxy-bodygraph")],Dr);import{css as Ms,html as Fe,nothing as Xa}from"lit";import{customElement as Gs}from"lit/decorators.js";function Pt(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var Pr=class extends m{isCurrent(a){let e=Date.now(),r=Date.parse(a.start),t=Date.parse(a.end);return Number.isNaN(r)||Number.isNaN(t)?!1:e>=r&&e<t}renderTile(a){let e=a.effect==="Good"?"good":a.effect==="Bad"?"bad":"neutral",r=this.isCurrent(a),t=v[x(a.lord)]??"",s=`${Pt(a.start)} - ${Pt(a.end)}`;return Fe`<div class="cho-tile ${e}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${a.name}${r?Fe`<span class="now-badge">Now</span>`:Xa} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?Fe`<span aria-hidden="true">${t}</span>`:Xa} ${a.lord}</span></div>`}renderEmpty(){return Fe`<div class="roxy-empty" role="status">No choghadiya data</div>`}renderData(a){let{date:e,dayChoghadiya:r,nightChoghadiya:t}=a;return Fe`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?Fe`<p class="subtitle">${e}</p>`:Xa}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(s=>this.renderTile(s)):Fe`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(s=>this.renderTile(s)):Fe`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Pr.styles=[g,Ms`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],Pr=d([Gs("roxy-choghadiya-grid")],Pr);import{css as Hs,html as K,nothing as me}from"lit";import{customElement as Os,property as js}from"lit/decorators.js";var tr=class extends m{constructor(){super(...arguments);this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,s]of Object.entries(e.categories))typeof s=="number"&&Number.isFinite(s)&&(r[t]=s);return r}return{}}renderEmpty(){return K`<div class="roxy-empty" role="status">No compatibility data</div>`}renderData(e){let r=e.overallScore,t=this.getBreakdown(),s="rating"in e?e.rating:void 0,o="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,p="strengths"in e?e.strengths:void 0,y="challenges"in e?e.challenges:void 0,u="keyAspects"in e?e.keyAspects:void 0;return K`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?K`<div class="score">${h(r,0)}</div>`:me} ${s?K`<div class="rating">${s}</div>`:me}</div></div>${Object.keys(t).length>0?K`<div role="list">${Object.entries(t).map(([k,f])=>K`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${k}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,f))}%"></span></span> <span>${h(f,0)}</span></div>`)}</div>`:me} ${o?K`<p><span class="archetype">${o.label}</span> ${o.description?K`· ${o.description}`:me}</p>`:me} ${l?K`<p>${l}</p>`:me} ${c&&!l?K`<p>${c}</p>`:me} ${i?K`<p>${i}</p>`:me} ${(p?.length??0)>0||(y?.length??0)>0?K`<div class="lists">${p?.length?K`<div><h3>Strengths</h3><ul>${p.map(k=>K`<li>${k}</li>`)}</ul></div>`:me} ${y?.length?K`<div><h3>Challenges</h3><ul>${y.map(k=>K`<li>${k}</li>`)}</ul></div>`:me}</div>`:me} ${u?.length?K`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${u.slice(0,6).map(k=>K`<li>${Bs(k)}</li>`)}</ul></div>`:me}</article>`}};tr.styles=[g,Hs`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([js({type:String,reflect:!0})],tr.prototype,"mode",2),tr=d([Os("roxy-compatibility-card")],tr);function Bs(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${h(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}import{css as Is,html as Z,nothing as Te}from"lit";import{customElement as Ks}from"lit/decorators.js";var _s=["January","February","March","April","May","June","July","August","September","October","November","December"],zr=class extends m{renderEmpty(){return Z`<div class="roxy-empty" role="status">No crystal data</div>`}renderData(a){let e=a.colors??[],r=a.keywords??[],t=a.pairsWith??[],s=typeof a.birthMonth=="number"?_s[a.birthMonth-1]:void 0;return Z`<article class="wrap" aria-label="${a.name??"Crystal"}"><div class="hero">${a.imageUrl?Z`<img class="photo" src="${a.imageUrl}" alt="${a.name??"Crystal"}" loading="lazy">`:Te}<div><h2 class="title">${a.name}</h2>${a.description?Z`<p class="desc">${a.description}</p>`:Te}</div></div><dl class="attrs">${this.attr("Planet",a.planet)} ${this.attr("Hardness",typeof a.hardness=="number"?`${a.hardness} Mohs`:void 0)} ${this.attr("Vibration",a.numericalVibration)} ${this.attr("Birthstone",s)} ${this.list("Chakras",a.chakras)} ${this.list("Zodiac",a.zodiacSigns)} ${this.list("Elements",a.elements)} ${e.length?Z`<div class="attr"><dt>Colors</dt><dd><div class="colors">${e.map(o=>Z`<span class="color"><span class="dot" style="background:${o}"></span>${o}</span>`)}</div></dd></div>`:Te}</dl>${this.renderMeaning(a.meaning)} ${r.length?Z`<div><p class="section-label">Keywords</p><div class="chips">${r.map(o=>Z`<span class="chip">${o}</span>`)}</div></div>`:Te} ${a.affirmation?Z`<p class="affirmation">${a.affirmation}</p>`:Te} ${t.length?Z`<div><p class="section-label">Pairs with</p><div class="chips">${t.map(o=>Z`<span class="chip">${String(o).replace(/-/g," ")}</span>`)}</div></div>`:Te}</article>`}attr(a,e){return e==null||e===""?Te:Z`<div class="attr"><dt>${a}</dt><dd>${e}</dd></div>`}list(a,e){return e?.length?Z`<div class="attr"><dt>${a}</dt><dd>${e.join(", ")}</dd></div>`:Te}renderMeaning(a){if(!a)return Te;let r=[["Spiritual",a.spiritual],["Emotional",a.emotional],["Physical",a.physical]].filter(([,t])=>!!t);return r.length===0?Te:Z`<div class="meaning">${r.map(([t,s])=>Z`<h3>${t}</h3><p>${s}</p>`)}</div>`}};zr.styles=[g,Is`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{gap:var(--roxy-space-md,1rem);align-items:flex-start;display:flex}.photo{border-radius:var(--roxy-radius-md,8px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);flex:none;width:96px;height:96px}.title{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600)}.desc{line-height:1.55;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.attrs{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));display:grid}.attr{gap:2px;display:grid}.attr dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.attr dd{font-size:var(--roxy-text-sm,.875rem);margin:0;font-weight:500}.colors{flex-wrap:wrap;gap:.4rem;display:flex}.color{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;align-items:center;gap:.3rem;display:inline-flex}.dot{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:.7rem;height:.7rem}.meaning h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.meaning p{margin:0 0 var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);line-height:1.55}.chips{flex-wrap:wrap;gap:.3rem;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:1px 8px}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.affirmation{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-left:3px solid var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);font-style:italic;font-size:var(--roxy-text-sm,.875rem);border-radius:0 var(--roxy-radius-sm,4px) var(--roxy-radius-sm,4px) 0;margin:0}`],zr=d([Ks("roxy-crystal-card")],zr);import{css as Fs,html as sr,nothing as qs}from"lit";import{customElement as Vs,property as Ys}from"lit/decorators.js";var Us=["January","February","March","April","May","June","July","August","September","October","November","December"],or=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return sr`<div class="roxy-empty" role="status">No crystals</div>`}renderData(e){let r=e.crystals??[];if(r.length===0)return this.renderEmpty();let t=this.heading||this.deriveHeading(e),s="total"in e&&typeof e.total=="number"?e.total:r.length;return sr`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(o=>sr`<li class="tile">${o.imageUrl?sr`<img class="photo" src="${o.imageUrl}" alt="${o.name??"Crystal"}" loading="lazy">`:sr`<div class="photo" aria-hidden="true"></div>`}<p class="name">${o.name}</p>${o.colors&&o.colors.length>0?sr`<div class="colors" aria-label="${`Colours: ${o.colors.join(", ")}`}">${o.colors.map(i=>sr`<span class="swatch" style="${`background:${Ws(i)}`}" title="${i}"></span>`)}</div>`:qs}</li>`)}</ul></section>`}deriveHeading(e){return"chakra"in e&&e.chakra?`${e.chakra} chakra crystals`:"element"in e&&e.element?`${e.element} element crystals`:"sign"in e&&e.sign?`Crystals for ${e.sign}`:"month"in e&&typeof e.month=="number"?`${Us[e.month-1]??""} birthstones`.trim():"Crystals"}};or.styles=[g,Fs`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.photo{aspect-ratio:1;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.colors{flex-wrap:wrap;gap:4px;display:flex}.swatch{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:10px;height:10px}`],d([Ys({type:String,reflect:!0})],or.prototype,"heading",2),or=d([Vs("roxy-crystal-grid")],or);function Ws(n){return n.trim().toLowerCase().replace(/\s+/g,"")}import{css as Js,html as M,nothing as Q}from"lit";import{customElement as Xs,property as Zs}from"lit/decorators.js";var nr=class extends m{constructor(){super(...arguments);this.period="current"}renderEmpty(){return M`<div class="roxy-empty" role="status">No dasha data</div>`}renderData(e){let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(s=>s.durationYears)):0;return M`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?M`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?M`(lord ${e.nakshatraLord})`:Q}</div>`:Q}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):Q} ${r.length>0?M`<div class="timeline" role="list">${r.map(s=>this.renderBar(s,t))}</div>`:Q} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return Q;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",s=r.years??0,o=r.months??0,i=r.days??0,l=[];s&&l.push(`${s}y`),o&&l.push(`${o}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return M`<p class="balance">Birth dasha balance: ${c} of ${t?M`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?M`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:Q}renderCurrent(e){return"mahadasha"in e?M`<div class="current">${"mahadasha"in e&&e.mahadasha?M`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?M`<small>${h(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:Q}</div>`:Q} ${"antardasha"in e&&e.antardasha?M`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?M`<small>${h(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:Q}</div>`:Q} ${"pratyantardasha"in e&&e.pratyantardasha?M`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?M`<small>${h(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:Q}</div>`:Q}</div>`:Q}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),s=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(s)?!1:r>=t&&r<s}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),s=Date.now();return Number.isNaN(r)||Number.isNaN(t)||s<r||s>=t||t<=r?-1:(s-r)/(t-r)}renderBar(e,r){let t=e.durationYears,s=r>0?t/r*100:0,o=this.isCurrent(e),i=o?this.progressIn(e):-1,l=o?"bar-track bar-now":"bar-track";return M`<div class="${o?"bar now":"bar"}" role="listitem" aria-current="${o?"time":"false"}"><span><strong>${e.planet}</strong>${o?M`<span class="now-badge">Now</span>`:Q} </span><span class="${l}"><span class="bar-fill" style="width:${s}%"></span> ${i>=0?M`<span class="bar-progress" style="left:${i*s}%" aria-hidden="true"></span>`:Q} </span><span class="dates">${e.startDate?zt(e.startDate):""} ${e.endDate?M`- ${zt(e.endDate)}`:""}</span></div>`}};nr.styles=[g,Js`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([Zs({type:String,reflect:!0})],nr.prototype,"period",2),nr=d([Xs("roxy-dasha-timeline")],nr);function zt(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}import{css as Qs,html as z,nothing as pa}from"lit";import{customElement as eo,property as ro}from"lit/decorators.js";var ao=["title","name","label","heading","overview","summary"],to=["imageUrl","image","icon","symbol"],so=["imageUrl","image"],oo=6,ir=class extends m{constructor(){super(...arguments);this.depth=0}renderData(e){return this.depth>=oo?z`<div class="roxy-empty" role="status">…</div>`:z`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(e)}</div>`}renderValue(e){return e==null?pa:typeof e=="string"?z`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?z`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?z`<div class="roxy-empty" role="status">Empty list</div>`:e.every(s=>s===null||["string","number","boolean"].includes(typeof s))?z`<ul class="roxy-chips">${e.map(s=>z`<li>${String(s)}</li>`)}</ul>`:e.every(s=>s!==null&&typeof s=="object"&&!Array.isArray(s))?this.renderTable(e):z`<ol>${e.map(s=>z`<li>${this.renderValue(s)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return z`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>z`<th>${D(t)}</th>`)}</tr></thead><tbody>${e.map(t=>z`<tr>${r.map(s=>z`<td>${this.formatPrimitive(t[s])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=ao.find(i=>typeof e[i]=="string"),t=to.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),s=r!=="summary"&&typeof e.summary=="string"?"summary":null,o=Object.entries(e).filter(([i,l])=>i!==r&&i!==s&&!so.includes(i)&&l!==null&&l!==void 0);return z`${t?z`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:pa} ${r?z`<h3 class="roxy-title">${e[r]}</h3>`:pa} ${s?z`<p class="roxy-summary">${e[s]}</p>`:pa} ${o.length>0?z`<dl class="roxy-rows">${o.map(([i,l])=>z`<dt>${D(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:pa}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?z`<ul class="roxy-chips">${e.map(t=>z`<li>${String(t)}</li>`)}</ul>`:z`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let s of Object.keys(t))r.add(s);return Array.from(r)}};ir.styles=[g,Qs`.roxy-card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([ro({attribute:!1})],ir.prototype,"depth",2),ir=d([eo("roxy-data")],ir);import{css as Do,html as Nr,nothing as et}from"lit";import{customElement as Po,property as zo}from"lit/decorators.js";import{nothing as le,svg as A}from"lit";function Ee(n){let a=n%360;return a<0?a+360:a}function De(n){let a=Ee(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),s=(r-t)*60,o=Math.floor(s),i=Math.round((s-o)*60);return{sign:I[e]??"Aries",signIndex:e,degree:t,minute:o,second:i}}function La(n){let{sign:a,degree:e,minute:r}=De(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function Za(n){return Ee(n+180)}function At(n,a){let e=Ee(n),r=Ee(a)-e;return r<0&&(r+=360),Ee(e+r/2)}function S(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}import{css as no,html as Nt,nothing as io}from"lit";var qe=no`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function Ar(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:s,controls:o=!1}=n;return Nt`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=a.findIndex(k=>k.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,y=a[(c+p+a.length)%a.length];if(!y)return;r(y.id);let u=l.currentTarget.getRootNode();requestAnimationFrame(()=>{u.querySelector(`#${s}-tab-${y.id}`)?.focus()})}}">${a.map(l=>Nt`<button type="button" class="roxy-tab" role="tab" id="${s}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${o&&e===l.id?`${s}-panel-${l.id}`:io}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var $e=400,R=20,V=$e-2*R,P=$e/2,Lt=Object.fromEntries(I.map(n=>[n.toLowerCase(),n])),lo=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],co="\u02B3";function Mt(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:De(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function po(n,a){let e=vt[x(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?co:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||Mt(n,a))return`${e}${r}`;let{degree:t}=De(n.longitude);return`${e} ${t}\xB0${r}`}function mo(n,a){let e=[x(n.graha)],r=Mt(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=De(n.longitude),s=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${s}' ${t.sign}`:`${t.degree}\xB0${s}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Qa(n,a,e,r,t){let s=r-(n.length-1)*t/2;return n.map((o,i)=>{let l=s+i*t;return A`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${po(o,a)}<title>${mo(o,a)}</title></text>`})}function Ga(n,a,e){let r={};for(let o of I)r[o.toLowerCase()]=[];let t=e?Lt[e.toLowerCase()]??"":"",s=t;for(let[o,i]of Object.entries(n??{})){let l=(i?.rashi??"").toLowerCase();if(o==="Lagna"||i?.graha==="Lagna"){t||(s=Lt[l]??"");continue}!l||!(l in r)||r[l]?.push({graha:i.graha??o,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:s,placements:r,divisionLabel:a}}var lr=V/4,go={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function yo(n){let a=go[n]??{col:0,row:0};return{x:R+a.col*lr,y:R+a.row*lr,w:lr,h:lr}}function uo(n){let a=R,e=R+lr,r=R+2*lr,t=R+3*lr,s=$e-R;return A`
11
+ <rect class="line" x=${a} y=${a} width=${V} height=${V} stroke-width="1.5" fill="none" />
12
+ <line class="line" x1=${a} y1=${e} x2=${s} y2=${e} stroke-width="1" />
13
+ <line class="line" x1=${a} y1=${t} x2=${s} y2=${t} stroke-width="1" />
14
+ <line class="line" x1=${e} y1=${a} x2=${e} y2=${s} stroke-width="1" />
15
+ <line class="line" x1=${t} y1=${a} x2=${t} y2=${s} stroke-width="1" />
16
+ <line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
17
+ <line class="line" x1=${t} y1=${r} x2=${s} y2=${r} stroke-width="1" />
18
+ <line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
19
+ <line class="line" x1=${r} y1=${t} x2=${r} y2=${s} stroke-width="1" />
20
+ ${n?A`<text class="centre-label" x=${P} y=${P} text-anchor="middle" dominant-baseline="central">${n}</text>`:le}
21
+ `}function Gt(n,a){let e=I.findIndex(t=>t===a),r=I.findIndex(t=>t===n);return e===-1||r===-1?0:(r-e+12)%12+1}function xo(n,a,e,r){let t=yo(n),s=t.x+t.w/2,o=t.y+t.h/2,i=Ea[n]??n.slice(0,2),l=14;return A`
22
22
  <g class=${e?"cell lagna":"cell"}>
23
- ${e?R`
23
+ ${e?A`
24
24
  <rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
25
25
  <line class="lagna-slash" x1=${t.x+t.w-l} y1=${t.y+l} x2=${t.x+l} y2=${t.y+t.h-l} stroke-width="1.2" />
26
- `:ee}
26
+ `:le}
27
27
  <text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
28
- ${r>0?R`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:ee}
29
- ${e?R`<text class="lagna-marker" x=${a} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:ee}
30
- ${n.length?pt(n,o,a,s+4,14):ee}
28
+ ${r>0?A`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:le}
29
+ ${e?A`<text class="lagna-marker" x=${s} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:le}
30
+ ${a.length?Qa(a,n,s,o+4,14):le}
31
31
  </g>
32
- `}function us(o){let n=o.lagnaSign.toLowerCase();return R`
33
- ${gs(o.divisionLabel)}
34
- ${G.map(e=>ys(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,_t(e,o.lagnaSign)))}
35
- `}var w={tl:{x:S,y:S},tr:{x:pe-S,y:S},br:{x:pe-S,y:pe-S},bl:{x:S,y:pe-S},top:{x:T,y:S},right:{x:pe-S,y:T},bottom:{x:T,y:pe-S},left:{x:S,y:T},tlMid:{x:T-B/4,y:T-B/4},trMid:{x:T+B/4,y:T-B/4},brMid:{x:T+B/4,y:T+B/4},blMid:{x:T-B/4,y:T+B/4}};function ke(o){let n=o.reduce((r,t)=>r+t.x,0)/o.length,e=o.reduce((r,t)=>r+t.y,0)/o.length;return{x:n,y:e}}var hs={1:{x:T,y:w.tlMid.y},2:ke([w.tl,w.top,w.tlMid]),3:ke([w.tl,w.left,w.tlMid]),4:{x:w.tlMid.x,y:T},5:ke([w.bl,w.left,w.blMid]),6:ke([w.bl,w.bottom,w.blMid]),7:{x:T,y:w.blMid.y},8:ke([w.br,w.bottom,w.brMid]),9:ke([w.br,w.right,w.brMid]),10:{x:w.brMid.x,y:T},11:ke([w.tr,w.right,w.trMid]),12:ke([w.tr,w.top,w.trMid])};function xs(o,n){let e=G.findIndex(r=>r===n);return e===-1?o:(e+o-1)%12+1}function fs(o){let{tl:n,tr:e,br:r,bl:t,top:a,right:s,bottom:i,left:l}=w;return R`
36
- <rect class="line" x=${n.x} y=${n.y} width=${B} height=${B} stroke-width="1.5" fill="none" />
37
- <polygon class="line" points="${a.x},${a.y} ${s.x},${s.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
38
- <line class="line" x1=${n.x} y1=${n.y} x2=${r.x} y2=${r.y} stroke-width="1" />
32
+ `}function ho(n){let a=n.lagnaSign.toLowerCase();return A`
33
+ ${uo(n.divisionLabel)}
34
+ ${I.map(e=>xo(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,Gt(e,n.lagnaSign)))}
35
+ `}var w={tl:{x:R,y:R},tr:{x:$e-R,y:R},br:{x:$e-R,y:$e-R},bl:{x:R,y:$e-R},top:{x:P,y:R},right:{x:$e-R,y:P},bottom:{x:P,y:$e-R},left:{x:R,y:P},tlMid:{x:P-V/4,y:P-V/4},trMid:{x:P+V/4,y:P-V/4},brMid:{x:P+V/4,y:P+V/4},blMid:{x:P-V/4,y:P+V/4}};function Me(n){let a=n.reduce((r,t)=>r+t.x,0)/n.length,e=n.reduce((r,t)=>r+t.y,0)/n.length;return{x:a,y:e}}var fo={1:{x:P,y:w.tlMid.y},2:Me([w.tl,w.top,w.tlMid]),3:Me([w.tl,w.left,w.tlMid]),4:{x:w.tlMid.x,y:P},5:Me([w.bl,w.left,w.blMid]),6:Me([w.bl,w.bottom,w.blMid]),7:{x:P,y:w.blMid.y},8:Me([w.br,w.bottom,w.brMid]),9:Me([w.br,w.right,w.brMid]),10:{x:w.brMid.x,y:P},11:Me([w.tr,w.right,w.trMid]),12:Me([w.tr,w.top,w.trMid])};function bo(n,a){let e=I.findIndex(r=>r===a);return e===-1?n:(e+n-1)%12+1}function vo(n){let{tl:a,tr:e,br:r,bl:t,top:s,right:o,bottom:i,left:l}=w;return A`
36
+ <rect class="line" x=${a.x} y=${a.y} width=${V} height=${V} stroke-width="1.5" fill="none" />
37
+ <polygon class="line" points="${s.x},${s.y} ${o.x},${o.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
38
+ <line class="line" x1=${a.x} y1=${a.y} x2=${r.x} y2=${r.y} stroke-width="1" />
39
39
  <line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
40
- ${o?R`<text class="centre-label" x=${T} y=${T} text-anchor="middle" dominant-baseline="central">${o}</text>`:ee}
41
- `}function bs(o,n,e,r,t){let a=hs[o];if(!a)return R``;let s=Math.min(14,Math.abs(a.y-T)*.45+6),i=s+12,l=t?`${n} \xB7 ${Br[e]??e.slice(0,2)}`:`${n}`;return R`
40
+ ${n?A`<text class="centre-label" x=${P} y=${P} text-anchor="middle" dominant-baseline="central">${n}</text>`:le}
41
+ `}function $o(n,a,e,r,t){let s=fo[n];if(!s)return A``;let o=Math.min(14,Math.abs(s.y-P)*.45+6),i=o+12,l=t?`${a} \xB7 ${Ea[e]??e.slice(0,2)}`:`${a}`;return A`
42
42
  <g class=${t?"cell lagna":"cell"}>
43
- <text class="rashi-num" x=${a.x} y=${a.y-s} text-anchor="middle" dominant-baseline="central">${l}</text>
44
- ${t?R`<text class="lagna-marker" x=${a.x} y=${a.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:ee}
45
- ${r.length?pt(r,e,a.x,a.y+8,12):ee}
43
+ <text class="rashi-num" x=${s.x} y=${s.y-o} text-anchor="middle" dominant-baseline="central">${l}</text>
44
+ ${t?A`<text class="lagna-marker" x=${s.x} y=${s.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:le}
45
+ ${r.length?Qa(r,e,s.x,s.y+8,12):le}
46
46
  </g>
47
- `}function vs(o){let n=o.lagnaSign||"Aries";return R`
48
- ${fs(o.divisionLabel)}
49
- ${Array.from({length:12},(e,r)=>{let t=r+1,a=xs(t,n),s=G[a-1]??"Aries";return bs(t,a,s,o.placements[s.toLowerCase()]??[],t===1)})}
50
- `}var Ur=B/3;function $s(){let o=S,n=S+Ur,e=S+2*Ur,r=pe-S,Hr={Aries:[{x:n,y:o},{x:e,y:o},{x:e,y:n},{x:n,y:n}],Taurus:[{x:o,y:o},{x:n,y:o},{x:n,y:n}],Gemini:[{x:o,y:o},{x:n,y:n},{x:o,y:n}],Cancer:[{x:o,y:n},{x:n,y:n},{x:n,y:e},{x:o,y:e}],Leo:[{x:o,y:e},{x:n,y:e},{x:o,y:r}],Virgo:[{x:n,y:e},{x:n,y:r},{x:o,y:r}],Libra:[{x:n,y:e},{x:e,y:e},{x:e,y:r},{x:n,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:n},{x:r,y:n},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:o},{x:r,y:n},{x:e,y:n}],Pisces:[{x:e,y:o},{x:r,y:o},{x:e,y:n}]},Lr={};for(let[Ir,jr]of Object.entries(Hr))Lr[Ir]={points:[...jr],centroid:ke(jr)};return Lr}var ws=$s();function ks(o){let n=S,e=S+Ur,r=S+2*Ur,t=pe-S;return R`
51
- <rect class="line" x=${n} y=${n} width=${B} height=${B} stroke-width="1.5" fill="none" />
52
- <line class="line" x1=${n} y1=${e} x2=${e} y2=${e} stroke-width="1" />
47
+ `}function wo(n){let a=n.lagnaSign||"Aries";return A`
48
+ ${vo(n.divisionLabel)}
49
+ ${Array.from({length:12},(e,r)=>{let t=r+1,s=bo(t,a),o=I[s-1]??"Aries";return $o(t,s,o,n.placements[o.toLowerCase()]??[],t===1)})}
50
+ `}var Ma=V/3;function ko(){let n=R,a=R+Ma,e=R+2*Ma,r=$e-R,fe={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:r}],Virgo:[{x:a,y:e},{x:a,y:r},{x:n,y:r}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:r},{x:a,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:a},{x:r,y:a},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:n},{x:r,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:r,y:n},{x:e,y:a}]},ia={};for(let[ka,Sa]of Object.entries(fe))ia[ka]={points:[...Sa],centroid:Me(Sa)};return ia}var So=ko();function Ro(n){let a=R,e=R+Ma,r=R+2*Ma,t=$e-R;return A`
51
+ <rect class="line" x=${a} y=${a} width=${V} height=${V} stroke-width="1.5" fill="none" />
52
+ <line class="line" x1=${a} y1=${e} x2=${e} y2=${e} stroke-width="1" />
53
53
  <line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
54
- <line class="line" x1=${n} y1=${r} x2=${e} y2=${r} stroke-width="1" />
54
+ <line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
55
55
  <line class="line" x1=${r} y1=${r} x2=${t} y2=${r} stroke-width="1" />
56
- <line class="line" x1=${e} y1=${n} x2=${e} y2=${e} stroke-width="1" />
56
+ <line class="line" x1=${e} y1=${a} x2=${e} y2=${e} stroke-width="1" />
57
57
  <line class="line" x1=${e} y1=${r} x2=${e} y2=${t} stroke-width="1" />
58
- <line class="line" x1=${r} y1=${n} x2=${r} y2=${e} stroke-width="1" />
58
+ <line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
59
59
  <line class="line" x1=${r} y1=${r} x2=${r} y2=${t} stroke-width="1" />
60
- <line class="line" x1=${n} y1=${n} x2=${e} y2=${e} stroke-width="1" />
61
- <line class="line" x1=${t} y1=${n} x2=${r} y2=${e} stroke-width="1" />
60
+ <line class="line" x1=${a} y1=${a} x2=${e} y2=${e} stroke-width="1" />
61
+ <line class="line" x1=${t} y1=${a} x2=${r} y2=${e} stroke-width="1" />
62
62
  <line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
63
- <line class="line" x1=${n} y1=${t} x2=${e} y2=${r} stroke-width="1" />
64
- ${o?R`<text class="centre-label" x=${T} y=${T} text-anchor="middle" dominant-baseline="central">${o}</text>`:ee}
65
- `}function Ss(o,n,e,r){let t=ws[o];if(!t)return R``;let{centroid:a,points:s}=t,i=Br[o]??o.slice(0,2),l=s.map(c=>`${c.x},${c.y}`).join(" ");return R`
63
+ <line class="line" x1=${a} y1=${t} x2=${e} y2=${r} stroke-width="1" />
64
+ ${n?A`<text class="centre-label" x=${P} y=${P} text-anchor="middle" dominant-baseline="central">${n}</text>`:le}
65
+ `}function Co(n,a,e,r){let t=So[n];if(!t)return A``;let{centroid:s,points:o}=t,i=Ea[n]??n.slice(0,2),l=o.map(c=>`${c.x},${c.y}`).join(" ");return A`
66
66
  <g class=${e?"cell lagna":"cell"}>
67
- ${e?R`<polygon class="lagna-bg" points=${l} />`:ee}
68
- <text class="sign-text" x=${a.x} y=${a.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
69
- ${r>0?R`<text class="house-num" x=${a.x+18} y=${a.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:ee}
70
- ${e?R`<text class="lagna-marker" x=${a.x} y=${a.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:ee}
71
- ${n.length?pt(n,o,a.x,a.y+4,12):ee}
67
+ ${e?A`<polygon class="lagna-bg" points=${l} />`:le}
68
+ <text class="sign-text" x=${s.x} y=${s.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
69
+ ${r>0?A`<text class="house-num" x=${s.x+18} y=${s.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:le}
70
+ ${e?A`<text class="lagna-marker" x=${s.x} y=${s.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:le}
71
+ ${a.length?Qa(a,n,s.x,s.y+4,12):le}
72
72
  </g>
73
- `}function Cs(o){let n=o.lagnaSign.toLowerCase();return R`
74
- ${ks(o.divisionLabel)}
75
- ${G.map(e=>Ss(e,o.placements[e.toLowerCase()]??[],e.toLowerCase()===n,_t(e,o.lagnaSign)))}
76
- `}function Jr(o,n){switch(n){case"north":return vs(o);case"east":return Cs(o);default:return us(o)}}function Xr(o,n){return xr({items:is,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}import{css as Ps}from"lit";var Qr=Ps`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var De=class extends Ts{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new u(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Wr(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return fr`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return fr`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?fr`<span class="division-meta">· ${r.sanskritName}</span>`:mt}</h2>${r.significance?fr`<p class="significance">${r.significance}</p>`:mt}</div>${Xr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${r.number} ${r.name} divisional chart with twelve sign houses"><title>D${r.number} ${r.name}</title>${Jr(e,this.chartStyle)}</svg> ${t&&t.length>0?fr`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(a=>fr`<span class="vargottama-pill" role="listitem">${C[a]??""} ${a}</span>`)}</div>`:mt}</div>`}};De.styles=[g,Qr,Me,Ls`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],d([Kt({attribute:!1})],De.prototype,"data",2),d([Kt({type:String,reflect:!0,attribute:"chart-style"})],De.prototype,"chartStyle",2),De=d([Rs("roxy-divisional-chart")],De);import{css as As,html as xe,LitElement as Es,nothing as br}from"lit";import{customElement as Ns,property as Yt}from"lit/decorators.js";var zs={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Ge=class extends Es{constructor(){super();this.data=null;this.type="manglik";new u(this)}render(){let e=this.data;if(!e)return xe`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=zs[this.type]??this.type,a=(e.severity??"").toLowerCase(),s=a==="severe"?3:a==="moderate"?2:a==="mild"?1:0,i=s*33,l=s===3?"var(--roxy-danger)":s===2?"var(--roxy-warning)":s===1?"var(--roxy-success)":"transparent";return xe`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?xe`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${s}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:br} ${e.description?xe`<p class="description">${e.description}</p>`:br} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?xe`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>xe`<li>${c}</li>`)}</ul></div>`:br} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?xe`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>xe`<li>${c}</li>`)}</ul></div>`:br}</article>`}renderEffects(e){if(!e.effects)return br;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?br:xe`<div class="effects">${r.map(([t,a])=>xe`<div><h3>${t}</h3><p>${a}</p></div>`)}</div>`}};Ge.styles=[g,As`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([Yt({attribute:!1})],Ge.prototype,"data",2),d([Yt({type:String,reflect:!0})],Ge.prototype,"type",2),Ge=d([Ns("roxy-dosha-card")],Ge);import{css as Ms,html as fe,LitElement as Ds,nothing as Zr}from"lit";import{customElement as Gs,property as et,state as Er}from"lit/decorators.js";var gt=new Map;async function Os(o){let n=gt.get(o);return n||(n=fetch(o).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw gt.delete(o),e}),gt.set(o,n)),n}var F=class extends Ds{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.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};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(t=>t.required).filter(t=>this.values[t.name]===void 0||this.values[t.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(t=>t.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(){this.specError=null;try{let e=await Os(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let a=e.components?.schemas??{},s=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,a)}if(i?.properties){let c=new Set(i.required??[]);for(let[m,p]of Object.entries(i.properties)){let y=this.resolve(p,a)??{};s.push({name:m,type:this.fieldType(y),required:c.has(m),description:y.description,enum:y.enum,min:y.minimum,max:y.maximum,default:y.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let m=this.resolve(c.schema,a)??{};s.push({name:c.name,type:this.fieldType(m),required:!!c.required,description:m.description,enum:m.enum,default:m.default})}this.fields=s,this.hasLocation=s.some(c=>c.name==="latitude")&&s.some(c=>c.name==="longitude")&&s.some(c=>c.name==="timezone");let l={};for(let c of s)c.default!==void 0&&(l[c.name]=c.default);this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return fe`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return fe`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return Zr;let t=`roxy-form-${r.name}`;return fe`<div class="field"><label for="${t}">${de(r.name)}${r.required?fe`<span class="req" aria-hidden="true">*</span>`:Zr}</label> ${r.enum?fe`<select id="${t}" ?required="${r.required}" @change="${a=>this.setValue(r.name,a.target.value)}"><option value="">Choose</option>${r.enum.map(a=>fe`<option value="${a}" ?selected="${this.values[r.name]===a}">${a}</option>`)}</select>`:fe`<input id="${t}" type="${this.htmlType(r.type)}" ?required="${r.required}" min="${r.min??""}" max="${r.max??""}" step="${r.type==="number"?"any":""}" .value="${this.values[r.name]??""}" @input="${a=>this.setValue(r.name,this.coerce(r.type,a.target.value))}">`} ${r.description?fe`<small class="help">${r.description}</small>`:Zr}</div>`};return fe`<form @submit="${this.onSubmit}"><h2 class="title">${de(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?fe`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:Zr}<div class="fields">${this.fields.map(r=>e(r))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};F.styles=[g,Ms`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([et({type:String,attribute:"data-endpoint"})],F.prototype,"endpoint",2),d([et({type:String})],F.prototype,"method",2),d([et({type:String,attribute:"spec-url"})],F.prototype,"specUrl",2),d([et({type:String,attribute:"submit-label"})],F.prototype,"submitLabel",2),d([Er()],F.prototype,"fields",2),d([Er()],F.prototype,"values",2),d([Er()],F.prototype,"hasLocation",2),d([Er()],F.prototype,"loaded",2),d([Er()],F.prototype,"specError",2),F=d([Gs("roxy-endpoint-form")],F);import{css as Hs,html as J,LitElement as Is,nothing as Nr}from"lit";import{customElement as js,property as Bs}from"lit/decorators.js";var _s={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Ks=["western","vedic","biorhythm"],sr=class extends Is{constructor(){super();this.data=null;new u(this)}render(){let e=this.data;if(!e)return J`<div class="roxy-empty" role="status">No forecast data</div>`;let r=e.events??[],t=this.groupByDate(r),a=Ks.filter(s=>r.some(i=>i.domain===s));return J`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?J`<div class="range">${Ae(e.startDate)} - ${Ae(e.endDate)} · ${e.count??r.length} events</div>`:Nr}</header>${a.length?J`<div class="legend">${a.map(s=>J`<span><span class="swatch swatch-${s}"></span>${_s[s]}</span>`)}</div>`:Nr} ${t.length?J`<div class="days" role="list">${t.map(([s,i])=>this.renderDay(s,i))}</div>`:J`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(e){let r=new Map;for(let t of e){let a=t.date??"",s=r.get(a)??[];s.push(t),r.set(a,s)}return[...r.entries()]}renderDay(e,r){return J`<div class="day" role="listitem"><div class="day-date">${Ae(e)}</div><div class="events">${r.map(t=>this.renderEvent(t))}</div></div>`}renderEvent(e){let r=typeof e.significance=="number"?e.significance:0,t=Math.max(0,Math.min(100,r));return J`<div class="event"><span class="dot dot-${e.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(e)}</div>${e.description?J`<p class="event-desc">${e.description}</p>`:Nr}<div class="sig" title="Significance ${t} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${e.domain}" style="width:${t}%"></span> </span><span class="sig-val">${t}</span></div></div></div>`}renderHeadline(e){let r=e.body?x(e.body):"",t=e.target?x(e.target):"",a=e.aspect?e.aspect.toLowerCase():"",s=tr[a]??"",i=a?Tr[a]??a:"",l=typeof e.orb=="number"?f(e.orb,1):"",c=this.typeQualifier(e);return a&&t?J`<strong>${r}</strong> <span class="${s}">${i}</span> <strong>${t}</strong>${l?J`<span class="kind">orb ${l}°</span>`:Nr}`:J`<strong>${r||de(e.type??"")}</strong>${c?J`<span class="kind">${c}</span>`:Nr}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${x(e.target)}`:e.type==="retrograde-station"&&e.station?e.station:e.type==="eclipse"?[e.kind,"eclipse"].filter(Boolean).join(" "):e.type==="critical-day"?"critical day":e.type==="dasha-change"&&e.target?`dasha ${x(e.target)}`:de(e.type??"")}};sr.styles=[g,Hs`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],d([Bs({attribute:!1})],sr.prototype,"data",2),sr=d([js("roxy-forecast-timeline")],sr);import{css as Ys,html as Se,LitElement as qs,nothing as rt}from"lit";import{customElement as Vs,property as Fs}from"lit/decorators.js";var or=class extends qs{constructor(){super();this.data=null;new u(this)}render(){let e=this.data;if(!e)return Se`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(p=>p?.category!==void 0),t=e.total??0,a=e.maxScore??36,s=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",l=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,m=(100-s)*2.827;return Se`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${f(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?Se`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Mt(e.percentage,1)}</small>`:rt}</div>${e.recommendation?Se`<span class="recommendation">${e.recommendation}</span>`:rt}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${l}" stroke-width="8" stroke-dasharray="${c},${m}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${r.length>0?Se`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(p=>{let y=p.score??0,v=p.maxScore??Us(p.category),h=v?y/v*100:0;return Se`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${h}%"></span></div></td><td class="score">${f(y,1)} / ${v}</td></tr>`})}</tbody></table>`:rt} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?Se`<div class="tags">${e.doshas?.map(p=>Se`<span class="dosha">${p}</span>`)} ${e.doshaCancellations?.map(p=>Se`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:rt}</article>`}};or.styles=[g,Ys`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],d([Fs({attribute:!1})],or.prototype,"data",2),or=d([Vs("roxy-guna-milan")],or);function Us(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}}import{css as Ws,html as U,LitElement as Js,nothing as ae,svg as qt}from"lit";import{customElement as Xs,property as Vt}from"lit/decorators.js";var Oe=class extends Js{constructor(){super();this.data=null;this.mode="lookup";new u(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return U`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:a,dailyMessage:s,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(a??[]);return U`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?U`<div class="symbol">${r.symbol}</div>`:ae}<div class="lines" aria-hidden="true">${l.slice().reverse().map((m,p)=>{let y=l.length-1-p+1,v=c.has(y),h=m===6||m===8;return U`<div class="line ${`${h?"broken":"solid"}${v?" changing":""}`}">${h?qt`<span class="seg"></span><span class="seg"></span>`:qt`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?U`${r.number}.`:ae}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?U`${r.chinese}`:ae} ${r.pinyin?U`· ${r.pinyin}`:ae}</p><div class="trigrams">${r.upperTrigram?U`<div>Upper <span class="tri-glyph">${at[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:ae} ${r.lowerTrigram?U`<div>Lower <span class="tri-glyph">${at[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:ae}</div>${r.judgment?U`<p class="judgment">${r.judgment}</p>`:ae} ${r.image?U`<p class="image">${r.image}</p>`:ae} ${s?U`<p class="message">${s}</p>`:ae} ${r.interpretation?.general?U`<p>${r.interpretation.general}</p>`:ae} ${c.size>0?U`<div class="changing">Changing lines: ${Array.from(c).sort((m,p)=>m-p).join(", ")}. ${i?.english?U`Becomes hexagram ${i.number} ${i.english}.`:ae}</div>`:ae}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,a=[];for(let s=0;s<6;s++){let i=t>>s&1;a.push(i?8:7)}return a}return Array.from({length:6},()=>7)}};Oe.styles=[g,Ws`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([Vt({attribute:!1})],Oe.prototype,"data",2),d([Vt({type:String,reflect:!0})],Oe.prototype,"mode",2),Oe=d([Xs("roxy-hexagram")],Oe);import{css as Qs,html as j,LitElement as Zs,nothing as X}from"lit";import{customElement as eo,property as Ft}from"lit/decorators.js";var He=class extends Zs{constructor(){super();this.data=null;this.period="daily";new u(this)}render(){let e=this.data;if(!e)return j`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?Y[x(r)]??"":"",a="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,s="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return j`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${s?j`<div class="date">${s}</div>`:X}</div>${a!==null?j`<span class="energy" aria-label="${`Energy ${a} of 10`}">Energy ${a}/10 <span class="energy-bar"><span style="width:${a/10*100}%"></span></span></span>`:X}</header>${e.overview?j`<p class="overview">${e.overview}</p>`:X}<div class="sections">${e.love?j`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:X} ${e.career?j`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:X} ${e.health?j`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:X} ${e.finance?j`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:X} ${"advice"in e&&e.advice?j`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:X}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],m="luckyDays"in e&&e.luckyDays?e.luckyDays:[],p=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&m.length===0&&p.length===0?X:j`<div class="lucky">${i!==void 0?j`<span>Lucky number <strong>${i}</strong></span>`:X} ${l?j`<span>Lucky color <strong>${l}</strong></span>`:X} ${c.length?j`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:X} ${m.length?j`<span>Lucky days <strong>${m.join(", ")}</strong></span>`:X} ${p.length?j`<span class="compat-wrap">Best with <span class="compat">${p.map(y=>j`<span>${y}</span>`)}</span></span>`:X}</div>`})()}</article>`}};He.styles=[g,Qs`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([Ft({attribute:!1})],He.prototype,"data",2),d([Ft({type:String,reflect:!0})],He.prototype,"period",2),He=d([eo("roxy-horoscope-card")],He);import{css as ro,html as _,LitElement as to,nothing as nr}from"lit";import{customElement as ao,property as so,state as oo}from"lit/decorators.js";var Ie=class extends to{constructor(){super();this.data=null;this.activeTab="planets";new u(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.planet,sign:a.sign,house:a.house,nakshatra:a.nakshatra,starLord:a.starLord,subLord:a.subLord,subSubLord:a.subSubLord,kpNumber:a.kpNumber,retrograde:a.retrograde})),t=e.nodes;for(let[a,s]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])s&&r.push({name:a,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}render(){if(!this.data)return _`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return _`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?_`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?_`· ${r.nakshatra}`:nr} ${r.subLord?_`· sub lord ${r.subLord}`:nr} ${typeof r.kpNumber=="number"?_`· KP ${r.kpNumber}`:nr}</div>`:nr} ${typeof e.meta?.ayanamsa=="number"?_`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${f(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?_`· ${e.meta.houseSystem} houses`:nr}</div>`:nr}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>_`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?_`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>_`<tr><td class="body">${r.name}${r.retrograde?_`<span class="retro">R</span>`:nr}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:_`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?_`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>_`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:_`<p class="roxy-empty" role="status">No cusps</p>`}};Ie.styles=[g,ro`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([so({attribute:!1})],Ie.prototype,"data",2),d([oo()],Ie.prototype,"activeTab",2),Ie=d([ao("roxy-kp-chart")],Ie);import{css as no,html as zr,LitElement as io,nothing as Ut}from"lit";import{customElement as lo,property as co}from"lit/decorators.js";var ir=class extends io{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return zr`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return zr`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?zr`<span class="ayanamsa">Ayanamsa: ${f(this.data.ayanamsa,2)}°</span>`:Ut}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>zr`<tr><td class="planet">${r.planet} ${r.retrograde?zr`<span class="retro">R</span>`:Ut}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};ir.styles=[g,no`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],d([co({attribute:!1})],ir.prototype,"data",2),ir=d([lo("roxy-kp-planets-table")],ir);import{css as po,html as lr,LitElement as mo,nothing as yt}from"lit";import{customElement as go,property as yo}from"lit/decorators.js";var dr=class extends mo{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return lr`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return lr`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?lr`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:yt}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?lr`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,a)=>lr`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:yt} ${r.length?lr`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>lr`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:yt}</div>`}};dr.styles=[g,po`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],d([yo({attribute:!1})],dr.prototype,"data",2),dr=d([go("roxy-kp-ruling-planets")],dr);import{css as uo,html as vr,LitElement as ho,nothing as Jt}from"lit";import{customElement as xo,property as Mr,state as Dr}from"lit/decorators.js";function Wt(o,n){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,o(...t)},n)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var K=class extends ho{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=Wt(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let a={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let s=this.publishableKey??this.apiKey;s&&(a["X-API-Key"]=s);let i=await fetch(t,{headers:a,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return vr`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?vr`<span class="spinner" role="status" aria-label="Loading"></span>`:Jt} ${this.isOpen?vr`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?vr`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>vr`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?vr`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:Jt}</div>`}};K.styles=[g,uo`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([Mr({type:String,attribute:"api-key"})],K.prototype,"apiKey",2),d([Mr({type:String,attribute:"publishable-key"})],K.prototype,"publishableKey",2),d([Mr({type:String})],K.prototype,"endpoint",2),d([Mr({type:String})],K.prototype,"placeholder",2),d([Mr({type:String,attribute:"default-value"})],K.prototype,"defaultValue",2),d([Dr()],K.prototype,"query",2),d([Dr()],K.prototype,"results",2),d([Dr()],K.prototype,"isOpen",2),d([Dr()],K.prototype,"isLoading",2),d([Dr()],K.prototype,"highlight",2),K=d([xo("roxy-location-search")],K);import{css as fo,html as se,LitElement as bo,nothing as je}from"lit";import{customElement as vo,property as Xt}from"lit/decorators.js";var Be=class extends bo{constructor(){super();this.data=null;this.mode="current";new u(this)}render(){let e=this.data;if(!e)return se`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,a="year"in e?e.year:void 0;return se`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${a??""}</h2><div class="list" role="list">${r.map(s=>this.renderListItem(s))}</div></article>`}return"phase"in e?this.renderSingle(e):je}renderSingle(e){let r=Qt(e.phase);return se`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?se`<div class="date">${e.date}</div>`:je}</div></div><div class="stats">${typeof e.illumination=="number"?se`<div><span>Illumination</span> <strong>${$o(e.illumination)}</strong></div>`:je} ${typeof e.age=="number"?se`<div><span>Age</span> <strong>${f(e.age,1)} days</strong></div>`:je} ${e.sign?se`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:je} ${typeof e.distance=="number"?se`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:je}</div>${e.meaning?.description?se`<p class="meaning">${e.meaning.description}</p>`:je} ${e.meaning?.keywords?.length?se`<div class="keywords">${e.meaning.keywords.map(t=>se`<span>${t}</span>`)}</div>`:je}</article>`}renderListItem(e){let r=Qt(e.phase);return se`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};Be.styles=[g,fo`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([Xt({attribute:!1})],Be.prototype,"data",2),d([Xt({type:String,reflect:!0})],Be.prototype,"mode",2),Be=d([vo("roxy-moon-phase")],Be);function Qt(o){return o?St[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function $o(o){let n=o<=1?o*100:o;return`${Math.round(n)}%`}import{css as wo,html as oe,LitElement as ko,nothing as be}from"lit";import{customElement as So,property as Co}from"lit/decorators.js";var cr=class extends ko{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return oe`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return oe`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?oe`<span class="number">Nakshatra ${e.number} of 27</span>`:be} ${e.range?oe`<span class="range">${e.range}</span>`:be}</header><dl class="facts">${e.lord?oe`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:be} ${e.deity?oe`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:be} ${e.symbol?oe`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:be}</dl>${e.characteristics?oe`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:be} ${r?oe`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?oe`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:be} ${r.gemstones?oe`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:be} ${r.rituals?oe`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:be}</div></div>`:be}</article>`}};cr.styles=[g,wo`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],d([Co({attribute:!1})],cr.prototype,"data",2),cr=d([So("roxy-nakshatra-card")],cr);import{css as To,html as $,LitElement as Ro,nothing as H,svg as me}from"lit";import{customElement as Ao,property as Zt,state as Eo}from"lit/decorators.js";import{css as Po,html as Lo}from"lit";function ve(){return Lo`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var $r=Po`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var ht=420,b=ht/2,wr=164,ut=146,Gr=120,kr=96,No=178,zo=196,Ce=class extends Ro{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new u(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return $`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return $`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?$`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:H}</header>${xr({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:a=>{this.view=a},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?$`<span>${this.data.houseSystem} houses</span>`:H} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return $`<svg viewBox="0 0 ${ht} ${ht}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${b}" cy="${b}" r="${wr}" stroke-width="1.5"/><circle class="wheel-line" cx="${b}" cy="${b}" r="${ut-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${b}" cy="${b}" r="${Gr}" stroke-width="1"/><circle class="wheel-line" cx="${b}" cy="${b}" r="${kr-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(s=>x(s.name)),a=new Map;for(let s of r){let i=[x(s.planet1),x(s.planet2)].sort().join("|");a.set(i,s)}return t.length===0?$`<p class="roxy-empty" role="status">No planets to grid</p>`:$`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(s=>{let i=C[s]??s.slice(0,2);return $`<th scope="col" title="${s}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((s,i)=>{let l=C[s]??s.slice(0,2);return $`<tr><th scope="row" title="${s}">${l}</th>${t.slice(0,i+1).map(c=>{let m=a.get([s,c].sort().join("|"));if(!m)return $`<td class="empty"></td>`;let p=hr(m),y=Tr[p]??Tr[p.replace(/-/g,"")]??p.slice(0,3),v=tr[p]??"aspect-other",h=f(m.orb,1);return $`<td class="${`cell ${v}`}" title="${`${s} ${p} ${c}${h?` (orb ${h}\xB0)`:""}`}"><span class="asp">${y}</span></td>`})} ${t.slice(i+1,-1).map(()=>$`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(ct(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(ct(r),"IC")));let a=this.data?.partOfFortune?.longitude;typeof a=="number"&&t.push(this.renderAngleMark(ue(a),"PoF"));let s=this.data?.vertex?.longitude;return typeof s=="number"&&t.push(this.renderAngleMark(ue(s),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),a=k(b,b,wr,t),s=k(b,b,No,t),i=k(b,b,zo,t);return me`
73
+ `}function To(n){let a=n.lagnaSign.toLowerCase();return A`
74
+ ${Ro(n.divisionLabel)}
75
+ ${I.map(e=>Co(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,Gt(e,n.lagnaSign)))}
76
+ `}function Ha(n,a){switch(a){case"north":return wo(n);case"east":return To(n);default:return ho(n)}}function Oa(n,a){return Ar({items:lo,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}import{css as Eo}from"lit";var ja=Eo`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var dr=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Ga(this.data.chart.meta,r)}renderEmpty(){return Nr`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let{division:t,vargottama:s}=e;return Nr`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?Nr`<span class="division-meta">· ${t.sanskritName}</span>`:et}</h2>${t.significance?Nr`<p class="significance">${t.significance}</p>`:et}</div>${Oa(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${Ha(r,this.chartStyle)}</svg> ${s&&s.length>0?Nr`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>Nr`<span class="vargottama-pill" role="listitem">${v[o]??""} ${o}</span>`)}</div>`:et}</div>`}};dr.styles=[g,ja,qe,Do`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],d([zo({type:String,reflect:!0,attribute:"chart-style"})],dr.prototype,"chartStyle",2),dr=d([Po("roxy-divisional-chart")],dr);import{css as Ao,html as Pe,nothing as Lr}from"lit";import{customElement as No,property as Lo}from"lit/decorators.js";var Mo={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},cr=class extends m{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return Pe`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=Mo[this.type]??this.type,s=(e.severity??"").toLowerCase(),o=s==="severe"?3:s==="moderate"?2:s==="mild"?1:0,i=o*33,l=o===3?"var(--roxy-danger)":o===2?"var(--roxy-warning)":o===1?"var(--roxy-success)":"transparent";return Pe`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?Pe`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${o}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:Lr} ${e.description?Pe`<p class="description">${e.description}</p>`:Lr} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?Pe`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>Pe`<li>${c}</li>`)}</ul></div>`:Lr} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?Pe`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>Pe`<li>${c}</li>`)}</ul></div>`:Lr}</article>`}renderEffects(e){if(!e.effects)return Lr;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?Lr:Pe`<div class="effects">${r.map(([t,s])=>Pe`<div><h3>${t}</h3><p>${s}</p></div>`)}</div>`}};cr.styles=[g,Ao`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([Lo({type:String,reflect:!0})],cr.prototype,"type",2),cr=d([No("roxy-dosha-card")],cr);import{css as Go,html as ma,nothing as rt}from"lit";import{customElement as Ho}from"lit/decorators.js";var Mr=class extends m{renderData(a){return ma`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?ma`<span class="letter" aria-hidden="true">${a.letter}</span>`:rt}<div><p class="label">Dream symbol</p>${a.name?ma`<h2 class="name">${a.name}</h2>`:rt}</div></header>${a.meaning?ma`<p class="meaning">${a.meaning}</p>`:rt}</article>`}renderEmpty(){return ma`<div class="roxy-empty" role="status">No dream symbol</div>`}};Mr.styles=[g,Go`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:2.5rem;height:2.5rem;color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-variant-numeric:tabular-nums;flex:none;justify-content:center;align-items:center;display:inline-flex}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}`],Mr=d([Ho("roxy-dream-card")],Mr);import{css as Oo,html as Ba,nothing as jo}from"lit";import{customElement as Bo}from"lit/decorators.js";var Gr=class extends m{renderEmpty(){return Ba`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(a){let e=a.symbols??[];if(e.length===0)return this.renderEmpty();let r=typeof a.total=="number"?a.total:e.length;return Ba`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${r} match${r===1?"":"es"}</span></header><ul class="grid">${e.map(t=>Ba`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?Ba`<span class="letter" aria-hidden="true">${t.letter}</span>`:jo} <span class="name">${t.name}</span></button></li>`)}</ul></section>`}select(a){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:a.id,name:a.name,letter:a.letter},bubbles:!0,composed:!0}))}};Gr.styles=[g,Oo`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.result{align-items:center;gap:var(--roxy-space-sm,.5rem);text-align:left;width:100%;font:inherit;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;background:0 0;transition:border-color .12s,background .12s;display:flex}.result:hover,.result:focus-visible{border-color:var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);outline:none}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:1.6rem;height:1.6rem;color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;flex:none;place-items:center;display:grid}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:500}`],Gr=d([Bo("roxy-dream-search")],Gr);import{css as Io,html as ge,LitElement as Ko,nothing as Ia}from"lit";import{customElement as _o,property as ga,state as Ka}from"lit/decorators.js";var at=new Map;async function Fo(n){let a=at.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw at.delete(n),e}),at.set(n,a)),a}var ee=class extends Ko{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(s=>s.required).filter(s=>this.values[s.key]===void 0||this.values[s.key]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.key)},bubbles:!0,composed:!0}));return}let t={};for(let s of this.fields){let o=this.values[s.key];if(!(o===void 0||o===""))if(s.group){let i=t[s.group]??{};i[s.name]=o,t[s.group]=i}else t[s.name]=o}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:t},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Fo(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let s=e.components?.schemas??{},o=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,s)}if(i?.properties){let c=new Set(i.required??[]);for(let[p,y]of Object.entries(i.properties)){let u=this.resolve(y,s)??{};if(u.type==="object"&&u.properties){let k=new Set(u.required??[]);for(let[f,Xe]of Object.entries(u.properties)){let fe=this.resolve(Xe,s)??{};o.push({key:`${p}.${f}`,name:f,group:p,type:this.fieldType(fe),required:c.has(p)&&k.has(f),description:fe.description,enum:fe.enum,min:fe.minimum,max:fe.maximum,default:fe.default})}}else o.push({key:p,name:p,type:this.fieldType(u),required:c.has(p),description:u.description,enum:u.enum,min:u.minimum,max:u.maximum,default:u.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let p=this.resolve(c.schema,s)??{};o.push({key:c.name,name:c.name,type:this.fieldType(p),required:!!c.required,description:p.description,enum:p.enum,default:p.default})}this.fields=o;let l={};for(let c of o){c.default!==void 0&&(l[c.key]=c.default);let p=c.group?this.initialValues?.[c.group]?.[c.name]:this.initialValues?.[c.name];p!==void 0&&(l[c.key]=p)}this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}groupHasLocation(e){let r=this.fields.filter(t=>t.group===e);return["latitude","longitude","timezone"].every(t=>r.some(s=>s.name===t))}onLocationFor(e){let r=e?`${e}.`:"";return t=>{let s=t.detail;s&&(this.values={...this.values,[`${r}latitude`]:s.latitude,[`${r}longitude`]:s.longitude,[`${r}timezone`]:s.timezone??s.utcOffset})}}render(){if(!this.loaded)return ge`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return ge`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return Ia;let i=`roxy-form-${o.key}`;return ge`<div class="field"><label for="${i}">${D(o.name)}${o.required?ge`<span class="req" aria-hidden="true">*</span>`:Ia}</label> ${o.enum?ge`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>ge`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:ge`<input id="${i}" type="${this.htmlType(o.type)}" ?required="${o.required}" min="${o.min??""}" max="${o.max??""}" step="${o.type==="number"?"any":""}" .value="${this.values[o.key]??""}" @input="${l=>this.setValue(o.key,this.coerce(o.type,l.target.value))}">`} ${o.description?ge`<small class="help">${o.description}</small>`:Ia}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?ge`<div class="location-block"><label>${o?`${D(o)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(o)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:Ia,s=o=>ge`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return ge`<form @submit="${this.onSubmit}"><h2 class="title">${D(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):ge`<fieldset class="person-group"><legend>${D(o)}</legend>${s(o)}</fieldset>`)} <button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};ee.styles=[g,Io`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.person-group{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);margin:0 0 var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);min-inline-size:0;display:grid}.person-group legend{padding:0 var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([ga({type:String,attribute:"data-endpoint"})],ee.prototype,"endpoint",2),d([ga({type:String})],ee.prototype,"method",2),d([ga({type:String,attribute:"spec-url"})],ee.prototype,"specUrl",2),d([ga({type:String,attribute:"submit-label"})],ee.prototype,"submitLabel",2),d([ga({attribute:!1})],ee.prototype,"initialValues",2),d([Ka()],ee.prototype,"fields",2),d([Ka()],ee.prototype,"values",2),d([Ka()],ee.prototype,"loaded",2),d([Ka()],ee.prototype,"specError",2),ee=d([_o("roxy-endpoint-form")],ee);import{css as qo,html as Ge,nothing as Ht}from"lit";import{customElement as Vo}from"lit/decorators.js";var Hr=class extends m{renderEmpty(){return Ge`<div class="roxy-empty" role="status">No digest data</div>`}renderData(a){let e=a.windows??[];if(e.length===0)return this.renderEmpty();let r=[pe(a.startDate),pe(a.endDate)].filter(Boolean).join(" \u2013 ");return Ge`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?Ge`<p class="subtitle">${r}</p>`:Ht}</div>${e.map(t=>this.renderWindow(t))}</div>`}windowLabel(a){return a===1?"Next 24 hours":typeof a=="number"?`Next ${a} days`:"Window"}renderWindow(a){let e=a.top??[],r=a.byDomain??{},t=Object.entries(r);return Ge`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(a.days)}</span> <span class="window-count">${a.count??0} event${a.count===1?"":"s"}</span></div>${t.length>0?Ge`<div class="domains">${t.map(([s,o])=>Ge`<span class="domain-chip"><span class="swatch sw-${s}"></span>${D(s)} ${o}</span>`)}</div>`:Ht} ${e.length>0?Ge`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:Ge`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return Ge`<div class="event" role="listitem"><span class="event-date">${pe(a.date)}</span> <span class="event-desc">${a.description??D(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${h(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};Hr.styles=[g,qo`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.window{gap:var(--roxy-space-sm,.5rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);display:grid}.window:first-of-type{border-top:none;padding-top:0}.window-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.window-label{font-weight:var(--roxy-weight-bold,600)}.window-count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.domains{flex-wrap:wrap;gap:.4rem;display:flex}.domain-chip{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:.35rem;display:inline-flex}.swatch{border-radius:2px;width:.65rem;height:.65rem;display:inline-block}.sw-western{background:var(--roxy-accent,#f59e0b)}.sw-vedic{background:var(--roxy-info,#2563eb)}.sw-biorhythm{background:var(--roxy-success,#16a34a)}.event{grid-template-columns:auto 1fr;align-items:baseline;gap:.25rem .6rem;display:grid}.event-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;white-space:nowrap}.event-desc{font-size:var(--roxy-text-sm,.875rem);line-height:1.4}.sig{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:2px;grid-column:2;height:4px;overflow:hidden}.sig-fill{border-radius:2px;height:100%;display:block}.sig-fill.western{background:var(--roxy-accent,#f59e0b)}.sig-fill.vedic{background:var(--roxy-info,#2563eb)}.sig-fill.biorhythm{background:var(--roxy-success,#16a34a)}.quiet{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}`],Hr=d([Vo("roxy-forecast-digest")],Hr);import{css as Yo,html as se,nothing as ya}from"lit";import{customElement as Uo}from"lit/decorators.js";var Wo={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Jo=["western","vedic","biorhythm"],Or=class extends m{renderEmpty(){return se`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=Jo.filter(s=>e.some(o=>o.domain===s));return se`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?se`<div class="range">${pe(a.startDate)} - ${pe(a.endDate)} · ${a.count??e.length} events</div>`:ya}</header>${t.length?se`<div class="legend">${t.map(s=>se`<span><span class="swatch swatch-${s}"></span>${Wo[s]}</span>`)}</div>`:ya} ${r.length?se`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:se`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(a){let e=new Map;for(let r of a){let t=r.date??"",s=e.get(t)??[];s.push(r),e.set(t,s)}return[...e.entries()]}renderDay(a,e){return se`<div class="day" role="listitem"><div class="day-date">${pe(a)}</div><div class="events">${e.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0,r=Math.max(0,Math.min(100,e));return se`<div class="event"><span class="dot dot-${a.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(a)}</div>${a.description?se`<p class="event-desc">${a.description}</p>`:ya}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${a.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(a){let e=a.body?x(a.body):"",r=a.target?x(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=er[t]??"",o=t?da[t]??t:"",i=typeof a.orb=="number"?h(a.orb,1):"",l=this.typeQualifier(a);return t&&r?se`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?se`<span class="kind">orb ${i}°</span>`:ya}`:se`<strong>${e||D(a.type??"")}</strong>${l?se`<span class="kind">${l}</span>`:ya}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${x(a.target)}`:a.type==="retrograde-station"&&a.station?a.station:a.type==="eclipse"?[a.kind,"eclipse"].filter(Boolean).join(" "):a.type==="critical-day"?"critical day":a.type==="dasha-change"&&a.target?`dasha ${x(a.target)}`:D(a.type??"")}};Or.styles=[g,Yo`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],Or=d([Uo("roxy-forecast-timeline")],Or);import{css as Xo,html as He,nothing as _a}from"lit";import{customElement as Zo}from"lit/decorators.js";var jr=class extends m{renderEmpty(){return He`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(a){let e=(a.breakdown??[]).filter(p=>p?.category!==void 0),r=a.total??0,t=a.maxScore??36,s=r/t*100,o="color-mix(in srgb, var(--roxy-border) 50%, transparent)",i=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",l=s*2.827,c=(100-s)*2.827;return He`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${h(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?He`<small style="margin-left:.5rem;color:var(--roxy-muted)">${wt(a.percentage,1)}</small>`:_a}</div>${a.recommendation?He`<span class="recommendation">${a.recommendation}</span>`:_a}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${o}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8" stroke-dasharray="${l},${c}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${e.length>0?He`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${e.map(p=>{let y=p.score??0,u=p.maxScore??Qo(p.category),k=u?y/u*100:0;return He`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${k}%"></span></div></td><td class="score">${h(y,1)} / ${u}</td></tr>`})}</tbody></table>`:_a} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?He`<div class="tags">${a.doshas?.map(p=>He`<span class="dosha">${p}</span>`)} ${a.doshaCancellations?.map(p=>He`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:_a}</article>`}};jr.styles=[g,Xo`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],jr=d([Zo("roxy-guna-milan")],jr);function Qo(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}import{css as en,html as Oe,nothing as ua}from"lit";import{customElement as rn}from"lit/decorators.js";var Br=class extends m{renderData(a){let e=a.channels??[];return Oe`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?Oe`<span class="count">${a.totalChannels} channels</span>`:ua}</header>${a.combinedDefinition?Oe`<p class="def">Combined definition: <strong>${D(String(a.combinedDefinition))}</strong></p>`:ua} ${this.renderSummary(a.summary)} ${e.length>0?Oe`<div class="scroll"><table role="table" aria-label="Connection channels"><thead><tr><th scope="col">Channel</th><th scope="col">Gates</th><th scope="col">Circuit</th><th scope="col">Dynamic</th><th scope="col">Held by</th></tr></thead><tbody>${e.map(r=>this.renderChannel(r))}</tbody></table></div>`:ua}</div>`}renderSummary(a){if(!a)return ua;let e=[["Electromagnetic",a.electromagnetic],["Dominance",a.dominance],["Compromise",a.compromise],["Companionship",a.companionship]];return Oe`<div class="stats" aria-label="Channel dynamics">${e.map(([r,t])=>typeof t=="number"?Oe`<span class="stat">${r} <b>${t}</b></span>`:ua)}</div>`}renderChannel(a){let e=a.personAGates??[],r=a.personBGates??[],t=[e.length?"A":"",r.length?"B":""].filter(Boolean).join(" + ")||"-";return Oe`<tr><td>${a.name??""}</td><td class="gates">${a.gateA}-${a.gateB}</td><td>${a.circuit??""}</td><td>${a.dynamic?Oe`<span class="dyn">${a.dynamic}</span>`:""}</td><td class="who">${t}</td></tr>`}renderEmpty(){return Oe`<div class="roxy-empty" role="status">No connection data</div>`}};Br.styles=[g,en`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums}.def{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.def strong{color:var(--roxy-fg,#0a0a0a);text-transform:capitalize}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr:last-child td{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.dyn{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);padding:1px 8px;display:inline-block}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.scroll{overflow-x:auto}`],Br=d([rn("roxy-hd-connection")],Br);import{css as an,html as we,nothing as Ve}from"lit";import{customElement as tn}from"lit/decorators.js";var Ir=class extends m{renderData(a){let e=a.channels??[],r=e.filter(s=>s.position==="upper"),t=e.filter(s=>s.position==="lower");return we`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?we`<span class="count">${a.memberCount} members</span>`:Ve}</header>${this.renderSummary(a.summary)} ${this.renderGroup("Upper (direction)",r)} ${this.renderGroup("Lower (execution)",t)}</div>`}renderSummary(a){if(!a)return Ve;let e=a.gapGates??[];return we`<div class="stats" aria-label="Penta summary">${typeof a.definedChannels=="number"?we`<span class="stat">Defined channels <b>${a.definedChannels}</b></span>`:Ve} ${typeof a.filledGates=="number"?we`<span class="stat">Filled gates <b>${a.filledGates}</b></span>`:Ve} ${e.length>0?we`<span class="stat">Gap gates <b>${e.join(", ")}</b></span>`:Ve} ${typeof a.coreDefined=="boolean"?we`<span class="stat">${a.coreDefined?"Core defined":"Core open"}</span>`:Ve}</div>`}renderGroup(a,e){return e.length===0?Ve:we`<div class="section"><h3>${a}</h3>${e.map(r=>we`<div class="row"><span class="gates">${r.gateA}-${r.gateB}</span> <span class="cname">${r.name??""}</span> <span class="badge ${r.defined?"defined":"open"}">${r.defined?"Defined":"Open"}</span> ${r.isCore?we`<span class="badge core">Core</span>`:Ve}</div>`)}</div>`}renderEmpty(){return we`<div class="roxy-empty" role="status">No penta data</div>`}};Ir.styles=[g,an`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;display:flex}.row:last-child{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600);min-width:3.5rem}.cname{flex:1;min-width:8rem}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 8px;display:inline-flex}.badge.defined{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.open{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.core{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a)}`],Ir=d([tn("roxy-hd-penta")],Ir);import{css as sn,html as Kr,nothing as tt}from"lit";import{customElement as on}from"lit/decorators.js";var _r=class extends m{renderData(a){let e=a.arrows??[];return Kr`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(r=>this.renderArrow(r))}</div>${a.confident===!1?Kr`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof a.confidenceMarginDeg=="number"?` (within ${a.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:tt}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return Kr`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?Kr`<span class="layer">${a.layer}</span>`:tt} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?Kr`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}</span>`:tt}</div>`}renderEmpty(){return Kr`<div class="roxy-empty" role="status">No variables data</div>`}};_r.styles=[g,sn`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,1fr);display:grid}.arrow{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-xs,.25rem);display:grid}.arrow-head{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:1.75rem;line-height:1}.name{font-weight:var(--roxy-weight-bold,600)}.layer{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.labels{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.ctb{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.note{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-warning-fg,#9a3412)}@container (width<=28rem){.grid{grid-template-columns:1fr}}`],_r=d([on("roxy-hd-variables")],_r);import{css as nn,html as re,nothing as ye,svg as Ot}from"lit";import{customElement as ln,property as dn}from"lit/decorators.js";var pr=class extends m{constructor(){super(...arguments);this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}renderEmpty(){return re`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:r,lines:t,changingLinePositions:s,dailyMessage:o,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(s??[]);return re`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?re`<div class="symbol">${r.symbol}</div>`:ye}<div class="lines" aria-hidden="true">${l.slice().reverse().map((p,y)=>{let u=l.length-1-y+1,k=c.has(u),f=p===6||p===8;return re`<div class="line ${`${f?"broken":"solid"}${k?" changing":""}`}">${f?Ot`<span class="seg"></span><span class="seg"></span>`:Ot`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?re`${r.number}.`:ye}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?re`${r.chinese}`:ye} ${r.pinyin?re`· ${r.pinyin}`:ye}</p><div class="trigrams">${r.upperTrigram?re`<div>Upper <span class="tri-glyph">${qa[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:ye} ${r.lowerTrigram?re`<div>Lower <span class="tri-glyph">${qa[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:ye}</div>${r.judgment?re`<p class="judgment">${r.judgment}</p>`:ye} ${r.image?re`<p class="image">${r.image}</p>`:ye} ${o?re`<p class="message">${o}</p>`:ye} ${r.interpretation?.general?re`<p>${r.interpretation.general}</p>`:ye} ${c.size>0?re`<div class="changing">Changing lines: ${Array.from(c).sort((p,y)=>p-y).join(", ")}. ${i?.english?re`Becomes hexagram ${i.number} ${i.english}.`:ye}</div>`:ye}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,s=[];for(let o=0;o<6;o++){let i=t>>o&1;s.push(i?8:7)}return s}return Array.from({length:6},()=>7)}};pr.styles=[g,nn`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([dn({type:String,reflect:!0})],pr.prototype,"mode",2),pr=d([ln("roxy-hexagram")],pr);import{css as cn,html as Fr,nothing as st}from"lit";import{customElement as pn}from"lit/decorators.js";function jt(n){return n?String(n).slice(11,16)||String(n):""}var qr=class extends m{renderEmpty(){return Fr`<div class="roxy-empty" role="status">No hora data</div>`}renderData(a){let e=a.dayHoras??[],r=a.nightHoras??[];return e.length===0&&r.length===0?this.renderEmpty():Fr`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?Fr`<p class="subtitle">${a.date}</p>`:st}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?st:Fr`<div class="col"><p class="section-label">${a}</p>${e.map(r=>Fr`<div class="row"><span class="glyph" aria-hidden="true">${v[x(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${jt(r.start)}-${jt(r.end)}</span> ${typeof r.number=="number"?Fr`<span class="num">${r.number}</span>`:st}</div>`)}</div>`}};qr.styles=[g,cn`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.cols{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,1fr);display:grid}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-xs,.25rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);display:flex}.row:last-child{border-bottom:none}.glyph{color:var(--roxy-accent-ink,#b45309);text-align:center;width:1.25em;font-size:1.15em;line-height:1}.planet{flex:1;font-weight:500}.time{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;white-space:nowrap}.num{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right;width:1.5em}@container (width<=30rem){.cols{grid-template-columns:1fr}}`],qr=d([pn("roxy-hora-table")],qr);import{css as mn,html as q,nothing as oe}from"lit";import{customElement as gn,property as yn}from"lit/decorators.js";var mr=class extends m{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return q`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?J[x(r)]??"":"",s="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,o="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return q`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${o?q`<div class="date">${o}</div>`:oe}</div>${s!==null?q`<span class="energy" aria-label="${`Energy ${s} of 10`}">Energy ${s}/10 <span class="energy-bar"><span style="width:${s/10*100}%"></span></span></span>`:oe}</header>${e.overview?q`<p class="overview">${e.overview}</p>`:oe}<div class="sections">${e.love?q`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:oe} ${e.career?q`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:oe} ${e.health?q`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:oe} ${e.finance?q`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:oe} ${"advice"in e&&e.advice?q`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:oe}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],y=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&p.length===0&&y.length===0?oe:q`<div class="lucky">${i!==void 0?q`<span>Lucky number <strong>${i}</strong></span>`:oe} ${l?q`<span>Lucky color <strong>${l}</strong></span>`:oe} ${c.length?q`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:oe} ${p.length?q`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:oe} ${y.length?q`<span class="compat-wrap">Best with <span class="compat">${y.map(u=>q`<span>${u}</span>`)}</span></span>`:oe}</div>`})()}</article>`}};mr.styles=[g,mn`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([yn({type:String,reflect:!0})],mr.prototype,"period",2),mr=d([gn("roxy-horoscope-card")],mr);import{css as un,html as Y,nothing as gr}from"lit";import{customElement as xn,state as hn}from"lit/decorators.js";var yr=class extends m{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(s=>({name:s.planet,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,kpNumber:s.kpNumber,retrograde:s.retrograde})),t=e.nodes;for(let[s,o]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])o&&r.push({name:s,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}renderEmpty(){return Y`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return Y`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?Y`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?Y`· ${r.nakshatra}`:gr} ${r.subLord?Y`· sub lord ${r.subLord}`:gr} ${typeof r.kpNumber=="number"?Y`· KP ${r.kpNumber}`:gr}</div>`:gr} ${typeof e.meta?.ayanamsa=="number"?Y`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${h(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?Y`· ${e.meta.houseSystem} houses`:gr}</div>`:gr}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>Y`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?Y`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>Y`<tr><td class="body">${r.name}${r.retrograde?Y`<span class="retro">R</span>`:gr}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:Y`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?Y`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>Y`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:Y`<p class="roxy-empty" role="status">No cusps</p>`}};yr.styles=[g,un`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);width:100%;overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([hn()],yr.prototype,"activeTab",2),yr=d([xn("roxy-kp-chart")],yr);import{css as fn,html as xa,nothing as Bt}from"lit";import{customElement as bn}from"lit/decorators.js";var Vr=class extends m{renderEmpty(){return xa`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return xa`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?xa`<span class="ayanamsa">Ayanamsa: ${h(a.ayanamsa,2)}°</span>`:Bt}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>xa`<tr><td class="planet">${r.planet} ${r.retrograde?xa`<span class="retro">R</span>`:Bt}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Vr.styles=[g,fn`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],Vr=d([bn("roxy-kp-planets-table")],Vr);import{css as vn,html as ur,nothing as ot}from"lit";import{customElement as $n}from"lit/decorators.js";var Yr=class extends m{renderEmpty(){return ur`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return ur`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?ur`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:ot}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${a.moonSignLord??""}</dd><dt>Star lord</dt><dd>${a.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${a.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${a.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${a.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${a.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.lagnaSubSublord??""}</dd></dl></div></div>${a.rulingPlanets?.length?ur`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>ur`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:ot} ${e.length?ur`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${e.map(r=>ur`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:ot}</div>`}};Yr.styles=[g,vn`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],Yr=d([$n("roxy-kp-ruling-planets")],Yr);import{css as wn,html as Ur,LitElement as kn,nothing as Kt}from"lit";import{customElement as Sn,property as ha,state as fa}from"lit/decorators.js";function It(n,a){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...t)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var U=class extends kn{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=It(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let s={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let o=this.publishableKey??this.apiKey;o&&(s["X-API-Key"]=o);let i=await fetch(t,{headers:s,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return Ur`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?Ur`<span class="spinner" role="status" aria-label="Loading"></span>`:Kt} ${this.isOpen?Ur`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?Ur`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>Ur`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?Ur`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:Kt}</div>`}};U.styles=[g,wn`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([ha({type:String,attribute:"api-key"})],U.prototype,"apiKey",2),d([ha({type:String,attribute:"publishable-key"})],U.prototype,"publishableKey",2),d([ha({type:String})],U.prototype,"endpoint",2),d([ha({type:String})],U.prototype,"placeholder",2),d([ha({type:String,attribute:"default-value"})],U.prototype,"defaultValue",2),d([fa()],U.prototype,"query",2),d([fa()],U.prototype,"results",2),d([fa()],U.prototype,"isOpen",2),d([fa()],U.prototype,"isLoading",2),d([fa()],U.prototype,"highlight",2),U=d([Sn("roxy-location-search")],U);import{css as Rn,html as ue,nothing as Ye}from"lit";import{customElement as Cn,property as Tn}from"lit/decorators.js";var xr=class extends m{constructor(){super(...arguments);this.mode="current"}renderEmpty(){return ue`<div class="roxy-empty" role="status">No moon phase data</div>`}renderData(e){let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,s="year"in e?e.year:void 0;return ue`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${s??""}</h2><div class="list" role="list">${r.map(o=>this.renderListItem(o))}</div></article>`}return"phase"in e?this.renderSingle(e):Ye}renderSingle(e){let r=_t(e.phase);return ue`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?ue`<div class="date">${e.date}</div>`:Ye}</div></div><div class="stats">${typeof e.illumination=="number"?ue`<div><span>Illumination</span> <strong>${En(e.illumination)}</strong></div>`:Ye} ${typeof e.age=="number"?ue`<div><span>Age</span> <strong>${h(e.age,1)} days</strong></div>`:Ye} ${e.sign?ue`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:Ye} ${typeof e.distance=="number"?ue`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:Ye}</div>${e.meaning?.description?ue`<p class="meaning">${e.meaning.description}</p>`:Ye} ${e.meaning?.keywords?.length?ue`<div class="keywords">${e.meaning.keywords.map(t=>ue`<span>${t}</span>`)}</div>`:Ye}</article>`}renderListItem(e){let r=_t(e.phase);return ue`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};xr.styles=[g,Rn`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([Tn({type:String,reflect:!0})],xr.prototype,"mode",2),xr=d([Cn("roxy-moon-phase")],xr);function _t(n){return n?$t[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function En(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}import{css as Dn,html as xe,nothing as ze}from"lit";import{customElement as Pn}from"lit/decorators.js";var Wr=class extends m{renderData(a){let e=a.remedies;return xe`<article class="wrap" aria-label="${`Nakshatra ${a.name}`}"><header class="head"><h2 class="name">${a.name}</h2>${typeof a.number=="number"?xe`<span class="number">Nakshatra ${a.number} of 27</span>`:ze} ${a.range?xe`<span class="range">${a.range}</span>`:ze}</header><dl class="facts">${a.lord?xe`<div class="fact"><dt>Lord</dt><dd>${a.lord}</dd></div>`:ze} ${a.deity?xe`<div class="fact"><dt>Deity</dt><dd>${a.deity}</dd></div>`:ze} ${a.symbol?xe`<div class="fact"><dt>Symbol</dt><dd>${a.symbol}</dd></div>`:ze}</dl>${a.characteristics?xe`<div class="section"><h3>Characteristics</h3><p>${a.characteristics}</p></div>`:ze} ${e?xe`<div class="section"><h3>Remedies</h3><div class="remedies">${e.mantras?xe`<div class="remedy"><strong>Mantras:</strong> ${e.mantras}</div>`:ze} ${e.gemstones?xe`<div class="remedy"><strong>Gemstones:</strong> ${e.gemstones}</div>`:ze} ${e.rituals?xe`<div class="remedy"><strong>Rituals:</strong> ${e.rituals}</div>`:ze}</div></div>`:ze}</article>`}renderEmpty(){return xe`<div class="roxy-empty" role="status">No nakshatra data</div>`}};Wr.styles=[g,Dn`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],Wr=d([Pn("roxy-nakshatra-card")],Wr);import{css as zn,html as $,nothing as _,svg as ke}from"lit";import{customElement as An,property as Nn,state as Ln}from"lit/decorators.js";var it=420,b=it/2,Jr=164,nt=146,ba=120,Xr=96,Mn=178,Gn=196,Ue=class extends m{constructor(){super(...arguments);this.houseSystem="placidus";this.view="wheel"}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}renderEmpty(){return $`<div class="roxy-empty" role="status">No chart data</div>`}renderData(e){let r=this.getPlanets(),t=e.aspects??[],s=this.view;return $`<div class="wrap"><header><h2 class="title">Natal chart</h2>${e.birthDetails?$`<div class="meta">${[e.birthDetails.date,e.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:_}</header>${Ar({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:s,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${s}" role="tabpanel" aria-labelledby="natal-tab-${s}">${s==="wheel"?this.renderWheel(r,t):this.renderAspectGrid(r,t)}</div><div class="legend"><span>${r.length} planets</span> <span>${t.length} aspects</span> ${e.houseSystem?$`<span>${e.houseSystem} houses</span>`:_} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return $`<svg viewBox="0 0 ${it} ${it}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${b}" cy="${b}" r="${Jr}" stroke-width="1.5"/><circle class="wheel-line" cx="${b}" cy="${b}" r="${nt-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${b}" cy="${b}" r="${ba}" stroke-width="1"/><circle class="wheel-line" cx="${b}" cy="${b}" r="${Xr-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(o=>x(o.name)),s=new Map;for(let o of r){let i=[x(o.planet1),x(o.planet2)].sort().join("|");s.set(i,o)}return t.length===0?$`<p class="roxy-empty" role="status">No planets to grid</p>`:$`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(o=>{let i=v[o]??o.slice(0,2);return $`<th scope="col" title="${o}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((o,i)=>{let l=v[o]??o.slice(0,2);return $`<tr><th scope="row" title="${o}">${l}</th>${t.slice(0,i+1).map(c=>{let p=s.get([o,c].sort().join("|"));if(!p)return $`<td class="empty"></td>`;let y=Tr(p),u=da[y]??da[y.replace(/-/g,"")]??y.slice(0,3),k=er[y]??"aspect-other",f=h(p.orb,1);return $`<td class="${`cell ${k}`}" title="${`${o} ${y} ${c}${f?` (orb ${f}\xB0)`:""}`}"><span class="asp">${u}</span></td>`})} ${t.slice(i+1,-1).map(()=>$`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Za(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Za(r),"IC")));let s=this.data?.partOfFortune?.longitude;typeof s=="number"&&t.push(this.renderAngleMark(Ee(s),"PoF"));let o=this.data?.vertex?.longitude;return typeof o=="number"&&t.push(this.renderAngleMark(Ee(o),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),s=S(b,b,Jr,t),o=S(b,b,Mn,t),i=S(b,b,Gn,t);return ke`
77
77
  <g>
78
- <line class="angle-tick" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />
78
+ <line class="angle-tick" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />
79
79
  <text class="angle-marker" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r}</text>
80
80
  </g>
81
- `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,a)=>this.getAscendant()+a*30)).map(t=>{let a=this.toAngle(t),s=k(b,b,Gr,a),i=k(b,b,wr,a);return me`<line class="wheel-line" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return G.map((e,r)=>{let t=this.toAngle(r*30+15),a=k(b,b,ut,t);return me`<text class="sign-glyph" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${Y[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,a)=>{let s=e[(a+1)%12],i=It(t.longitude,s?s.longitude:t.longitude+30),l=k(b,b,Gr-12,this.toAngle(i));return me`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,a)=>{let s=this.toAngle(a*30+15),i=k(b,b,Gr-12,s),l=(a-r+12)%12+1;return me`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),a=r%30===0,s=a?ut-14:wr-5,i=k(b,b,s,t),l=k(b,b,wr,t);e.push(me`<line class=${a?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${a?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?H:e.map(r=>{let t=this.toAngle(r.longitude),a=k(b,b,Gr+9,t),s=he(r.longitude);return me`<text class="cusp-deg" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${s.degree}°${String(s.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(s=>Number.isFinite(s.longitude)).map(s=>({p:s,trueLon:ue(s.longitude),displayLon:ue(s.longitude)})).sort((s,i)=>s.trueLon-i.trueLon);for(let s=1;s<t.length;s++){let i=t[s-1],l=t[s];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let a=t[t.length-1];if(a&&a.displayLon>360){let s=a.displayLon-360;for(let i of t)i.displayLon-=s}return t.map(({p:s,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),m=this.toAngle(l),p=k(b,b,kr,m),y=k(b,b,kr-13,m),v=k(b,b,wr-4,c),h=k(b,b,kr+8,m),Xe=C[x(s.name)]??s.name.slice(0,2),Hr=he(s.longitude),Lr=s.isRetrograde===!0,Ir=`${Hr.degree}\xB0${String(Hr.minute).padStart(2,"0")}'`,jr=Math.abs(l-i)>.5;return me`<g>
82
- ${jr?me`<line class="planet-leader" x1=${v.x} y1=${v.y} x2=${h.x} y2=${h.y} />`:H}
83
- <text class="planet-glyph" x=${p.x} y=${p.y} text-anchor="middle" dominant-baseline="central"><title>${s.name}${Lr?" retrograde":""} - ${Ir} ${s.sign??""}</title>${Xe}</text>
84
- <text class="planet-deg" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">${Ir}${Lr?me`<tspan class="retro"> ℞</tspan>`:H}</text>
85
- </g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return H;let t=e?.retrogradePlanets??[];return $`<div class="details">${e?.dominantElement||e?.dominantModality?$`<div class="pill-row">${e.dominantElement?$`<span class="pill">Dominant element: ${e.dominantElement}</span>`:H} ${e.dominantModality?$`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:H}</div>`:H} ${r?$`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:H} ${t.length>0?$`<div class="pill-row">${t.map(a=>{let s=C[a]??a.slice(0,2);return $`<span class="pill pill--muted">${s} ${a} R</span>`})}</div>`:H} ${r?.summary?$`<p class="summary">${r.summary}</p>`:H} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return H;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],a=G,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=a.indexOf(x(i.sign??""));if(l<0)continue;let c=r[l%4],m=t[l%3],p=C[x(i.name)]??x(i.name).slice(0,2);s[c]?.[m]?.push(p)}return $`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>$`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,m)=>c+(s[i]?.[m]?.length??0),0);return $`<tr><th scope="row">${i}</th>${t.map(c=>$`<td>${(s[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>$`<td class="em-total">${r.reduce((l,c)=>l+(s[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?H:$`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let a=r.interpretation,s=C[x(r.name)]??"",i=f(r.degree??0,1);return $`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${s} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${ve()}</span></summary><div class="interp-body">${a.summary?$`<p class="interp-summary">${a.summary}</p>`:H} ${a.detailed?$`<p class="interp-detail">${a.detailed}</p>`:H} ${a.keywords?.length?$`<div class="interp-keywords">${a.keywords.map(l=>$`<span class="kw">${l}</span>`)}</div>`:H}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let a of e){if(typeof a.longitude!="number")continue;let s=x(a.name);s&&t.set(s,a.longitude)}return r.map(a=>{let s=t.get(x(a.planet1)),i=t.get(x(a.planet2));if(s===void 0||i===void 0)return H;let l=k(b,b,kr-18,this.toAngle(s)),c=k(b,b,kr-18,this.toAngle(i)),m=hr(a),p=tr[m]??"aspect-other",y=f(a.orb,1);return me`<line class=${`aspect ${p}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${a.planet1} ${m||""} ${a.planet2}${y?` (orb ${y}\xB0)`:""}</title></line>`})}};Ce.styles=[g,Me,$r,To`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([Zt({attribute:!1})],Ce.prototype,"data",2),d([Zt({type:String,attribute:"house-system",reflect:!0})],Ce.prototype,"houseSystem",2),d([Eo()],Ce.prototype,"view",2),Ce=d([Ao("roxy-natal-chart")],Ce);import{css as Mo,html as I,LitElement as Do,nothing as ne}from"lit";import{customElement as Go,property as ea}from"lit/decorators.js";var _e=class extends Do{constructor(){super();this.data=null;this.type="life-path";new u(this)}render(){let e=this.data;if(!e)return I`<div class="roxy-empty" role="status">No numerology data</div>`;let r=Oo[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return I`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?I`<div class="numeral">${e.number}</div>`:ne}<div><p class="label">${r}</p>${e.meaning?.title?I`<h2 class="title">${e.meaning.title}</h2>`:ne}</div></div>${e.meaning?.description?I`<p class="meaning">${e.meaning.description}</p>`:ne} ${e.calculation?I`<pre class="calc">${e.calculation}</pre>`:ne} ${t.length>0?I`<div class="chips">${t.map(a=>I`<span>${a}</span>`)}</div>`:ne} ${e.hasKarmicDebt&&e.karmicDebtNumber?I`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Ho(e.karmicDebtMeaning)}</div>`:ne}</article>`}renderPersonalYear(e,r){return I`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?I`<div class="numeral">${e.personalYear}</div>`:ne}<div><p class="label">${r}</p>${e.theme?I`<h2 class="title">${e.theme}</h2>`:ne}</div></div>${e.forecast?I`<p class="meaning">${e.forecast}</p>`:ne} ${e.advice?I`<p>${e.advice}</p>`:ne}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,a])=>a!=null);return I`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?I`<h2 class="title">${e.profile.name}</h2>`:ne}</div>${t.length>0?I`<div class="cores">${t.map(([a,s])=>I`<div class="item"><span>${de(a)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:ne}</article>`}};_e.styles=[g,Mo`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([ea({attribute:!1})],_e.prototype,"data",2),d([ea({type:String,reflect:!0})],_e.prototype,"type",2),_e=d([Go("roxy-numerology-card")],_e);var Oo={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Ho(o){return o?[o.description,o.challenge,o.resolution].filter(Boolean).join(" "):""}import{css as Io,html as ie,LitElement as jo,nothing as Ke}from"lit";import{customElement as Bo,property as ra}from"lit/decorators.js";var Ye=class extends jo{constructor(){super();this.data=null;this.detail="detailed";new u(this)}render(){let e=this.data;if(!e)return ie`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let a=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(p=>!!p[1]):[],s=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],m=r&&"transitions"in r?r.transitions:void 0;return ie`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?Ae(r.date):""}</span></header><table><tbody>${t.map(([p,y])=>ie`<tr><th>${p}</th><td>${y}</td></tr>`)} ${r?.sunrise?ie`<tr><th>Sunrise</th><td>${ye(r.sunrise)}</td></tr>`:Ke} ${r?.sunset?ie`<tr><th>Sunset</th><td>${ye(r.sunset)}</td></tr>`:Ke} ${r?.moonrise?ie`<tr><th>Moonrise</th><td>${ye(r.moonrise)}</td></tr>`:Ke} ${r?.moonset?ie`<tr><th>Moonset</th><td>${ye(r.moonset)}</td></tr>`:Ke} ${a.map(([p,y])=>ie`<tr><th>${p}</th><td>${y}</td></tr>`)}</tbody></table>${m?ie`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",m.tithi)} ${this.renderTransitionRow("Nakshatra",m.nakshatra)} ${this.renderTransitionRow("Yoga",m.yoga)} ${this.renderTransitionRow("Karana",m.karana)}</tbody></table>`:Ke} ${this.detail==="detailed"&&(s.some(p=>!!p[1])||i.length>0||l.some(p=>!!p[1])||c.length>0)?ie`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...s.filter(p=>!!p[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(p=>!!p[1]),...c])}</tbody></table>`:Ke}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let a=dt(t);return a?ie`<tr><th>${r}</th><td>${a}</td></tr>`:Ke})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,a)=>[r.length>1?`${e} ${a+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return Ke;let t=ye(r.endsAt),a=r.next?` \u2192 ${r.next}`:"";return ie`<tr><th>${e}</th><td>ends ${t}${a}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=dt(e);return r?`${e.current} (${r})`:e.current}};Ye.styles=[g,Io`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([ra({attribute:!1})],Ye.prototype,"data",2),d([ra({type:String,reflect:!0})],Ye.prototype,"detail",2),Ye=d([Bo("roxy-panchang-table")],Ye);import{css as _o,html as Sr,LitElement as Ko,nothing as xt}from"lit";import{customElement as Yo,property as qo}from"lit/decorators.js";var ft=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],pr=class extends Ko{constructor(){super();this.data=null;new u(this)}render(){if(!this.data?.planets?.length)return Sr`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return Sr`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${ft.map(r=>Sr`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=C[x(e.planet)]??"",t=ft.map(m=>Math.max(0,e[m.key])),a=t.reduce((m,p)=>m+p,0),s=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,i=s?"adequacy-badge--adequate":"adequacy-badge--weak",l=s?"adequate":"weak",c=f(e.totalRupas,2)&&f(e.minRequired,2)?`${f(e.totalRupas,2)} / ${f(e.minRequired,2)} R`:"";return Sr`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${r}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${a>0?ft.map((m,p)=>{let y=t[p];if(y<=0)return xt;let v=y/a*100;return Sr`<div class="bar-segment" style="flex-grow:${v};background:${m.color}" title="${m.label}: ${f(y,1)}"></div>`}):xt}</div></div><div class="pills">${c?Sr`<span class="rupas-label">${c}</span>`:xt} <span class="${`adequacy-badge ${i}`}">${l}</span></div></div>`}};pr.styles=[g,_o`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],d([qo({attribute:!1})],pr.prototype,"data",2),pr=d([Yo("roxy-shadbala-table")],pr);import{css as Vo,html as N,LitElement as Fo,nothing as W,svg as Cr}from"lit";import{customElement as Uo,property as Wo}from"lit/decorators.js";var $t=360,P=$t/2,bt=170,Jo=154,vt=124,Pr=96,mr=class extends Fo{constructor(){super();this.data=null;new u(this)}render(){if(!this.data)return N`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:a}=this.data,s=this.data.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,m=a?.overall,p=a?.strengths??[],y=a?.challenges??[];return i.length>0&&l.length>0?N`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?N`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:W}</div><svg viewBox="0 0 ${$t} ${$t}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${P}" cy="${P}" r="${bt}" stroke-width="1.5"/><circle class="wheel-line" cx="${P}" cy="${P}" r="${Pr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${P}" cy="${P}" r="${Pr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,s)} ${this.renderRing(i,vt,"p1",1)} ${this.renderRing(l,Pr,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${m?N`<p class="summary">${m}</p>`:W} ${s.length>0?this.renderAspects(s):W} ${p.length>0||y.length>0?N`<div class="lists">${p.length?N`<div><h3>Strengths</h3><ul>${p.map(h=>N`<li>${h}</li>`)}</ul></div>`:W} ${y.length?N`<div><h3>Challenges</h3><ul>${y.map(h=>N`<li>${h}</li>`)}</ul></div>`:W}</div>`:W}</div>`:N`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?N`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:W}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code>&lt;roxy-data></code> fallback.</div>${m?N`<p class="summary">${m}</p>`:W} ${s.length>0?this.renderAspects(s):W} ${p.length>0||y.length>0?N`<div class="lists">${p.length?N`<div><h3>Strengths</h3><ul>${p.map(h=>N`<li>${h}</li>`)}</ul></div>`:W} ${y.length?N`<div><h3>Challenges</h3><ul>${y.map(h=>N`<li>${h}</li>`)}</ul></div>`:W}</div>`:W}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),a=k(P,P,Pr-14,t),s=k(P,P,bt,t);return Cr`<line class="wheel-line" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return G.map((e,r)=>{let t=this.toAngle(r*30+15),a=k(P,P,Jo,t);return Cr`<text class="sign" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${Y[e]}</text>`})}renderRing(e,r,t,a){return e.map(s=>{if(!Number.isFinite(s.longitude))return W;let i=this.toAngle(s.longitude),l=k(P,P,r,i),m=k(P,P,r+(a===1?-12:-10),i),p=C[x(s.name)]??s.name.slice(0,2),y=he(s.longitude),v=s.isRetrograde===!0,h=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,Xe=`${s.name}${v?" retrograde":""} - ${h} ${y.sign}`;return Cr`<g>
86
- <text class=${t} x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central"><title>${Xe}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${a}</tspan></text>
87
- <text class="planet-deg" x=${m.x} y=${m.y} text-anchor="middle" dominant-baseline="central">${y.degree}°${v?Cr`<tspan class="retro"> ℞</tspan>`:W}</text>
88
- </g>`})}renderAscendants(e){let r=[],t=(a,s)=>{if(!a)return;let i=G.findIndex(v=>v.toLowerCase()===a.sign.toLowerCase());if(i===-1)return;let l=i*30+a.degree,c=this.toAngle(l),m=s===1?vt+14:Pr+14,p=k(P,P,m,c),y=k(P,P,bt+14,c);r.push(Cr`<g>
81
+ `}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,s)=>this.getAscendant()+s*30)).map(t=>{let s=this.toAngle(t),o=S(b,b,ba,s),i=S(b,b,Jr,s);return ke`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return I.map((e,r)=>{let t=this.toAngle(r*30+15),s=S(b,b,nt,t);return ke`<text class="sign-glyph" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${J[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,s)=>{let o=e[(s+1)%12],i=At(t.longitude,o?o.longitude:t.longitude+30),l=S(b,b,ba-12,this.toAngle(i));return ke`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,s)=>{let o=this.toAngle(s*30+15),i=S(b,b,ba-12,o),l=(s-r+12)%12+1;return ke`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),s=r%30===0,o=s?nt-14:Jr-5,i=S(b,b,o,t),l=S(b,b,Jr,t);e.push(ke`<line class=${s?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${s?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?_:e.map(r=>{let t=this.toAngle(r.longitude),s=S(b,b,ba+9,t),o=De(r.longitude);return ke`<text class="cusp-deg" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${o.degree}°${String(o.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(o=>Number.isFinite(o.longitude)).map(o=>({p:o,trueLon:Ee(o.longitude),displayLon:Ee(o.longitude)})).sort((o,i)=>o.trueLon-i.trueLon);for(let o=1;o<t.length;o++){let i=t[o-1],l=t[o];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let s=t[t.length-1];if(s&&s.displayLon>360){let o=s.displayLon-360;for(let i of t)i.displayLon-=o}return t.map(({p:o,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),p=this.toAngle(l),y=S(b,b,Xr,p),u=S(b,b,Xr-13,p),k=S(b,b,Jr-4,c),f=S(b,b,Xr+8,p),Xe=v[x(o.name)]??o.name.slice(0,2),fe=De(o.longitude),ia=o.isRetrograde===!0,ka=`${fe.degree}\xB0${String(fe.minute).padStart(2,"0")}'`,Sa=Math.abs(l-i)>.5;return ke`<g>
82
+ ${Sa?ke`<line class="planet-leader" x1=${k.x} y1=${k.y} x2=${f.x} y2=${f.y} />`:_}
83
+ <text class="planet-glyph" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}${ia?" retrograde":""} - ${ka} ${o.sign??""}</title>${Xe}</text>
84
+ <text class="planet-deg" x=${u.x} y=${u.y} text-anchor="middle" dominant-baseline="central">${ka}${ia?ke`<tspan class="retro"> ℞</tspan>`:_}</text>
85
+ </g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return _;let t=e?.retrogradePlanets??[];return $`<div class="details">${e?.dominantElement||e?.dominantModality?$`<div class="pill-row">${e.dominantElement?$`<span class="pill">Dominant element: ${e.dominantElement}</span>`:_} ${e.dominantModality?$`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:_}</div>`:_} ${r?$`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:_} ${t.length>0?$`<div class="pill-row">${t.map(s=>{let o=v[s]??s.slice(0,2);return $`<span class="pill pill--muted">${o} ${s} R</span>`})}</div>`:_} ${r?.summary?$`<p class="summary">${r.summary}</p>`:_} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return _;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],s=I,o={};for(let i of r)o[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=s.indexOf(x(i.sign??""));if(l<0)continue;let c=r[l%4],p=t[l%3],y=v[x(i.name)]??x(i.name).slice(0,2);o[c]?.[p]?.push(y)}return $`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>$`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,p)=>c+(o[i]?.[p]?.length??0),0);return $`<tr><th scope="row">${i}</th>${t.map(c=>$`<td>${(o[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>$`<td class="em-total">${r.reduce((l,c)=>l+(o[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?_:$`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let s=r.interpretation,o=v[x(r.name)]??"",i=h(r.degree??0,1);return $`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${o} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${ce()}</span></summary><div class="interp-body">${s.summary?$`<p class="interp-summary">${s.summary}</p>`:_} ${s.detailed?$`<p class="interp-detail">${s.detailed}</p>`:_} ${s.keywords?.length?$`<div class="interp-keywords">${s.keywords.map(l=>$`<span class="kw">${l}</span>`)}</div>`:_}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let s of e){if(typeof s.longitude!="number")continue;let o=x(s.name);o&&t.set(o,s.longitude)}return r.map(s=>{let o=t.get(x(s.planet1)),i=t.get(x(s.planet2));if(o===void 0||i===void 0)return _;let l=S(b,b,Xr-18,this.toAngle(o)),c=S(b,b,Xr-18,this.toAngle(i)),p=Tr(s),y=er[p]??"aspect-other",u=h(s.orb,1);return ke`<line class=${`aspect ${y}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p||""} ${s.planet2}${u?` (orb ${u}\xB0)`:""}</title></line>`})}};Ue.styles=[g,qe,Ke,zn`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([Nn({type:String,attribute:"house-system",reflect:!0})],Ue.prototype,"houseSystem",2),d([Ln()],Ue.prototype,"view",2),Ue=d([An("roxy-natal-chart")],Ue);import{css as Hn,html as N,nothing as ae}from"lit";import{customElement as On,property as jn}from"lit/decorators.js";var hr=class extends m{constructor(){super(...arguments);this.type="life-path"}renderData(e){let r=Bn[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalDay"in e?this.renderPeriod(r,e.personalDay,e.theme,e.guidance):"personalMonth"in e?this.renderPeriod(r,e.personalMonth,e.theme,e.focus):"personalYear"in e?this.renderPersonalYear(e,r):"dailyMessage"in e?this.renderPeriod(r,e.number,e.meaning?.title,e.dailyMessage):this.renderNumberCard(e,r)}renderPeriod(e,r,t,s){return N`<article class="card" aria-label="${e}"><div class="hero">${typeof r=="number"?N`<div class="numeral">${r}</div>`:ae}<div><p class="label">${e}</p>${t?N`<h2 class="title">${t}</h2>`:ae}</div></div>${s?N`<p class="meaning">${s}</p>`:ae}</article>`}renderEmpty(){return N`<div class="roxy-empty" role="status">No numerology data</div>`}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return N`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?N`<div class="numeral">${e.number}</div>`:ae}<div><p class="label">${r}</p>${e.meaning?.title?N`<h2 class="title">${e.meaning.title}</h2>`:ae}</div></div>${e.meaning?.description?N`<p class="meaning">${e.meaning.description}</p>`:ae} ${e.calculation?N`<pre class="calc">${e.calculation}</pre>`:ae} ${t.length>0?N`<div class="chips">${t.map(s=>N`<span>${s}</span>`)}</div>`:ae} ${e.hasKarmicDebt&&e.karmicDebtNumber?N`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${In(e.karmicDebtMeaning)}</div>`:ae}</article>`}renderPersonalYear(e,r){return N`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?N`<div class="numeral">${e.personalYear}</div>`:ae}<div><p class="label">${r}</p>${e.theme?N`<h2 class="title">${e.theme}</h2>`:ae}</div></div>${e.forecast?N`<p class="meaning">${e.forecast}</p>`:ae} ${e.advice?N`<p>${e.advice}</p>`:ae}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,s])=>s!=null);return N`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?N`<h2 class="title">${e.profile.name}</h2>`:ae}</div>${t.length>0?N`<div class="cores">${t.map(([s,o])=>N`<div class="item"><span>${D(s)}</span> <strong>${o.number??""}</strong></div>`)}</div>`:ae}</article>`}};hr.styles=[g,Hn`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([jn({type:String,reflect:!0})],hr.prototype,"type",2),hr=d([On("roxy-numerology-card")],hr);var Bn={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","birth-day":"Birth Day",maturity:"Maturity",daily:"Daily Number","personal-day":"Personal Day","personal-month":"Personal Month","personal-year":"Personal Year",chart:"Numerology chart"};function In(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}import{css as Kn,html as he,nothing as We}from"lit";import{customElement as _n,property as Fn}from"lit/decorators.js";var fr=class extends m{constructor(){super(...arguments);this.detail="detailed"}renderEmpty(){return he`<div class="roxy-empty" role="status">No panchang data</div>`}renderData(e){let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let s=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(y=>!!y[1]):[],o=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],p=r&&"transitions"in r?r.transitions:void 0;return he`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?pe(r.date):""}</span></header><table><tbody>${t.map(([y,u])=>he`<tr><th>${y}</th><td>${u}</td></tr>`)} ${r?.sunrise?he`<tr><th>Sunrise</th><td>${Ce(r.sunrise)}</td></tr>`:We} ${r?.sunset?he`<tr><th>Sunset</th><td>${Ce(r.sunset)}</td></tr>`:We} ${r?.moonrise?he`<tr><th>Moonrise</th><td>${Ce(r.moonrise)}</td></tr>`:We} ${r?.moonset?he`<tr><th>Moonset</th><td>${Ce(r.moonset)}</td></tr>`:We} ${s.map(([y,u])=>he`<tr><th>${y}</th><td>${u}</td></tr>`)}</tbody></table>${p?he`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",p.tithi)} ${this.renderTransitionRow("Nakshatra",p.nakshatra)} ${this.renderTransitionRow("Yoga",p.yoga)} ${this.renderTransitionRow("Karana",p.karana)}</tbody></table>`:We} ${this.detail==="detailed"&&(o.some(y=>!!y[1])||i.length>0||l.some(y=>!!y[1])||c.length>0)?he`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...o.filter(y=>!!y[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(y=>!!y[1]),...c])}</tbody></table>`:We}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let s=Va(t);return s?he`<tr><th>${r}</th><td>${s}</td></tr>`:We})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,s)=>[r.length>1?`${e} ${s+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return We;let t=Ce(r.endsAt),s=r.next?` \u2192 ${r.next}`:"";return he`<tr><th>${e}</th><td>ends ${t}${s}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=Va(e);return r?`${e.current} (${r})`:e.current}};fr.styles=[g,Kn`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([Fn({type:String,reflect:!0})],fr.prototype,"detail",2),fr=d([_n("roxy-panchang-table")],fr);import{css as qn,html as Ae,nothing as lt}from"lit";import{customElement as Vn}from"lit/decorators.js";var Ft=["name","english","title"],Yn=new Set(["description","meaning","characteristics","tagline","definedMeaning","undefinedMeaning","motto"]),Un=new Set(["id","symbol","keywords",...Ft]),Zr=class extends m{renderData(a){let e=a,r=this.deriveTitle(e),t=typeof e.symbol=="string"?e.symbol:void 0,s=Array.isArray(e.keywords)?e.keywords.map(String):[],o=[],i=[],l=[];for(let[c,p]of Object.entries(e))if(!(Un.has(c)||p==null))if(Array.isArray(p)){let y=p.filter(u=>u!=null).map(String);y.length>0&&i.push([c,y])}else typeof p=="string"?Yn.has(c)||p.length>48?o.push([c,p]):l.push([c,p]):(typeof p=="number"||typeof p=="boolean")&&l.push([c,String(p)]);return Ae`<article class="card" aria-label="${r}"><header class="head">${t?Ae`<span class="symbol" aria-hidden="true">${t}</span>`:lt}<div><p class="label">Reference</p><h2 class="name">${r}</h2></div></header>${s.length>0?Ae`<div class="chips">${s.map(c=>Ae`<span>${c}</span>`)}</div>`:lt} ${o.map(([c,p])=>Ae`<p class="prose"><span class="prose-label">${D(c)}</span>${p}</p>`)} ${l.length>0?Ae`<div class="facts-wrap"><dl class="facts">${l.map(([c,p])=>Ae`<div class="fact"><dt>${D(c)}</dt><dd>${p}</dd></div>`)}</dl></div>`:lt} ${i.map(([c,p])=>Ae`<div class="list"><h3>${D(c)}</h3><div class="chips">${p.map(y=>Ae`<span>${y}</span>`)}</div></div>`)}</article>`}renderEmpty(){return Ae`<div class="roxy-empty" role="status">No reference data</div>`}deriveTitle(a){for(let t of Ft)if(typeof a[t]=="string")return a[t];let e=typeof a.type=="string"?D(a.type):"",r=a.number;return r!=null?`${e} ${r}`.trim():"Reference"}};Zr.styles=[g,qn`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.symbol{color:var(--roxy-accent-ink,#b45309);flex:none;font-size:2.5rem;line-height:1}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.prose{margin:0;line-height:1.6}.prose .prose-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px;display:block}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list h3,.facts-wrap h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));margin:0;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize}.fact dd{font-size:var(--roxy-text-sm,.875rem);margin:0}`],Zr=d([Vn("roxy-reference-card")],Zr);import{css as Wn,html as Qr,nothing as dt}from"lit";import{customElement as Jn}from"lit/decorators.js";var ct=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],ea=class extends m{renderEmpty(){return Qr`<div class="roxy-empty" role="status">No shadbala data</div>`}renderData(a){if(!a.planets?.length)return this.renderEmpty();let e=[...a.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return Qr`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${ct.map(r=>Qr`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(a){let e=v[x(a.planet)]??"",r=ct.map(c=>Math.max(0,a[c.key])),t=r.reduce((c,p)=>c+p,0),s=typeof a.strengthRatio=="number"&&a.strengthRatio>=1,o=s?"adequacy-badge--adequate":"adequacy-badge--weak",i=s?"adequate":"weak",l=h(a.totalRupas,2)&&h(a.minRequired,2)?`${h(a.totalRupas,2)} / ${h(a.minRequired,2)} R`:"";return Qr`<div class="planet-row" role="listitem" aria-label="${a.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${e}</span> ${a.planet} <span class="rank-badge" aria-label="rank ${a.relativeRank}">#${a.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${a.planet}">${t>0?ct.map((c,p)=>{let y=r[p];if(y<=0)return dt;let u=y/t*100;return Qr`<div class="bar-segment" style="flex-grow:${u};background:${c.color}" title="${c.label}: ${h(y,1)}"></div>`}):dt}</div></div><div class="pills">${l?Qr`<span class="rupas-label">${l}</span>`:dt} <span class="${`adequacy-badge ${o}`}">${i}</span></div></div>`}};ea.styles=[g,Wn`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],ea=d([Jn("roxy-shadbala-table")],ea);import{css as Xn,html as G,nothing as te,svg as ra}from"lit";import{customElement as Zn}from"lit/decorators.js";var gt=360,T=gt/2,pt=170,Qn=154,mt=124,aa=96,ta=class extends m{renderEmpty(){return G`<div class="roxy-empty" role="status">No synastry data</div>`}renderData(a){let{person1:e,person2:r,compatibilityScore:t,analysis:s}=a,o=a.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,p=s?.overall,y=s?.strengths??[],u=s?.challenges??[];return i.length>0&&l.length>0?G`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?G`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:te}</div><svg viewBox="0 0 ${gt} ${gt}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${T}" cy="${T}" r="${pt}" stroke-width="1.5"/><circle class="wheel-line" cx="${T}" cy="${T}" r="${aa+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${T}" cy="${T}" r="${aa-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,o)} ${this.renderRing(i,mt,"p1",1)} ${this.renderRing(l,aa,"p2",2)} ${this.renderAscendants(a)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${p?G`<p class="summary">${p}</p>`:te} ${o.length>0?this.renderAspects(o):te} ${y.length>0||u.length>0?G`<div class="lists">${y.length?G`<div><h3>Strengths</h3><ul>${y.map(f=>G`<li>${f}</li>`)}</ul></div>`:te} ${u.length?G`<div><h3>Challenges</h3><ul>${u.map(f=>G`<li>${f}</li>`)}</ul></div>`:te}</div>`:te}</div>`:G`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?G`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:te}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code>&lt;roxy-data></code> fallback.</div>${p?G`<p class="summary">${p}</p>`:te} ${o.length>0?this.renderAspects(o):te} ${y.length>0||u.length>0?G`<div class="lists">${y.length?G`<div><h3>Strengths</h3><ul>${y.map(f=>G`<li>${f}</li>`)}</ul></div>`:te} ${u.length?G`<div><h3>Challenges</h3><ul>${u.map(f=>G`<li>${f}</li>`)}</ul></div>`:te}</div>`:te}</div>`}toAngle(a){return 180-a}renderSpokes(){return Array.from({length:12},(a,e)=>{let r=this.toAngle(e*30),t=S(T,T,aa-14,r),s=S(T,T,pt,r);return ra`<line class="wheel-line" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return I.map((a,e)=>{let r=this.toAngle(e*30+15),t=S(T,T,Qn,r);return ra`<text class="sign" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${J[a]}</text>`})}renderRing(a,e,r,t){return a.map(s=>{if(!Number.isFinite(s.longitude))return te;let o=this.toAngle(s.longitude),i=S(T,T,e,o),c=S(T,T,e+(t===1?-12:-10),o),p=v[x(s.name)]??s.name.slice(0,2),y=De(s.longitude),u=s.isRetrograde===!0,k=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,f=`${s.name}${u?" retrograde":""} - ${k} ${y.sign}`;return ra`<g>
86
+ <text class=${r} x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central"><title>${f}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${t}</tspan></text>
87
+ <text class="planet-deg" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${y.degree}°${u?ra`<tspan class="retro"> ℞</tspan>`:te}</text>
88
+ </g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=I.findIndex(u=>u.toLowerCase()===t.sign.toLowerCase());if(o===-1)return;let i=o*30+t.degree,l=this.toAngle(i),c=s===1?mt+14:aa+14,p=S(T,T,c,l),y=S(T,T,pt+14,l);e.push(ra`<g>
89
89
  <line class="asc-tick" x1=${p.x} y1=${p.y} x2=${y.x} y2=${y.y} />
90
90
  <text class="asc-label" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
91
- </g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=x(i);for(let c of s)if(x(c.name)===l&&typeof c.longitude=="number")return c.longitude};return t.map(s=>{let i=a(e,s.planet1),l=a(r,s.planet2);if(i===void 0||l===void 0)return W;let c=k(P,P,vt-12,this.toAngle(i)),m=k(P,P,Pr+8,this.toAngle(l)),p=hr(s),y=tr[p]??"aspect-other",v=f(s.orb,1);return Cr`<line class=${`aspect ${y}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${s.planet1} ${p} ${s.planet2}${v?` (orb ${v}\xB0)`:""}</title></line>`})}renderAspects(e){return N`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(r=>N`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${hr(r)||""}</td><td class="orb">${f(r.orb,1)}</td><td>${Xo(r.strength)}</td></tr>`)}</tbody></table>`}};mr.styles=[g,Vo`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],d([Wo({attribute:!1})],mr.prototype,"data",2),mr=d([Uo("roxy-synastry-chart")],mr);function Xo(o){return typeof o=="number"?Math.round(o).toString():""}import{css as Qo,html as z,LitElement as Zo,nothing as $e}from"lit";import{customElement as en,property as rn,state as tn}from"lit/decorators.js";var qe=class extends Zo{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new u(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):z`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,a=r.keywords??[];return z`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?z`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:z`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?z`${r.arcana} arcana`:$e} ${t?z`· reversed`:$e}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?z`<p class="message">${e.dailyMessage}</p>`:$e} ${r.meaning?z`<p>${r.meaning}</p>`:$e} ${a.length>0?z`<div class="chips">${a.map(s=>z`<span>${s}</span>`)}</div>`:$e} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,a=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return z`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?z`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:z`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?z`${e.arcana} arcana`:$e} ${e.number!==void 0&&e.number!==null?z`· ${e.number}`:$e} ${r?z`· reversed`:$e}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?z`<p>${t.description}</p>`:$e} ${a.length>0?z`<div class="chips">${a.map(s=>z`<span>${s}</span>`)}</div>`:$e} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};qe.styles=[g,Qo`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([rn({attribute:!1})],qe.prototype,"data",2),d([tn()],qe.prototype,"flipped",2),qe=d([en("roxy-tarot-card")],qe);import{css as an,html as M,LitElement as sn,nothing as ge}from"lit";import{customElement as on,property as ta}from"lit/decorators.js";var Ve=class extends sn{constructor(){super();this.data=null;this.spread="three-card";new u(this)}render(){let e=this.data;if(!e)return M`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),a=t?[]:"positions"in e?e.positions??[]:[],s=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,p="summary"in e?e.summary:void 0,y=r?e.interpretation:void 0,v=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return M`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${m?M`<span class="question">"${m}"</span>`:ge}</header>${r?M`<div><span class="${`answer ${v}`}">${i}</span> ${l?M`<small>· ${l}</small>`:ge}</div>`:ge} ${a.length>0?M`<div class="grid">${a.map(h=>M`<div class="card"><p class="label">${h.name??""}</p><div class="image">${h.card?.imageUrl?M`<img src="${h.card.imageUrl}" alt="${h.card.name??"tarot card"}" class="${h.card.reversed?"reversed":""}">`:M`${h.card?.name??"?"}`}</div><p class="name">${h.card?.name??""} ${h.card?.reversed?M`<small>(reversed)</small>`:ge}</p>${h.interpretation?M`<p class="interp">${h.interpretation}</p>`:ge}</div>`)}</div>`:ge} ${s.length>0?M`<div class="grid">${s.map(h=>M`<div class="card"><div class="image">${h.imageUrl?M`<img src="${h.imageUrl}" alt="${h.name??"tarot card"}" class="${h.reversed?"reversed":""}">`:M`${h.name??"?"}`}</div><p class="name">${h.name??""} ${h.reversed?M`<small>(reversed)</small>`:ge}</p>${h.meaning?M`<p class="interp">${h.meaning}</p>`:ge}</div>`)}</div>`:ge} ${p?M`<p class="reading">${p}</p>`:ge} ${y?M`<p class="reading">${y}</p>`:ge}</article>`}};Ve.styles=[g,an`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([ta({attribute:!1})],Ve.prototype,"data",2),d([ta({type:String,reflect:!0})],Ve.prototype,"spread",2),Ve=d([on("roxy-tarot-spread")],Ve);import{css as nn,html as D,LitElement as ln,nothing as Fe}from"lit";import{customElement as dn,property as cn,state as pn}from"lit/decorators.js";var Ue=class extends ln{constructor(){super();this.data=null;this.tab="positions";new u(this)}render(){if(!this.data?.transitPlanets?.length)return D`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:a,summary:s}=this.data,i=[Ae(e),ye(r)].filter(Boolean).join(" "),l=a?.length??0,c=this.tab;return D`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${i?D`<p class="subtitle">${i}</p>`:Fe}</div>${l>0?D`${xr({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${l})`}],active:c,onSelect:m=>{this.tab=m},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?D`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:D`${s?this.renderSummaryPills(s):Fe}<div class="overflow-scroll">${this.renderAspectsList(a??[])}</div>`}</div>`:D`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return D`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return D`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=C[x(r.name)]??"",a=Y[x(r.sign)]??"",s=r.speed>=0?"\u2191":"\u2193";return D`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?D`<span class="retro-badge" aria-label="retrograde">R</span>`:Fe}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${r.sign}</div></td><td class="num">${f(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${f(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return D`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let a=C[x(r.transitPlanet)]??"",s=C[x(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),m=r.isApplying?"Applying":"Separating";return D`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${a}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${m} · orb ${f(r.orb,2)}° · strength ${f(r.strength,1)} </span>${ve()}</summary><div class="interp-body">${l?.summary?D`<p>${l.summary}</p>`:Fe} ${l?.impact?D`<p><strong>Impact:</strong> ${l.impact}</p>`:Fe} ${l?.timing?D`<p><strong>Timing:</strong> ${l.timing}</p>`:Fe} ${l?.guidance?D`<p><strong>Guidance:</strong> ${l.guidance}</p>`:Fe} ${l?.keywords?.length?D`<div class="interp-keywords">${l.keywords.map(p=>D`<span class="kw">${p}</span>`)}</div>`:Fe}</div></details>`})}</div>`}};Ue.styles=[g,Me,$r,nn`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([cn({attribute:!1})],Ue.prototype,"data",2),d([pn()],Ue.prototype,"tab",2),Ue=d([dn("roxy-transits-table")],Ue);import{html as aa,LitElement as mn}from"lit";import{customElement as gn,property as sa}from"lit/decorators.js";var We=class extends mn{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new u(this)}viewModel(){return this.data?.meta?Wr(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?aa`<div class="wrap"><div class="header"><h2 class="title">Vedic kundli</h2>${Xr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${Jr(e,this.chartStyle)}</svg></div>`:aa`<div class="roxy-empty" role="status">No kundli data</div>`}};We.styles=[g,Qr,Me],d([sa({attribute:!1})],We.prototype,"data",2),d([sa({type:String,reflect:!0,attribute:"chart-style"})],We.prototype,"chartStyle",2),We=d([gn("roxy-vedic-kundli")],We);import{css as yn,html as A,LitElement as un,nothing as re}from"lit";import{customElement as hn,property as xn}from"lit/decorators.js";var fn=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],gr=class extends un{constructor(){super();this.data=null;new u(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let a of fn){let s=e[a];s&&(t.push([a,s]),r.add(a))}for(let[a,s]of Object.entries(e))r.has(a)||t.push([a,s]);return t}render(){if(!this.data?.meta)return A`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return A`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let a=(t.graha??r)==="Lagna",s=C[x(t.graha??r)]??"",i=Y[x(t.rashi??"")]??"";return A`<tr class="${a?"lagna":""}"><td class="graha">${s?A`<span class="glyph">${s}</span>`:re}${t.graha??r}</td><td>${i?A`<span class="glyph">${i}</span>`:re}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Fr(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?A`<span class="retro">R</span>`:re}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?re:A`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${ve()}</summary><div class="panel-body">${e.map(r=>{let t=C[x(r.planet)]??"",a=f(r.distanceFromSun,2),s=f(r.orb,1);return A`<div class="condition"><span class="planet">${t?`${t} `:""}${r.planet}</span> <span class="detail">${a} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?re:A`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${ve()}</summary><div class="panel-body">${e.map(r=>{let t=f(r.distance,2);return A`<div class="condition"><span class="planet">${r.planet1} vs ${r.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${r.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},r=this.orderedRows().map(([t,a])=>[a.graha??t,e[a.graha??t]]).filter(([,t])=>t!=null);return r.length===0?re:A`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${ve()}</summary><div class="panel-body">${r.map(([t,a])=>{let s=C[x(t)]??"";return A`<div class="interp"><span class="planet">${s?`${s} `:""}${t}</span> ${a.rashi?A`<p><span class="label">Rashi.</span> ${a.rashi}</p>`:re} ${a.nakshatra?A`<p><span class="label">Nakshatra.</span> ${a.nakshatra}</p>`:re}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?re:A`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${ve()}</summary><div class="panel-body">${e.map(r=>A`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?A`<p class="desc">${r.description}</p>`:re}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?re:A`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${ve()}</summary><div class="panel-body">${e.map(r=>A`<div class="bhava"><span class="name">${r.name} ${r.quality?A`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:re}</span> ${r.result?A`<p class="desc">${r.result}</p>`:re}</div>`)}</div></details>`}};gr.styles=[g,$r,yn`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],d([xn({attribute:!1})],gr.prototype,"data",2),gr=d([hn("roxy-vedic-planets-table")],gr);import{css as bn,html as yr,LitElement as vn,nothing as tt}from"lit";import{customElement as $n,property as wn}from"lit/decorators.js";var ur=class extends vn{constructor(){super();this.data=null;new u(this)}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,a]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])a&&r.push({name:t,sign:a.sign,longitude:a.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return yr`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return yr`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=C[x(r.name)]??"",a=Y[x(r.sign??"")]??"",s=typeof r.speed=="number"?f(r.speed,3):"";return yr`<tr class="${r.isPoint?"point":""}"><td class="body">${t?yr`<span class="glyph">${t}</span>`:tt}${r.name}</td><td>${a?yr`<span class="glyph">${a}</span>`:tt}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Fr(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${s?yr`${s}°/day`:tt} ${r.isRetrograde?yr`<span class="retro">℞</span>`:tt}</td></tr>`})}</tbody></table></div>`}};ur.styles=[g,bn`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],d([wn({attribute:!1})],ur.prototype,"data",2),ur=d([$n("roxy-western-planets-table")],ur);import{css as kn,html as Q,LitElement as Sn,nothing as Or}from"lit";import{customElement as Cn,property as Pn,state as Ln}from"lit/decorators.js";var Je=class extends Sn{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new u(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Q`<span class="${r}">${e}</span>`}renderDetailCard(e){return Q`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Or}</p>${e.description?Q`<p class="description">${e.description}</p>`:Or} ${e.result?Q`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Or}</div>`}render(){if(!this.data)return Q`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return Q`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,m=r?c.filter(y=>y.name.toLowerCase().includes(r)):c,p=e.total;return Q`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${p!==void 0?Q`<span class="count">${p} total</span>`:Or}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${m.length>0?m.map(y=>this.renderDetailCard(y)):Q`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let s=t,i=r?s.filter(c=>c.name.toLowerCase().includes(r)):s,l=e.total;return Q`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Q`<span class="count">${l} total</span>`:Or}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>Q`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Q`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Q`<div class="roxy-empty" role="status">No yoga data</div>`}};Je.styles=[g,kn`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([Pn({attribute:!1})],Je.prototype,"data",2),d([Ln()],Je.prototype,"filter",2),Je=d([Cn("roxy-yoga-list")],Je);var wt=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,personal-year,chart}",docsSummary:"Life path, expression, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Tn="0.9.0";var Op=wt.map(o=>o.slug);export{wt as ROXY_COMPONENTS,Op as ROXY_UI_COMPONENTS,Tn as ROXY_UI_VERSION,Pe as RoxyAshtakavargaGrid,Le as RoxyBiorhythmChart,er as RoxyBodygraph,rr as RoxyChoghadiyaGrid,Ee as RoxyCompatibilityCard,Ne as RoxyDashaTimeline,ze as RoxyData,De as RoxyDivisionalChart,Ge as RoxyDoshaCard,F as RoxyEndpointForm,sr as RoxyForecastTimeline,or as RoxyGunaMilan,Oe as RoxyHexagram,He as RoxyHoroscopeCard,Ie as RoxyKpChart,ir as RoxyKpPlanetsTable,dr as RoxyKpRulingPlanets,K as RoxyLocationSearch,Be as RoxyMoonPhase,cr as RoxyNakshatraCard,Ce as RoxyNatalChart,_e as RoxyNumerologyCard,Ye as RoxyPanchangTable,pr as RoxyShadbalaTable,mr as RoxySynastryChart,qe as RoxyTarotCard,Ve as RoxyTarotSpread,Ue as RoxyTransitsTable,We as RoxyVedicKundli,gr as RoxyVedicPlanetsTable,ur as RoxyWesternPlanetsTable,Je as RoxyYogaList};
91
+ </g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=x(o);for(let l of s)if(x(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return te;let l=S(T,T,mt-12,this.toAngle(o)),c=S(T,T,aa+8,this.toAngle(i)),p=Tr(s),y=er[p]??"aspect-other",u=h(s.orb,1);return ra`<line class=${`aspect ${y}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p} ${s.planet2}${u?` (orb ${u}\xB0)`:""}</title></line>`})}renderAspects(a){return G`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(e=>G`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${Tr(e)||""}</td><td class="orb">${h(e.orb,1)}</td><td>${ei(e.strength)}</td></tr>`)}</tbody></table>`}};ta.styles=[g,Xn`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],ta=d([Zn("roxy-synastry-chart")],ta);function ei(n){return typeof n=="number"?Math.round(n).toString():""}import{css as ri,html as H,nothing as Ne}from"lit";import{customElement as ai,state as ti}from"lit/decorators.js";var br=class extends m{constructor(){super(...arguments);this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}renderEmpty(){return H`<div class="roxy-empty" role="status">No tarot data</div>`}renderData(e){return"card"in e?this.renderDailyCard(e):this.renderFullCard(e)}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,s=r.keywords??[];return H`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?H`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:H`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?H`${r.arcana} arcana`:Ne} ${t?H`· reversed`:Ne}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?H`<p class="message">${e.dailyMessage}</p>`:Ne} ${r.meaning?H`<p>${r.meaning}</p>`:Ne} ${s.length>0?H`<div class="chips">${s.map(o=>H`<span>${o}</span>`)}</div>`:Ne} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,s=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return H`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?H`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:H`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?H`${e.arcana} arcana`:Ne} ${e.number!==void 0&&e.number!==null?H`· ${e.number}`:Ne} ${r?H`· reversed`:Ne}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?H`<p>${t.description}</p>`:Ne} ${s.length>0?H`<div class="chips">${s.map(o=>H`<span>${o}</span>`)}</div>`:Ne} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};br.styles=[g,ri`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([ti()],br.prototype,"flipped",2),br=d([ai("roxy-tarot-card")],br);import{css as si,html as va}from"lit";import{customElement as oi,property as ni}from"lit/decorators.js";var vr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return va`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let r=e.cards??[];if(r.length===0)return this.renderEmpty();let t=this.heading||"Tarot deck",s=typeof e.total=="number"?e.total:r.length;return va`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"card":"cards"}</span></header><ul class="grid">${r.map(o=>va`<li class="tile">${o.imageUrl?va`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:va`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${ii(o)}</p></li>`)}</ul></section>`}};vr.styles=[g,si`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(7rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.art{aspect-ratio:2/3;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meta{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0}`],d([ni({type:String,reflect:!0})],vr.prototype,"heading",2),vr=d([oi("roxy-tarot-catalog")],vr);function ii(n){return n.suit?`${x(n.arcana)} \xB7 ${x(n.suit)}`:`${x(n.arcana)} Arcana`}import{css as li,html as O,nothing as Se}from"lit";import{customElement as di,property as ci}from"lit/decorators.js";var $r=class extends m{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return O`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let r="answer"in e,t="cards"in e&&!("spread"in e),s=t?[]:"positions"in e?e.positions??[]:[],o=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),p="question"in e?e.question:void 0,y="summary"in e?e.summary:void 0,u=r?e.interpretation:void 0,k=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return O`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?O`<span class="question">"${p}"</span>`:Se}</header>${r?O`<div><span class="${`answer ${k}`}">${i}</span> ${l?O`<small>· ${l}</small>`:Se}</div>`:Se} ${s.length>0?O`<div class="grid">${s.map(f=>O`<div class="card"><p class="label">${f.name??""}</p><div class="image">${f.card?.imageUrl?O`<img src="${f.card.imageUrl}" alt="${f.card.name??"tarot card"}" class="${f.card.reversed?"reversed":""}">`:O`${f.card?.name??"?"}`}</div><p class="name">${f.card?.name??""} ${f.card?.reversed?O`<small>(reversed)</small>`:Se}</p>${f.interpretation?O`<p class="interp">${f.interpretation}</p>`:Se}</div>`)}</div>`:Se} ${o.length>0?O`<div class="grid">${o.map(f=>O`<div class="card"><div class="image">${f.imageUrl?O`<img src="${f.imageUrl}" alt="${f.name??"tarot card"}" class="${f.reversed?"reversed":""}">`:O`${f.name??"?"}`}</div><p class="name">${f.name??""} ${f.reversed?O`<small>(reversed)</small>`:Se}</p>${f.meaning?O`<p class="interp">${f.meaning}</p>`:Se}</div>`)}</div>`:Se} ${y?O`<p class="reading">${y}</p>`:Se} ${u?O`<p class="reading">${u}</p>`:Se}</article>`}};$r.styles=[g,li`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([ci({type:String,reflect:!0})],$r.prototype,"spread",2),$r=d([di("roxy-tarot-spread")],$r);import{css as pi,html as j,nothing as Je}from"lit";import{customElement as mi,state as gi}from"lit/decorators.js";var wr=class extends m{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return j`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:r,transitTime:t,transitPlanets:s,transitAspects:o,summary:i}=e,l=[pe(r),Ce(t)].filter(Boolean).join(" "),c=o?.length??0,p=this.tab;return j`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?j`<p class="subtitle">${l}</p>`:Je}</div>${c>0?j`${Ar({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:p,onSelect:y=>{this.tab=y},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?j`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:j`${i?this.renderSummaryPills(i):Je}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:j`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return j`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return j`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=v[x(r.name)]??"",s=J[x(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return j`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?j`<span class="retro-badge" aria-label="retrograde">R</span>`:Je}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${h(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${h(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return j`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=v[x(r.transitPlanet)]??"",o=v[x(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return j`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${s}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${o}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${h(r.orb,2)}° · strength ${h(r.strength,1)} </span>${ce()}</summary><div class="interp-body">${l?.summary?j`<p>${l.summary}</p>`:Je} ${l?.impact?j`<p><strong>Impact:</strong> ${l.impact}</p>`:Je} ${l?.timing?j`<p><strong>Timing:</strong> ${l.timing}</p>`:Je} ${l?.guidance?j`<p><strong>Guidance:</strong> ${l.guidance}</p>`:Je} ${l?.keywords?.length?j`<div class="interp-keywords">${l.keywords.map(y=>j`<span class="kw">${y}</span>`)}</div>`:Je}</div></details>`})}</div>`}};wr.styles=[g,qe,Ke,pi`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([gi()],wr.prototype,"tab",2),wr=d([mi("roxy-transits-table")],wr);import{css as yi,html as je,nothing as $a}from"lit";import{customElement as ui}from"lit/decorators.js";var sa=class extends m{renderEmpty(){return je`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[];if(e.length===0&&r.length===0)return this.renderEmpty();let t=a.datetime?String(a.datetime).replace("T"," "):"";return je`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${t?je`<p class="subtitle">${t}</p>`:$a}</div>${r.length>0?je`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(s=>je`<span class="mutual-pill">${s.planet1} ⟷ ${s.planet2} ${s.aspectType?je`<span class="rel">${s.aspectType}</span>`:$a}</span>`)}</div></div>`:$a} ${e.length>0?je`<div class="overflow-scroll"><table><thead><tr><th scope="col">From</th><th scope="col">Aspect</th><th scope="col">To</th><th scope="col">Strength</th><th scope="col">Orb</th></tr></thead><tbody>${e.map(s=>je`<tr><td>${s.aspectingPlanet}</td><td><span class="kind">${s.aspectType}</span></td><td>${s.aspectedPlanet}</td><td>${typeof s.strength=="number"?je`<span class="bar" style="width:${Math.max(4,Math.min(100,s.strength)*.4)}px"></span><span class="num">${h(s.strength,0)}</span>`:$a}</td><td class="num">${typeof s.orb=="number"?`${h(s.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:$a}</div>`}};sa.styles=[g,yi`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.mutual{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.mutual-pill{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:.35rem;padding:2px 10px;display:inline-flex}.mutual-pill .rel{font-size:var(--roxy-text-xs,.75rem);font-weight:400}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}tbody tr:last-child td{border-bottom:none}.kind{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);font-size:var(--roxy-text-xs,.75rem);padding:1px 8px;font-weight:600;display:inline-block}.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.bar{background:var(--roxy-accent,#f59e0b);vertical-align:middle;border-radius:3px;height:6px;margin-right:6px;display:inline-block}`],sa=d([ui("roxy-vedic-aspects")],sa);import{html as qt}from"lit";import{customElement as xi,property as yt}from"lit/decorators.js";var Be=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e}}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?Ga(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return qt`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let t=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return qt`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${Oa(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${Ha(r,this.chartStyle)}</svg></div>`}};Be.styles=[g,ja,qe],d([yt({type:String,reflect:!0,attribute:"chart-style"})],Be.prototype,"chartStyle",2),d([yt({type:String,reflect:!0,attribute:"chart-reference"})],Be.prototype,"chartReference",2),d([yt({type:String,reflect:!0,attribute:"lagna-override"})],Be.prototype,"lagnaOverride",2),Be=d([xi("roxy-vedic-kundli")],Be);import{css as hi,html as L,nothing as de}from"lit";import{customElement as fi}from"lit/decorators.js";var bi=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],oa=class extends m{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of bi){let s=a[t];s&&(r.push([t,s]),e.add(t))}for(let[t,s]of Object.entries(a))e.has(t)||r.push([t,s]);return r}renderEmpty(){return L`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return L`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let s=(t.graha??r)==="Lagna",o=v[x(t.graha??r)]??"",i=J[x(t.rashi??"")]??"";return L`<tr class="${s?"lagna":""}"><td class="graha">${o?L`<span class="glyph">${o}</span>`:de}${t.graha??r}</td><td>${i?L`<span class="glyph">${i}</span>`:de}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?La(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?L`<span class="retro">R</span>`:de}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let a=this.data?.combustion??[];return a.length===0?de:L`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${ce()}</summary><div class="panel-body">${a.map(e=>{let r=v[x(e.planet)]??"",t=h(e.distanceFromSun,2),s=h(e.orb,1);return L`<div class="condition"><span class="planet">${r?`${r} `:""}${e.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let a=this.data?.planetaryWar??[];return a.length===0?de:L`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${ce()}</summary><div class="panel-body">${a.map(e=>{let r=h(e.distance,2);return L`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let a=this.data?.interpretations??{},e=this.orderedRows().map(([r,t])=>[t.graha??r,a[t.graha??r]]).filter(([,r])=>r!=null);return e.length===0?de:L`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${ce()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=v[x(r)]??"";return L`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?L`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:de} ${t.nakshatra?L`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:de}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?de:L`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${ce()}</summary><div class="panel-body">${a.map(e=>L`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?L`<p class="desc">${e.description}</p>`:de}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?de:L`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${ce()}</summary><div class="panel-body">${a.map(e=>L`<div class="bhava"><span class="name">${e.name} ${e.quality?L`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:de}</span> ${e.result?L`<p class="desc">${e.result}</p>`:de}</div>`)}</div></details>`}};oa.styles=[g,Ke,hi`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],oa=d([fi("roxy-vedic-planets-table")],oa);import{css as vi,html as kr,nothing as Fa}from"lit";import{customElement as $i}from"lit/decorators.js";var na=class extends m{rows(){let a=this.data;if(!a)return[];let e=(a.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,t]of[["Ascendant",a.ascendant],["Midheaven",a.midheaven],["Part of Fortune",a.partOfFortune],["Vertex",a.vertex]])t&&e.push({name:r,sign:t.sign,longitude:t.longitude,isPoint:!0});return e}renderEmpty(){return kr`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return kr`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=v[x(r.name)]??"",s=J[x(r.sign??"")]??"",o=typeof r.speed=="number"?h(r.speed,3):"";return kr`<tr class="${r.isPoint?"point":""}"><td class="body">${t?kr`<span class="glyph">${t}</span>`:Fa}${r.name}</td><td>${s?kr`<span class="glyph">${s}</span>`:Fa}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?La(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?kr`${o}°/day`:Fa} ${r.isRetrograde?kr`<span class="retro">℞</span>`:Fa}</td></tr>`})}</tbody></table></div>`}};na.styles=[g,vi`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],na=d([$i("roxy-western-planets-table")],na);import{css as wi,html as ne,nothing as wa}from"lit";import{customElement as ki,state as Si}from"lit/decorators.js";var Sr=class extends m{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return ne`<span class="${r}">${e}</span>`}renderDetailCard(e){return ne`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):wa}</p>${e.description?ne`<p class="description">${e.description}</p>`:wa} ${e.result?ne`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:wa}</div>`}renderEmpty(){return ne`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return ne`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,p=r?c.filter(u=>u.name.toLowerCase().includes(r)):c,y=e.total;return ne`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${y!==void 0?ne`<span class="count">${y} total</span>`:wa}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(u=>this.renderDetailCard(u)):ne`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let o=t,i=r?o.filter(c=>c.name.toLowerCase().includes(r)):o,l=e.total;return ne`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?ne`<span class="count">${l} total</span>`:wa}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>ne`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):ne`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return ne`<div class="roxy-empty" role="status">No yoga data</div>`}};Sr.styles=[g,wi`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([Si()],Sr.prototype,"filter",2),Sr=d([ki("roxy-yoga-list")],Sr);var ut=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyVedicAspects",tag:"roxy-vedic-aspects",slug:"vedic-aspects",heading:"Vedic aspects",description:"Vedic graha drishti table: which planet aspects which, with mutual aspects surfaced first",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/aspects",docsSummary:"Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",topic:"Vedic"},{pascal:"RoxyHoraTable",tag:"roxy-hora-table",slug:"hora-table",heading:"Hora",description:"Vedic Hora (planetary hours) table: 12 day and 12 night horas by ruling planet for electional timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/hora",docsSummary:"Day and night planetary hours with ruling planet and window",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, soul urge, personality, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,soul-urge,personality,birth-day,maturity,daily,personal-day,personal-month,personal-year,chart}",docsSummary:"Life path, expression, soul urge, personality, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotCatalog",tag:"roxy-tarot-catalog",slug:"tarot-catalog",heading:"Tarot deck",description:"Responsive tarot deck gallery with card art, name, and an arcana and suit caption from the tarot catalog response",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards",docsSummary:"Deck gallery tiles with card art, name, and arcana and suit",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyHdConnection",tag:"roxy-hd-connection",slug:"hd-connection",heading:"HD connection",description:"Human Design connection chart: the composite channels two people form, with circuit, dynamic, and which person holds each gate",docsLabel:"Human Design",endpointLabel:"POST /human-design/connection",docsSummary:"Electromagnetic, compromise, and dominance channels between two charts",topic:"Human Design"},{pascal:"RoxyHdPenta",tag:"roxy-hd-penta",slug:"hd-penta",heading:"HD penta",description:"Human Design penta for a 3 to 5 person group: upper and lower triangle channels, defined or open, with core channels and member coverage",docsLabel:"Human Design",endpointLabel:"POST /human-design/penta",docsSummary:"Group penta channels split into upper and lower triangles",topic:"Human Design"},{pascal:"RoxyHdVariables",tag:"roxy-hd-variables",slug:"hd-variables",heading:"HD variables",description:"Human Design variables: the four PHS arrows (determination, environment, perspective, motivation) with left/right direction and color, tone, and base",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction and PHS labels",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyForecastDigest",tag:"roxy-forecast-digest",slug:"forecast-digest",heading:"Forecast digest",description:"Rolled-up forecast across the next 24 hours, 7, 30, and 90 days with per-domain breakdown and top events",docsLabel:"Forecast",endpointLabel:"POST /forecast/digest",docsSummary:"Per-window event counts, domain breakdown, and the highest-significance events",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyCrystalCard",tag:"roxy-crystal-card",slug:"crystal-card",heading:"Crystal detail",description:"Single-crystal detail card with photo, spiritual, emotional, and physical meaning, metaphysical attributes, affirmation, and pairings",docsLabel:"Crystals",endpointLabel:"GET /crystals/{id}",docsSummary:"Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",topic:"Crystals"},{pascal:"RoxyCrystalGrid",tag:"roxy-crystal-grid",slug:"crystal-grid",heading:"Crystal grid",description:"Responsive crystal gallery with photo, name, and colour swatches from any crystals list response",docsLabel:"Crystals",endpointLabel:"GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",docsSummary:"Crystal gallery tiles with photo, name, and colour swatches",topic:"Crystals"},{pascal:"RoxyDreamCard",tag:"roxy-dream-card",slug:"dream-card",heading:"Dream symbol",description:"Dream symbol card with the symbol name, full interpretation, and dictionary letter",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols/{id}",docsSummary:"Symbol name, interpretation body, and letter chip",topic:"Dreams"},{pascal:"RoxyDreamSearch",tag:"roxy-dream-search",slug:"dream-search",heading:"Dream search",description:"Dream-symbol search results as selectable tiles; emits roxy-symbol-select to pair with roxy-dream-card",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols",docsSummary:"Matched dream symbols as selectable tiles with a letter chip",topic:"Dreams"},{pascal:"RoxyAngelNumberCard",tag:"roxy-angel-number-card",slug:"angel-number-card",heading:"Angel number",description:"Angel number card with title, core message, badges, keywords, life-area interpretations, affirmation, and action steps",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/numbers/{number}",docsSummary:"Number meaning with spiritual, love, career, money, twin flame, biblical, and shadow sections",topic:"Angel Numbers"},{pascal:"RoxyAngelNumberLookup",tag:"roxy-angel-number-lookup",slug:"angel-number-lookup",heading:"Angel number lookup",description:"Angel number sequence analysis with pattern classification, the known meaning when present, and a digit-root fallback for any number",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/lookup",docsSummary:"Pattern analysis plus known meaning and digit-root fallback",topic:"Angel Numbers"},{pascal:"RoxyReferenceCard",tag:"roxy-reference-card",slug:"reference-card",heading:"Reference card",description:"Glossary entry for any reference lookup: zodiac sign, planet meaning, rashi, I Ching trigram, Human Design gate or center, numerology number or compound number",docsLabel:"Reference",endpointLabel:"GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/rashis/{id}, /iching/trigrams/{id}, /human-design/{gates,centers}/{id}, /numerology/{meanings,compound-number}/{number}",docsSummary:"Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",topic:"Helpers"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint, from the spec",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Ri="0.11.0";var By=ut.map(n=>n.slug);export{ut as ROXY_COMPONENTS,By as ROXY_UI_COMPONENTS,Ri as ROXY_UI_VERSION,Rr as RoxyAngelNumberCard,Cr as RoxyAngelNumberLookup,Qe as RoxyAshtakavargaGrid,Er as RoxyAspectsTable,rr as RoxyBiorhythmChart,Dr as RoxyBodygraph,Pr as RoxyChoghadiyaGrid,tr as RoxyCompatibilityCard,zr as RoxyCrystalCard,or as RoxyCrystalGrid,nr as RoxyDashaTimeline,ir as RoxyData,dr as RoxyDivisionalChart,cr as RoxyDoshaCard,Mr as RoxyDreamCard,Gr as RoxyDreamSearch,ee as RoxyEndpointForm,Hr as RoxyForecastDigest,Or as RoxyForecastTimeline,jr as RoxyGunaMilan,Br as RoxyHdConnection,Ir as RoxyHdPenta,_r as RoxyHdVariables,pr as RoxyHexagram,qr as RoxyHoraTable,mr as RoxyHoroscopeCard,yr as RoxyKpChart,Vr as RoxyKpPlanetsTable,Yr as RoxyKpRulingPlanets,U as RoxyLocationSearch,xr as RoxyMoonPhase,Wr as RoxyNakshatraCard,Ue as RoxyNatalChart,hr as RoxyNumerologyCard,fr as RoxyPanchangTable,Zr as RoxyReferenceCard,ea as RoxyShadbalaTable,ta as RoxySynastryChart,br as RoxyTarotCard,vr as RoxyTarotCatalog,$r as RoxyTarotSpread,wr as RoxyTransitsTable,sa as RoxyVedicAspects,Be as RoxyVedicKundli,oa as RoxyVedicPlanetsTable,na as RoxyWesternPlanetsTable,Sr as RoxyYogaList,Xt as roxyDataScript,ft as serializeRoxyData};
92
92
  //# sourceMappingURL=index.js.map