@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
@@ -1,15 +1,17 @@
1
- import { css, html, LitElement, nothing } from 'lit';
1
+ import { css, html, nothing } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
3
  import type {
4
+ CastCareerSpreadResponse,
4
5
  CastCelticCrossResponse,
6
+ CastCustomSpreadResponse,
5
7
  CastLoveSpreadResponse,
6
8
  CastReadingResponse,
7
9
  CastThreeCardResponse,
8
10
  CastYesNoResponse,
9
11
  DrawCardsResponse,
10
12
  } from '../types/index.js';
13
+ import { RoxyDataElement } from '../utils/base-element.js';
11
14
  import { baseStyles } from '../utils/base-styles.js';
12
- import { MarkupDataController } from '../utils/markup-data.js';
13
15
 
14
16
  type TarotSpreadData =
15
17
  | CastThreeCardResponse
@@ -17,6 +19,8 @@ type TarotSpreadData =
17
19
  | CastLoveSpreadResponse
18
20
  | CastYesNoResponse
19
21
  | CastReadingResponse
22
+ | CastCareerSpreadResponse
23
+ | CastCustomSpreadResponse
20
24
  | DrawCardsResponse;
21
25
 
22
26
  /**
@@ -24,7 +28,7 @@ type TarotSpreadData =
24
28
  * /tarot/yes-no, /tarot/draw responses.
25
29
  */
26
30
  @customElement('roxy-tarot-spread')
27
- export class RoxyTarotSpread extends LitElement {
31
+ export class RoxyTarotSpread extends RoxyDataElement<TarotSpreadData> {
28
32
  static styles = [
29
33
  baseStyles,
30
34
  css`
@@ -84,7 +88,7 @@ export class RoxyTarotSpread extends LitElement {
84
88
  border: 1px solid var(--roxy-border, #e4e4e7);
85
89
  border-radius: var(--roxy-radius-md, 8px);
86
90
  padding: var(--roxy-space-sm, 0.5rem);
87
- background: var(--roxy-bg, #fff);
91
+ background: var(--roxy-surface, #fff);
88
92
  display: grid;
89
93
  gap: var(--roxy-space-xs, 0.25rem);
90
94
  }
@@ -136,26 +140,21 @@ export class RoxyTarotSpread extends LitElement {
136
140
  `,
137
141
  ];
138
142
 
139
- constructor() {
140
- super();
141
- // Enables hydrating `data` from a direct-child
142
- // <script type="application/json" class="roxy-data"> for server-rendered
143
- // and cached consumers. The JavaScript `data` property still wins.
144
- new MarkupDataController(this);
145
- }
146
-
147
- @property({ attribute: false })
148
- data: TarotSpreadData | null = null;
149
-
150
143
  @property({ type: String, reflect: true })
151
- spread: 'three-card' | 'celtic-cross' | 'love' | 'yes-no' | 'draw' =
152
- 'three-card';
144
+ spread:
145
+ | 'three-card'
146
+ | 'celtic-cross'
147
+ | 'love'
148
+ | 'career'
149
+ | 'custom'
150
+ | 'yes-no'
151
+ | 'draw' = 'three-card';
153
152
 
154
- render() {
155
- const d = this.data;
156
- if (!d)
157
- return html`<div class="roxy-empty" role="status">No tarot spread</div>`;
153
+ protected renderEmpty() {
154
+ return html`<div class="roxy-empty" role="status">No tarot spread</div>`;
155
+ }
158
156
 
157
+ protected renderData(d: TarotSpreadData) {
159
158
  const isYesNo = 'answer' in d;
160
159
  const isDrawn = 'cards' in d && !('spread' in d);
161
160
  const positions = isDrawn
@@ -1,11 +1,11 @@
1
- import { css, html, LitElement, nothing } from 'lit';
2
- import { customElement, property, state } from 'lit/decorators.js';
1
+ import { css, html, nothing } from 'lit';
2
+ import { customElement, state } from 'lit/decorators.js';
3
3
  import { PLANET_GLYPH, SIGN_GLYPH } from '../tokens/index.js';
4
4
  import type { TransitsResponse } from '../types/index.js';
5
+ import { RoxyDataElement } from '../utils/base-element.js';
5
6
  import { baseStyles } from '../utils/base-styles.js';
6
7
  import { chevron, disclosureStyles } from '../utils/disclosure.js';
7
8
  import { formatDate, formatNumber, formatTime } from '../utils/format.js';
8
- import { MarkupDataController } from '../utils/markup-data.js';
9
9
  import { capitalize } from '../utils/string.js';
10
10
  import { renderTablist, tablistStyles } from '../utils/tablist.js';
11
11
 
@@ -15,13 +15,19 @@ import { renderTablist, tablistStyles } from '../utils/tablist.js';
15
15
  * `data.summary` are present and rendered automatically.
16
16
  */
17
17
  @customElement('roxy-transits-table')
18
- export class RoxyTransitsTable extends LitElement {
18
+ export class RoxyTransitsTable extends RoxyDataElement<TransitsResponse> {
19
19
  static styles = [
20
20
  baseStyles,
21
21
  tablistStyles,
22
22
  disclosureStyles,
23
23
  css`
24
24
  .wrap {
25
+ background: var(--roxy-surface, #fff);
26
+ color: var(--roxy-fg, #0a0a0a);
27
+ border: 1px solid var(--roxy-border, #e4e4e7);
28
+ border-radius: var(--roxy-radius-md, 8px);
29
+ padding: var(--roxy-space-lg, 1.5rem);
30
+ box-shadow: var(--roxy-shadow-sm);
25
31
  display: grid;
26
32
  gap: var(--roxy-space-md, 1rem);
27
33
  }
@@ -219,25 +225,16 @@ export class RoxyTransitsTable extends LitElement {
219
225
  `,
220
226
  ];
221
227
 
222
- constructor() {
223
- super();
224
- // Enables hydrating `data` from a direct-child
225
- // <script type="application/json" class="roxy-data"> for server-rendered
226
- // and cached consumers. The JavaScript `data` property still wins.
227
- new MarkupDataController(this);
228
- }
229
-
230
- @property({ attribute: false })
231
- data: TransitsResponse | null = null;
232
-
233
228
  /** Which panel is showing: planet positions or the transit-to-natal aspects. */
234
229
  @state()
235
230
  private tab: 'positions' | 'aspects' = 'positions';
236
231
 
237
- render() {
238
- if (!this.data?.transitPlanets?.length) {
239
- return html`<div class="roxy-empty" role="status">No transits data</div>`;
240
- }
232
+ protected renderEmpty() {
233
+ return html`<div class="roxy-empty" role="status">No transits data</div>`;
234
+ }
235
+
236
+ protected renderData(d: TransitsResponse) {
237
+ if (!d.transitPlanets?.length) return this.renderEmpty();
241
238
 
242
239
  const {
243
240
  transitDate,
@@ -245,7 +242,7 @@ export class RoxyTransitsTable extends LitElement {
245
242
  transitPlanets,
246
243
  transitAspects,
247
244
  summary,
248
- } = this.data;
245
+ } = d;
249
246
 
250
247
  const dateStr = [formatDate(transitDate), formatTime(transitTime)]
251
248
  .filter(Boolean)
@@ -0,0 +1,188 @@
1
+ import { css, html, nothing } from 'lit';
2
+ import { customElement } from 'lit/decorators.js';
3
+ import type { CalculateDrishtiResponse } from '../types/index.js';
4
+ import { RoxyDataElement } from '../utils/base-element.js';
5
+ import { baseStyles } from '../utils/base-styles.js';
6
+ import { formatNumber } from '../utils/format.js';
7
+
8
+ /**
9
+ * Vedic graha drishti (planetary aspects) table. Renders /vedic-astrology/aspects: which planet casts an aspect on which, by special Vedic rules (every graha aspects the 7th; Mars the 4th and 8th, Jupiter the 5th and 9th, Saturn the 3rd and 10th). Mutual aspects (two planets aspecting each other) are surfaced first as they are the strongest sambandha. Each row shows the aspecting planet, the aspect kind, the aspected planet, its strength and orb.
10
+ */
11
+ @customElement('roxy-vedic-aspects')
12
+ export class RoxyVedicAspects extends RoxyDataElement<CalculateDrishtiResponse> {
13
+ static styles = [
14
+ baseStyles,
15
+ css`
16
+ .wrap {
17
+ background: var(--roxy-surface, #fff);
18
+ color: var(--roxy-fg, #0a0a0a);
19
+ border: 1px solid var(--roxy-border, #e4e4e7);
20
+ border-radius: var(--roxy-radius-md, 8px);
21
+ padding: var(--roxy-space-lg, 1.5rem);
22
+ box-shadow: var(--roxy-shadow-sm);
23
+ display: grid;
24
+ gap: var(--roxy-space-md, 1rem);
25
+ }
26
+ .head {
27
+ display: flex;
28
+ justify-content: space-between;
29
+ align-items: baseline;
30
+ gap: var(--roxy-space-md, 1rem);
31
+ flex-wrap: wrap;
32
+ }
33
+ .title {
34
+ font-size: var(--roxy-text-lg, 1.125rem);
35
+ font-weight: var(--roxy-weight-bold, 600);
36
+ margin: 0;
37
+ }
38
+ .subtitle {
39
+ color: var(--roxy-muted, #71717a);
40
+ font-size: var(--roxy-text-sm, 0.875rem);
41
+ margin: 0;
42
+ }
43
+ .section-label {
44
+ font-size: var(--roxy-text-xs, 0.75rem);
45
+ color: var(--roxy-muted, #71717a);
46
+ text-transform: uppercase;
47
+ letter-spacing: 0.06em;
48
+ font-weight: var(--roxy-weight-bold, 600);
49
+ margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
50
+ }
51
+ .mutual {
52
+ display: flex;
53
+ flex-wrap: wrap;
54
+ gap: var(--roxy-space-sm, 0.5rem);
55
+ }
56
+ .mutual-pill {
57
+ display: inline-flex;
58
+ align-items: center;
59
+ gap: 0.35rem;
60
+ padding: 2px 10px;
61
+ border-radius: var(--roxy-radius-full, 9999px);
62
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
63
+ color: var(--roxy-fg, #0a0a0a);
64
+ font-size: var(--roxy-text-sm, 0.875rem);
65
+ font-weight: var(--roxy-weight-bold, 600);
66
+ }
67
+ .mutual-pill .rel {
68
+ font-size: var(--roxy-text-xs, 0.75rem);
69
+ font-weight: 400;
70
+ }
71
+ .overflow-scroll {
72
+ overflow-x: auto;
73
+ -webkit-overflow-scrolling: touch;
74
+ }
75
+ table {
76
+ width: 100%;
77
+ border-collapse: collapse;
78
+ font-size: var(--roxy-text-sm, 0.875rem);
79
+ }
80
+ th,
81
+ td {
82
+ padding: var(--roxy-space-sm, 0.5rem);
83
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
84
+ text-align: left;
85
+ white-space: nowrap;
86
+ }
87
+ th {
88
+ color: var(--roxy-muted, #71717a);
89
+ font-weight: var(--roxy-weight-bold, 600);
90
+ text-transform: uppercase;
91
+ font-size: var(--roxy-text-xs, 0.75rem);
92
+ letter-spacing: 0.06em;
93
+ }
94
+ tbody tr:last-child td {
95
+ border-bottom: none;
96
+ }
97
+ .kind {
98
+ display: inline-block;
99
+ padding: 1px 8px;
100
+ border-radius: var(--roxy-radius-full, 9999px);
101
+ background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 55%, transparent);
102
+ font-size: var(--roxy-text-xs, 0.75rem);
103
+ font-weight: 600;
104
+ }
105
+ .num {
106
+ font-variant-numeric: tabular-nums;
107
+ color: var(--roxy-muted, #71717a);
108
+ }
109
+ .bar {
110
+ display: inline-block;
111
+ height: 6px;
112
+ border-radius: 3px;
113
+ background: var(--roxy-accent, #f59e0b);
114
+ vertical-align: middle;
115
+ margin-right: 6px;
116
+ }
117
+ `,
118
+ ];
119
+
120
+ protected renderEmpty() {
121
+ return html`<div class="roxy-empty" role="status">No aspect data</div>`;
122
+ }
123
+
124
+ protected renderData(d: CalculateDrishtiResponse) {
125
+ const aspects = d.aspects ?? [];
126
+ const mutual = d.mutualAspects ?? [];
127
+ if (aspects.length === 0 && mutual.length === 0) return this.renderEmpty();
128
+ const date = d.datetime ? String(d.datetime).replace('T', ' ') : '';
129
+
130
+ return html`<div class="wrap" aria-label="Vedic aspects">
131
+ <div class="head">
132
+ <h2 class="title">Vedic Aspects</h2>
133
+ ${date ? html`<p class="subtitle">${date}</p>` : nothing}
134
+ </div>
135
+ ${
136
+ mutual.length > 0
137
+ ? html`<div>
138
+ <p class="section-label">Mutual aspects</p>
139
+ <div class="mutual">
140
+ ${mutual.map(
141
+ (m) => html`<span class="mutual-pill">
142
+ ${m.planet1} ⟷ ${m.planet2}
143
+ ${m.aspectType ? html`<span class="rel">${m.aspectType}</span>` : nothing}
144
+ </span>`,
145
+ )}
146
+ </div>
147
+ </div>`
148
+ : nothing
149
+ }
150
+ ${
151
+ aspects.length > 0
152
+ ? html`<div class="overflow-scroll">
153
+ <table>
154
+ <thead>
155
+ <tr>
156
+ <th scope="col">From</th>
157
+ <th scope="col">Aspect</th>
158
+ <th scope="col">To</th>
159
+ <th scope="col">Strength</th>
160
+ <th scope="col">Orb</th>
161
+ </tr>
162
+ </thead>
163
+ <tbody>
164
+ ${aspects.map(
165
+ (a) => html`<tr>
166
+ <td>${a.aspectingPlanet}</td>
167
+ <td><span class="kind">${a.aspectType}</span></td>
168
+ <td>${a.aspectedPlanet}</td>
169
+ <td>
170
+ ${typeof a.strength === 'number' ? html`<span class="bar" style="width:${Math.max(4, Math.min(100, a.strength) * 0.4)}px"></span><span class="num">${formatNumber(a.strength, 0)}</span>` : nothing}
171
+ </td>
172
+ <td class="num">${typeof a.orb === 'number' ? `${formatNumber(a.orb, 2)}°` : ''}</td>
173
+ </tr>`,
174
+ )}
175
+ </tbody>
176
+ </table>
177
+ </div>`
178
+ : nothing
179
+ }
180
+ </div>`;
181
+ }
182
+ }
183
+
184
+ declare global {
185
+ interface HTMLElementTagNameMap {
186
+ 'roxy-vedic-aspects': RoxyVedicAspects;
187
+ }
188
+ }
@@ -1,6 +1,7 @@
1
- import { html, LitElement } from 'lit';
1
+ import { html } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
3
  import type { BirthChartResponse } from '../types/index.js';
4
+ import { RoxyDataElement } from '../utils/base-element.js';
4
5
  import { baseStyles } from '../utils/base-styles.js';
5
6
  import {
6
7
  type ChartStyle,
@@ -10,7 +11,6 @@ import {
10
11
  toKundliViewModel,
11
12
  } from '../utils/kundli-render.js';
12
13
  import { kundliStyles } from '../utils/kundli-styles.js';
13
- import { MarkupDataController } from '../utils/markup-data.js';
14
14
  import { tablistStyles } from '../utils/tablist.js';
15
15
 
16
16
  /**
@@ -24,43 +24,70 @@ import { tablistStyles } from '../utils/tablist.js';
24
24
  * page sets the initial style via `chart-style` attribute; from there the
25
25
  * user takes over.
26
26
  *
27
+ * The ascendant (house 1) defaults to the Janma Lagna carried in the response
28
+ * `meta`. Set `chart-reference="moon"` to render the Chandra Lagna (Moon as
29
+ * ascendant) from the same response, or `lagna-override="<rashi>"` to pin the
30
+ * reference to any sign (Surya Lagna, Arudha Lagna, a custom point). The same
31
+ * planet-in-sign data feeds every reference; only the house numbering rotates.
32
+ *
27
33
  * Theming flows through CSS custom properties on `:host`, so the chart
28
34
  * adopts the host page palette without runtime color probing.
29
35
  */
30
36
  @customElement('roxy-vedic-kundli')
31
- export class RoxyVedicKundli extends LitElement {
37
+ export class RoxyVedicKundli extends RoxyDataElement<BirthChartResponse> {
32
38
  static styles = [baseStyles, kundliStyles, tablistStyles];
33
39
 
34
- constructor() {
35
- super();
36
- // Enables hydrating `data` from a direct-child
37
- // <script type="application/json" class="roxy-data"> for server-rendered
38
- // and cached consumers. The JavaScript `data` property still wins.
39
- new MarkupDataController(this);
40
- }
41
-
42
- @property({ attribute: false })
43
- data: BirthChartResponse | null = null;
44
-
45
40
  @property({ type: String, reflect: true, attribute: 'chart-style' })
46
41
  chartStyle: ChartStyle = 'north';
47
42
 
43
+ /**
44
+ * Ascendant reference point. `'lagna'` (default) uses the Janma Lagna from the response; `'moon'` renders the Chandra Lagna (Moon sign as house 1) from the same response. An explicit {@link lagnaOverride} wins over this.
45
+ */
46
+ @property({ type: String, reflect: true, attribute: 'chart-reference' })
47
+ chartReference: 'lagna' | 'moon' = 'lagna';
48
+
49
+ /**
50
+ * Explicit rashi/sign name (case-insensitive, e.g. `"cancer"`) to use as the ascendant, overriding both the Janma Lagna and {@link chartReference}. Empty by default (standard Janma Lagna). Use for Surya Lagna, Arudha Lagna, or any custom reference chart.
51
+ */
52
+ @property({ type: String, reflect: true, attribute: 'lagna-override' })
53
+ lagnaOverride = '';
54
+
55
+ /**
56
+ * Resolve the ascendant override fed to {@link toKundliViewModel}. An explicit `lagna-override` wins; otherwise `chart-reference="moon"` derives the Moon rashi from the response `meta`. Returns `undefined` for the default Janma Lagna path.
57
+ */
58
+ private resolveReference(): string | undefined {
59
+ if (this.lagnaOverride) return this.lagnaOverride;
60
+ if (this.chartReference === 'moon') return this.data?.meta?.Moon?.rashi;
61
+ return undefined;
62
+ }
63
+
48
64
  private viewModel(): KundliViewModel | null {
49
65
  if (!this.data?.meta) return null;
50
- return toKundliViewModel(this.data.meta, 'D1 Rashi');
66
+ return toKundliViewModel(
67
+ this.data.meta,
68
+ 'D1 Rashi',
69
+ this.resolveReference(),
70
+ );
51
71
  }
52
72
 
53
73
  private setStyle = (next: ChartStyle) => {
54
74
  this.chartStyle = next;
55
75
  };
56
76
 
57
- render() {
77
+ protected renderEmpty() {
78
+ return html`<div class="roxy-empty" role="status">No kundli data</div>`;
79
+ }
80
+
81
+ protected renderData(_d: BirthChartResponse) {
58
82
  const vm = this.viewModel();
59
- if (!vm)
60
- return html`<div class="roxy-empty" role="status">No kundli data</div>`;
83
+ if (!vm) return this.renderEmpty();
84
+ const title =
85
+ this.chartReference === 'moon' && !this.lagnaOverride
86
+ ? 'Chandra lagna'
87
+ : 'Vedic kundli';
61
88
  return html`<div class="wrap">
62
89
  <div class="header">
63
- <h2 class="title">Vedic kundli</h2>
90
+ <h2 class="title">${title}</h2>
64
91
  ${renderKundliStyleTablist(this.chartStyle, this.setStyle)}
65
92
  </div>
66
93
  <svg
@@ -1,12 +1,12 @@
1
- import { css, html, LitElement, nothing } from 'lit';
2
- import { customElement, property } from 'lit/decorators.js';
1
+ import { css, html, nothing } from 'lit';
2
+ import { customElement } from 'lit/decorators.js';
3
3
  import { PLANET_GLYPH, SIGN_GLYPH } from '../tokens/index.js';
4
4
  import type { BirthChartResponse } from '../types/index.js';
5
+ import { RoxyDataElement } from '../utils/base-element.js';
5
6
  import { baseStyles } from '../utils/base-styles.js';
6
7
  import { formatSignPosition } from '../utils/degree.js';
7
8
  import { chevron, disclosureStyles } from '../utils/disclosure.js';
8
9
  import { formatNumber } from '../utils/format.js';
9
- import { MarkupDataController } from '../utils/markup-data.js';
10
10
  import { capitalize } from '../utils/string.js';
11
11
 
12
12
  /**
@@ -44,7 +44,7 @@ type MetaEntry = BirthChartResponse['meta'][string];
44
44
  * non-empty.
45
45
  */
46
46
  @customElement('roxy-vedic-planets-table')
47
- export class RoxyVedicPlanetsTable extends LitElement {
47
+ export class RoxyVedicPlanetsTable extends RoxyDataElement<BirthChartResponse> {
48
48
  static styles = [
49
49
  baseStyles,
50
50
  disclosureStyles,
@@ -52,7 +52,7 @@ export class RoxyVedicPlanetsTable extends LitElement {
52
52
  .wrap {
53
53
  border: 1px solid var(--roxy-border, #e4e4e7);
54
54
  border-radius: var(--roxy-radius-md, 8px);
55
- background: var(--roxy-bg, #fff);
55
+ background: var(--roxy-surface, #fff);
56
56
  box-shadow: var(--roxy-shadow-sm);
57
57
  overflow: hidden;
58
58
  }
@@ -214,17 +214,6 @@ export class RoxyVedicPlanetsTable extends LitElement {
214
214
  `,
215
215
  ];
216
216
 
217
- constructor() {
218
- super();
219
- // Enables hydrating `data` from a direct-child
220
- // <script type="application/json" class="roxy-data"> for server-rendered
221
- // and cached consumers. The JavaScript `data` property still wins.
222
- new MarkupDataController(this);
223
- }
224
-
225
- @property({ attribute: false })
226
- data: BirthChartResponse | null = null;
227
-
228
217
  /** Ordered [name, entry] pairs: GRAHA_ORDER first, then any extras. */
229
218
  private orderedRows(): Array<[string, MetaEntry]> {
230
219
  const meta = this.data?.meta ?? {};
@@ -243,9 +232,12 @@ export class RoxyVedicPlanetsTable extends LitElement {
243
232
  return rows;
244
233
  }
245
234
 
246
- render() {
247
- if (!this.data?.meta)
248
- return html`<div class="roxy-empty" role="status">No chart data</div>`;
235
+ protected renderEmpty() {
236
+ return html`<div class="roxy-empty" role="status">No chart data</div>`;
237
+ }
238
+
239
+ protected renderData(d: BirthChartResponse) {
240
+ if (!d.meta) return this.renderEmpty();
249
241
  const rows = this.orderedRows();
250
242
 
251
243
  return html`<div class="wrap" aria-label="Vedic planetary positions">
@@ -1,11 +1,11 @@
1
- import { css, html, LitElement, nothing } from 'lit';
2
- import { customElement, property } from 'lit/decorators.js';
1
+ import { css, html, nothing } from 'lit';
2
+ import { customElement } from 'lit/decorators.js';
3
3
  import { PLANET_GLYPH, SIGN_GLYPH } from '../tokens/index.js';
4
4
  import type { NatalChartResponse } from '../types/index.js';
5
+ import { RoxyDataElement } from '../utils/base-element.js';
5
6
  import { baseStyles } from '../utils/base-styles.js';
6
7
  import { formatSignPosition } from '../utils/degree.js';
7
8
  import { formatNumber } from '../utils/format.js';
8
- import { MarkupDataController } from '../utils/markup-data.js';
9
9
  import { capitalize } from '../utils/string.js';
10
10
 
11
11
  /** A body or point row, normalized so planets and the four angles share a table. */
@@ -27,14 +27,14 @@ interface BodyRow {
27
27
  * the four chart points (Ascendant, Midheaven, Part of Fortune, Vertex).
28
28
  */
29
29
  @customElement('roxy-western-planets-table')
30
- export class RoxyWesternPlanetsTable extends LitElement {
30
+ export class RoxyWesternPlanetsTable extends RoxyDataElement<NatalChartResponse> {
31
31
  static styles = [
32
32
  baseStyles,
33
33
  css`
34
34
  .wrap {
35
35
  border: 1px solid var(--roxy-border, #e4e4e7);
36
36
  border-radius: var(--roxy-radius-md, 8px);
37
- background: var(--roxy-bg, #fff);
37
+ background: var(--roxy-surface, #fff);
38
38
  overflow: auto;
39
39
  box-shadow: var(--roxy-shadow-sm);
40
40
  }
@@ -93,17 +93,6 @@ export class RoxyWesternPlanetsTable extends LitElement {
93
93
  `,
94
94
  ];
95
95
 
96
- constructor() {
97
- super();
98
- // Enables hydrating `data` from a direct-child
99
- // <script type="application/json" class="roxy-data"> for server-rendered
100
- // and cached consumers. The JavaScript `data` property still wins.
101
- new MarkupDataController(this);
102
- }
103
-
104
- @property({ attribute: false })
105
- data: NatalChartResponse | null = null;
106
-
107
96
  /** Build the ordered row list: the planets array, then the four chart points. */
108
97
  private rows(): BodyRow[] {
109
98
  const d = this.data;
@@ -134,9 +123,12 @@ export class RoxyWesternPlanetsTable extends LitElement {
134
123
  return rows;
135
124
  }
136
125
 
137
- render() {
138
- if (!this.data?.planets)
139
- return html`<div class="roxy-empty" role="status">No chart data</div>`;
126
+ protected renderEmpty() {
127
+ return html`<div class="roxy-empty" role="status">No chart data</div>`;
128
+ }
129
+
130
+ protected renderData(d: NatalChartResponse) {
131
+ if (!d.planets) return this.renderEmpty();
140
132
  const rows = this.rows();
141
133
 
142
134
  return html`<div class="wrap" aria-label="Western planetary positions" tabindex="0">
@@ -1,12 +1,17 @@
1
- import { css, html, LitElement, nothing } from 'lit';
2
- import { customElement, property, state } from 'lit/decorators.js';
3
- import type { GetYogaResponse, ListYogasResponse } from '../types/index.js';
1
+ import { css, html, nothing } from 'lit';
2
+ import { customElement, state } from 'lit/decorators.js';
3
+ import type {
4
+ DetectYogasResponse,
5
+ GetYogaResponse,
6
+ ListYogasResponse,
7
+ } from '../types/index.js';
8
+ import { RoxyDataElement } from '../utils/base-element.js';
4
9
  import { baseStyles } from '../utils/base-styles.js';
5
- import { MarkupDataController } from '../utils/markup-data.js';
6
10
 
7
11
  type YogaListData =
8
12
  | ListYogasResponse
9
13
  | GetYogaResponse
14
+ | DetectYogasResponse
10
15
  | { yogas: Array<GetYogaResponse> };
11
16
 
12
17
  /**
@@ -18,7 +23,7 @@ type YogaListData =
18
23
  * Catalog and detail-array modes include a live search filter.
19
24
  */
20
25
  @customElement('roxy-yoga-list')
21
- export class RoxyYogaList extends LitElement {
26
+ export class RoxyYogaList extends RoxyDataElement<YogaListData> {
22
27
  static styles = [
23
28
  baseStyles,
24
29
  css`
@@ -55,7 +60,7 @@ export class RoxyYogaList extends LitElement {
55
60
  font-family: var(--roxy-font-sans);
56
61
  border: 1px solid var(--roxy-border, #e4e4e7);
57
62
  border-radius: var(--roxy-radius-md, 8px);
58
- background: var(--roxy-bg, #fff);
63
+ background: var(--roxy-surface, #fff);
59
64
  color: var(--roxy-fg, #0a0a0a);
60
65
  outline: none;
61
66
  }
@@ -77,7 +82,7 @@ export class RoxyYogaList extends LitElement {
77
82
  border: 1px solid var(--roxy-border, #e4e4e7);
78
83
  border-radius: var(--roxy-radius-md, 8px);
79
84
  font-size: var(--roxy-text-sm, 0.875rem);
80
- background: var(--roxy-bg, #fff);
85
+ background: var(--roxy-surface, #fff);
81
86
  color: var(--roxy-fg, #0a0a0a);
82
87
  word-break: break-word;
83
88
  }
@@ -92,7 +97,7 @@ export class RoxyYogaList extends LitElement {
92
97
  border: 1px solid var(--roxy-border, #e4e4e7);
93
98
  border-radius: var(--roxy-radius-md, 8px);
94
99
  padding: var(--roxy-space-md, 1rem);
95
- background: var(--roxy-bg, #fff);
100
+ background: var(--roxy-surface, #fff);
96
101
  display: grid;
97
102
  gap: var(--roxy-space-sm, 0.5rem);
98
103
  }
@@ -172,17 +177,6 @@ export class RoxyYogaList extends LitElement {
172
177
  `,
173
178
  ];
174
179
 
175
- constructor() {
176
- super();
177
- // Enables hydrating `data` from a direct-child
178
- // <script type="application/json" class="roxy-data"> for server-rendered
179
- // and cached consumers. The JavaScript `data` property still wins.
180
- new MarkupDataController(this);
181
- }
182
-
183
- @property({ attribute: false })
184
- data: YogaListData | null = null;
185
-
186
180
  @state()
187
181
  private filter = '';
188
182
 
@@ -217,11 +211,11 @@ export class RoxyYogaList extends LitElement {
217
211
  </div>`;
218
212
  }
219
213
 
220
- render() {
221
- if (!this.data)
222
- return html`<div class="roxy-empty" role="status">No yoga data</div>`;
214
+ protected renderEmpty() {
215
+ return html`<div class="roxy-empty" role="status">No yoga data</div>`;
216
+ }
223
217
 
224
- const d = this.data;
218
+ protected renderData(d: YogaListData) {
225
219
  const lc = this.filter.toLowerCase();
226
220
 
227
221
  // Detail mode: single GetYogaResponse