@roxyapi/ui 0.1.2 → 0.2.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 (220) hide show
  1. package/AGENTS.md +6 -0
  2. package/README.md +327 -14
  3. package/THEMING.md +24 -7
  4. package/dist/cdn/components/ashtakavarga-grid.js +349 -0
  5. package/dist/cdn/components/ashtakavarga-grid.js.map +7 -0
  6. package/dist/cdn/components/biorhythm-chart.js +15 -22
  7. package/dist/cdn/components/biorhythm-chart.js.map +3 -3
  8. package/dist/cdn/components/choghadiya-grid.js +239 -0
  9. package/dist/cdn/components/choghadiya-grid.js.map +7 -0
  10. package/dist/cdn/components/compatibility-card.js +36 -34
  11. package/dist/cdn/components/compatibility-card.js.map +4 -4
  12. package/dist/cdn/components/dasha-timeline.js +35 -39
  13. package/dist/cdn/components/dasha-timeline.js.map +4 -4
  14. package/dist/cdn/components/data.js +9 -9
  15. package/dist/cdn/components/data.js.map +4 -4
  16. package/dist/cdn/components/divisional-chart.js +279 -0
  17. package/dist/cdn/components/divisional-chart.js.map +7 -0
  18. package/dist/cdn/components/dosha-card.js +49 -49
  19. package/dist/cdn/components/dosha-card.js.map +3 -3
  20. package/dist/cdn/components/endpoint-form.js +47 -28
  21. package/dist/cdn/components/endpoint-form.js.map +4 -4
  22. package/dist/cdn/components/guna-milan.js +66 -24
  23. package/dist/cdn/components/guna-milan.js.map +4 -4
  24. package/dist/cdn/components/hexagram.js +26 -26
  25. package/dist/cdn/components/hexagram.js.map +3 -3
  26. package/dist/cdn/components/horoscope-card.js +47 -40
  27. package/dist/cdn/components/horoscope-card.js.map +4 -4
  28. package/dist/cdn/components/kp-planets-table.js +10 -10
  29. package/dist/cdn/components/kp-planets-table.js.map +4 -4
  30. package/dist/cdn/components/location-search.js +6 -6
  31. package/dist/cdn/components/location-search.js.map +3 -3
  32. package/dist/cdn/components/moon-phase.js +18 -18
  33. package/dist/cdn/components/moon-phase.js.map +4 -4
  34. package/dist/cdn/components/natal-chart.js +240 -24
  35. package/dist/cdn/components/natal-chart.js.map +4 -4
  36. package/dist/cdn/components/numerology-card.js +40 -31
  37. package/dist/cdn/components/numerology-card.js.map +4 -4
  38. package/dist/cdn/components/panchang-table.js +30 -30
  39. package/dist/cdn/components/panchang-table.js.map +4 -4
  40. package/dist/cdn/components/shadbala-table.js +312 -0
  41. package/dist/cdn/components/shadbala-table.js.map +7 -0
  42. package/dist/cdn/components/synastry-chart.js +129 -39
  43. package/dist/cdn/components/synastry-chart.js.map +4 -4
  44. package/dist/cdn/components/tarot-card.js +49 -20
  45. package/dist/cdn/components/tarot-card.js.map +3 -3
  46. package/dist/cdn/components/tarot-spread.js +43 -27
  47. package/dist/cdn/components/tarot-spread.js.map +3 -3
  48. package/dist/cdn/components/transits-table.js +391 -0
  49. package/dist/cdn/components/transits-table.js.map +7 -0
  50. package/dist/cdn/components/vedic-kundli.js +63 -27
  51. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  52. package/dist/cdn/components/yoga-list.js +334 -0
  53. package/dist/cdn/components/yoga-list.js.map +7 -0
  54. package/dist/cdn/roxy-ui.js +2104 -544
  55. package/dist/cdn/roxy-ui.js.map +4 -4
  56. package/dist/components/ashtakavarga-grid.d.ts +26 -0
  57. package/dist/components/ashtakavarga-grid.d.ts.map +1 -0
  58. package/dist/components/ashtakavarga-grid.js +457 -0
  59. package/dist/components/ashtakavarga-grid.js.map +7 -0
  60. package/dist/components/biorhythm-chart.d.ts +2 -46
  61. package/dist/components/biorhythm-chart.d.ts.map +1 -1
  62. package/dist/components/biorhythm-chart.js +24 -23
  63. package/dist/components/biorhythm-chart.js.map +2 -2
  64. package/dist/components/choghadiya-grid.d.ts +19 -0
  65. package/dist/components/choghadiya-grid.d.ts.map +1 -0
  66. package/dist/components/choghadiya-grid.js +304 -0
  67. package/dist/components/choghadiya-grid.js.map +7 -0
  68. package/dist/components/compatibility-card.d.ts +2 -27
  69. package/dist/components/compatibility-card.d.ts.map +1 -1
  70. package/dist/components/compatibility-card.js +50 -29
  71. package/dist/components/compatibility-card.js.map +3 -3
  72. package/dist/components/dasha-timeline.d.ts +2 -31
  73. package/dist/components/dasha-timeline.d.ts.map +1 -1
  74. package/dist/components/dasha-timeline.js +32 -30
  75. package/dist/components/dasha-timeline.js.map +3 -3
  76. package/dist/components/data.d.ts +11 -7
  77. package/dist/components/data.d.ts.map +1 -1
  78. package/dist/components/data.js +16 -6
  79. package/dist/components/data.js.map +3 -3
  80. package/dist/components/divisional-chart.d.ts +20 -0
  81. package/dist/components/divisional-chart.d.ts.map +1 -0
  82. package/dist/components/divisional-chart.js +471 -0
  83. package/dist/components/divisional-chart.js.map +7 -0
  84. package/dist/components/dosha-card.d.ts +2 -16
  85. package/dist/components/dosha-card.d.ts.map +1 -1
  86. package/dist/components/dosha-card.js +45 -43
  87. package/dist/components/dosha-card.js.map +2 -2
  88. package/dist/components/endpoint-form.d.ts +2 -0
  89. package/dist/components/endpoint-form.d.ts.map +1 -1
  90. package/dist/components/endpoint-form.js +71 -11
  91. package/dist/components/endpoint-form.js.map +3 -3
  92. package/dist/components/guna-milan.d.ts +2 -20
  93. package/dist/components/guna-milan.d.ts.map +1 -1
  94. package/dist/components/guna-milan.js +79 -20
  95. package/dist/components/guna-milan.js.map +4 -4
  96. package/dist/components/hexagram.d.ts +3 -27
  97. package/dist/components/hexagram.d.ts.map +1 -1
  98. package/dist/components/hexagram.js +48 -15
  99. package/dist/components/hexagram.js.map +2 -2
  100. package/dist/components/horoscope-card.d.ts +2 -20
  101. package/dist/components/horoscope-card.d.ts.map +1 -1
  102. package/dist/components/horoscope-card.js +54 -18
  103. package/dist/components/horoscope-card.js.map +3 -3
  104. package/dist/components/kp-planets-table.d.ts +2 -21
  105. package/dist/components/kp-planets-table.d.ts.map +1 -1
  106. package/dist/components/kp-planets-table.js +10 -4
  107. package/dist/components/kp-planets-table.js.map +3 -3
  108. package/dist/components/location-search.d.ts +5 -14
  109. package/dist/components/location-search.d.ts.map +1 -1
  110. package/dist/components/location-search.js +45 -5
  111. package/dist/components/location-search.js.map +2 -2
  112. package/dist/components/moon-phase.d.ts +4 -21
  113. package/dist/components/moon-phase.d.ts.map +1 -1
  114. package/dist/components/moon-phase.js +34 -4
  115. package/dist/components/moon-phase.js.map +3 -3
  116. package/dist/components/natal-chart.d.ts +9 -43
  117. package/dist/components/natal-chart.d.ts.map +1 -1
  118. package/dist/components/natal-chart.js +346 -79
  119. package/dist/components/natal-chart.js.map +3 -3
  120. package/dist/components/numerology-card.d.ts +5 -37
  121. package/dist/components/numerology-card.d.ts.map +1 -1
  122. package/dist/components/numerology-card.js +58 -30
  123. package/dist/components/numerology-card.js.map +3 -3
  124. package/dist/components/panchang-table.d.ts +3 -62
  125. package/dist/components/panchang-table.d.ts.map +1 -1
  126. package/dist/components/panchang-table.js +62 -32
  127. package/dist/components/panchang-table.js.map +3 -3
  128. package/dist/components/shadbala-table.d.ts +18 -0
  129. package/dist/components/shadbala-table.d.ts.map +1 -0
  130. package/dist/components/shadbala-table.js +400 -0
  131. package/dist/components/shadbala-table.js.map +7 -0
  132. package/dist/components/synastry-chart.d.ts +9 -28
  133. package/dist/components/synastry-chart.d.ts.map +1 -1
  134. package/dist/components/synastry-chart.js +201 -56
  135. package/dist/components/synastry-chart.js.map +3 -3
  136. package/dist/components/tarot-card.d.ts +5 -29
  137. package/dist/components/tarot-card.d.ts.map +1 -1
  138. package/dist/components/tarot-card.js +59 -20
  139. package/dist/components/tarot-card.js.map +2 -2
  140. package/dist/components/tarot-spread.d.ts +2 -24
  141. package/dist/components/tarot-spread.d.ts.map +1 -1
  142. package/dist/components/tarot-spread.js +39 -13
  143. package/dist/components/tarot-spread.js.map +2 -2
  144. package/dist/components/transits-table.d.ts +21 -0
  145. package/dist/components/transits-table.d.ts.map +1 -0
  146. package/dist/components/transits-table.js +515 -0
  147. package/dist/components/transits-table.js.map +7 -0
  148. package/dist/components/vedic-kundli.d.ts +5 -28
  149. package/dist/components/vedic-kundli.d.ts.map +1 -1
  150. package/dist/components/vedic-kundli.js +147 -83
  151. package/dist/components/vedic-kundli.js.map +3 -3
  152. package/dist/components/yoga-list.d.ts +29 -0
  153. package/dist/components/yoga-list.d.ts.map +1 -0
  154. package/dist/components/yoga-list.js +389 -0
  155. package/dist/components/yoga-list.js.map +7 -0
  156. package/dist/index.cjs +3693 -1180
  157. package/dist/index.cjs.map +4 -4
  158. package/dist/index.d.ts +11 -4
  159. package/dist/index.d.ts.map +1 -1
  160. package/dist/index.js +3709 -1196
  161. package/dist/index.js.map +4 -4
  162. package/dist/manifest.d.ts +43 -0
  163. package/dist/manifest.d.ts.map +1 -0
  164. package/dist/manifest.json +7 -2
  165. package/dist/styles/tokens.css +73 -1
  166. package/dist/tokens/index.d.ts +6 -0
  167. package/dist/tokens/index.d.ts.map +1 -1
  168. package/dist/types/index.d.ts +2 -0
  169. package/dist/types/index.d.ts.map +1 -0
  170. package/dist/types/types.gen.d.ts +27811 -0
  171. package/dist/types/types.gen.d.ts.map +1 -0
  172. package/dist/utils/debounce.d.ts +9 -1
  173. package/dist/utils/debounce.d.ts.map +1 -1
  174. package/dist/utils/format.d.ts +29 -0
  175. package/dist/utils/format.d.ts.map +1 -0
  176. package/dist/utils/kundli-render.d.ts +63 -0
  177. package/dist/utils/kundli-render.d.ts.map +1 -0
  178. package/dist/utils/string.d.ts +14 -0
  179. package/dist/utils/string.d.ts.map +1 -0
  180. package/dist/version.d.ts +2 -0
  181. package/dist/version.d.ts.map +1 -0
  182. package/package.json +7 -1
  183. package/src/components/ashtakavarga-grid.ts +354 -0
  184. package/src/components/biorhythm-chart.ts +39 -84
  185. package/src/components/choghadiya-grid.ts +185 -0
  186. package/src/components/compatibility-card.ts +85 -52
  187. package/src/components/dasha-timeline.ts +55 -73
  188. package/src/components/data.ts +28 -16
  189. package/src/components/divisional-chart.ts +214 -0
  190. package/src/components/dosha-card.ts +72 -68
  191. package/src/components/endpoint-form.ts +80 -18
  192. package/src/components/guna-milan.ts +87 -47
  193. package/src/components/hexagram.ts +53 -43
  194. package/src/components/horoscope-card.ts +59 -43
  195. package/src/components/kp-planets-table.ts +8 -27
  196. package/src/components/location-search.ts +47 -23
  197. package/src/components/moon-phase.ts +28 -25
  198. package/src/components/natal-chart.ts +364 -110
  199. package/src/components/numerology-card.ts +86 -84
  200. package/src/components/panchang-table.ts +40 -78
  201. package/src/components/shadbala-table.ts +286 -0
  202. package/src/components/synastry-chart.ts +213 -97
  203. package/src/components/tarot-card.ts +76 -62
  204. package/src/components/tarot-spread.ts +72 -45
  205. package/src/components/transits-table.ts +350 -0
  206. package/src/components/vedic-kundli.ts +59 -173
  207. package/src/components/yoga-list.ts +328 -0
  208. package/src/index.ts +18 -26
  209. package/src/manifest.ts +340 -0
  210. package/src/styles/tokens.css +73 -1
  211. package/src/tokens/index.ts +14 -0
  212. package/src/types/types.gen.ts +3 -3
  213. package/src/utils/debounce.ts +23 -4
  214. package/src/utils/format.ts +75 -0
  215. package/src/utils/kundli-render.ts +197 -0
  216. package/src/utils/string.ts +23 -0
  217. package/src/version.ts +2 -0
  218. package/dist/utils/motion.d.ts +0 -13
  219. package/dist/utils/motion.d.ts.map +0 -1
  220. package/src/utils/motion.ts +0 -18
@@ -1,5 +1,13 @@
1
1
  /**
2
2
  * Lightweight debounce for input handlers. Used by location search.
3
+ *
4
+ * The returned function exposes a `.cancel()` method so callers can clear a
5
+ * pending invocation when the host element disconnects, preventing the timer
6
+ * from firing on a detached node and mutating reactive state after teardown.
3
7
  */
4
- export declare function debounce<F extends (...args: never[]) => unknown>(fn: F, wait: number): F;
8
+ export interface Debounced<F extends (...args: never[]) => unknown> {
9
+ (...args: Parameters<F>): void;
10
+ cancel: () => void;
11
+ }
12
+ export declare function debounce<F extends (...args: never[]) => unknown>(fn: F, wait: number): Debounced<F>;
5
13
  //# sourceMappingURL=debounce.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/utils/debounce.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,EAC/D,EAAE,EAAE,CAAC,EACL,IAAI,EAAE,MAAM,GACV,CAAC,CAMH"}
1
+ {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/utils/debounce.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO;IACjE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,EAC/D,EAAE,EAAE,CAAC,EACL,IAAI,EAAE,MAAM,GACV,SAAS,CAAC,CAAC,CAAC,CAgBd"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Display formatters for ISO timestamps and floats coming back from the API.
3
+ * Every helper returns "" for nullish or unparseable input so it falls out of
4
+ * template literals cleanly.
5
+ */
6
+ export declare function formatTime(input: unknown): string;
7
+ export declare function formatDate(input: unknown): string;
8
+ export declare function formatTimeRange(t: {
9
+ start?: string;
10
+ end?: string;
11
+ } | undefined): string;
12
+ export declare function formatNumber(value: unknown, dp?: number): string;
13
+ export declare function formatPercent(value: unknown, dp?: number): string;
14
+ /**
15
+ * CSS class name per aspect type. Used by natal and synastry chart aspect
16
+ * lines so the same color encoding (harmonious vs challenging) applies in
17
+ * both wheels. Keys are lowercase canonical names, values are CSS class
18
+ * suffixes the chart components define in their `:host` styles.
19
+ */
20
+ export declare const ASPECT_CLASS: Record<string, string>;
21
+ /**
22
+ * Normalize an aspect entry's `type` field to a lowercase, hyphen-separated
23
+ * canonical name (`SEMI_SEXTILE` → `semi-sextile`). Accepts any aspect-shaped
24
+ * object so both natal and synastry inter-aspect entries can share this.
25
+ */
26
+ export declare function normalizeAspect(a: {
27
+ type?: string;
28
+ }): string;
29
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYjD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWjD;AAED,wBAAgB,eAAe,CAC9B,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAC7C,MAAM,CAMR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,SAAI,GAAG,MAAM,CAG3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,SAAI,GAAG,MAAM,CAG5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM/C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,63 @@
1
+ import type { TemplateResult } from 'lit';
2
+ import { nothing } from 'lit';
3
+ export declare const KUNDLI_SIZE = 300;
4
+ export declare const KUNDLI_CENTER = 150;
5
+ /**
6
+ * Maps a lowercase rashi key (e.g. "aries") back to its canonical sign name
7
+ * (e.g. "Aries"). Used by every kundli consumer to bridge spec lowercase
8
+ * rashi keys to the title-cased SIGNS_ORDER tokens.
9
+ */
10
+ export declare const RASHI_TO_SIGN: Record<string, string>;
11
+ /**
12
+ * South Indian fixed-house square grid: house centers for planet text labels.
13
+ * House 1 is fixed top-center; positions are in the 300x300 viewBox.
14
+ */
15
+ export declare const SOUTH_HOUSE_CENTERS: Record<number, {
16
+ x: number;
17
+ y: number;
18
+ }>;
19
+ /**
20
+ * South Indian sign abbreviation positions (slightly outward from center).
21
+ */
22
+ export declare const SOUTH_SIGN_POSITIONS: Record<number, {
23
+ x: number;
24
+ y: number;
25
+ }>;
26
+ /**
27
+ * North Indian style: 12 triangular house positions.
28
+ * Lagna (house 1) is the top diamond, numbered clockwise.
29
+ * Centers represent the visual midpoint of each triangular cell.
30
+ */
31
+ export declare const NORTH_HOUSE_CENTERS: Record<number, {
32
+ x: number;
33
+ y: number;
34
+ }>;
35
+ export interface HouseDef {
36
+ /** 1-based house number. */
37
+ number: number;
38
+ /** Sign name (TitleCase, e.g. "Aries"). */
39
+ sign: string;
40
+ /** Planet abbreviation strings to display. */
41
+ planets: string[];
42
+ /** Whether this house is the ascendant (Lagna). */
43
+ isLagna: boolean;
44
+ }
45
+ /**
46
+ * Render a single house group: lagna highlight, sign abbreviation, planet labels.
47
+ * Returns an SVG fragment for use inside an `<svg>` element.
48
+ */
49
+ export declare function renderSouthHouseGroup(h: HouseDef): TemplateResult | typeof nothing;
50
+ /**
51
+ * Render a north-Indian-style kundli wheel frame (grid lines only).
52
+ * Returns the SVG structural lines; call `renderNorthHouseGroup` for content.
53
+ */
54
+ export declare function renderNorthFrame(): TemplateResult;
55
+ /**
56
+ * Render a north-Indian house group (sign abbr + house number + planets).
57
+ */
58
+ export declare function renderNorthHouseGroup(h: HouseDef): TemplateResult | typeof nothing;
59
+ /**
60
+ * Render the south-Indian square frame (border diamond + inner square + radial lines).
61
+ */
62
+ export declare function renderSouthFrame(): TemplateResult;
63
+ //# sourceMappingURL=kundli-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kundli-render.d.ts","sourceRoot":"","sources":["../../src/utils/kundli-render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAO,MAAM,KAAK,CAAC;AAInC,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEhD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAaxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAazE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAaxE,CAAC;AAEF,MAAM,WAAW,QAAQ;IACxB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,CAAC,EAAE,QAAQ,GACT,cAAc,GAAG,OAAO,OAAO,CAqCjC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAUjD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,CAAC,EAAE,QAAQ,GACT,cAAc,GAAG,OAAO,OAAO,CA2BjC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAajD"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Shared string helpers used across components. Single source of truth so the
3
+ * same formatting rules apply to every key/label/title that surfaces in the
4
+ * shadow tree.
5
+ *
6
+ * - `capitalize`: title-cases the first character, lowercases the rest. Used
7
+ * when matching API-supplied planet/sign names against the glyph maps in
8
+ * `tokens/index.ts`, which use canonical TitleCase keys.
9
+ * - `humanize`: turns an API key (`birth_date`, `birthDate`, `mahadasha-end`)
10
+ * into a label suitable for display ("Birth date", "Mahadasha end").
11
+ */
12
+ export declare function capitalize(s: string): string;
13
+ export declare function humanize(s: string): string;
14
+ //# sourceMappingURL=string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK1C"}
@@ -0,0 +1,2 @@
1
+ export declare const ROXY_UI_VERSION = "0.2.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,UAAU,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roxyapi/ui",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "Web components for the RoxyAPI catalog. Drop-in charts, tables, cards, forms for astrology, tarot, numerology, biorhythm, I Ching, crystals, dreams, angel numbers, and more. One key, beautiful in 30 minutes.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -16,6 +16,9 @@
16
16
  "types": "./dist/components/*.d.ts",
17
17
  "import": "./dist/components/*.js"
18
18
  },
19
+ "./types": {
20
+ "types": "./dist/types/index.d.ts"
21
+ },
19
22
  "./styles/tokens.css": "./dist/styles/tokens.css",
20
23
  "./registry/*": "./dist/registry/*.json"
21
24
  },
@@ -63,6 +66,9 @@
63
66
  "./dist/components/*.js",
64
67
  "./dist/cdn/*.js"
65
68
  ],
69
+ "engines": {
70
+ "node": ">=18"
71
+ },
66
72
  "peerDependencies": {
67
73
  "lit": "^3.0.0"
68
74
  },
@@ -0,0 +1,354 @@
1
+ import { css, html, LitElement, nothing } from 'lit';
2
+ import { customElement, property, state } from 'lit/decorators.js';
3
+ import { SIGN_GLYPH } from '../tokens/index.js';
4
+ import type { AshtakavargaResponse } from '../types/index.js';
5
+ import { baseStyles } from '../utils/base-styles.js';
6
+
7
+ type Tab = 'sarva' | 'bhinna' | 'pinda';
8
+
9
+ const TAB_LABELS: Record<Tab, string> = {
10
+ sarva: 'Sarvashtakavarga',
11
+ bhinna: 'Bhinnashtakavarga',
12
+ pinda: 'Shodhya Pinda',
13
+ };
14
+
15
+ const TABS: Tab[] = ['sarva', 'bhinna', 'pinda'];
16
+
17
+ /**
18
+ * Ashtakavarga grid with three tabbed views: Sarvashtakavarga, Bhinnashtakavarga,
19
+ * and Shodhya Pinda. Pass `data` from /vedic-astrology/ashtakavarga.
20
+ */
21
+ @customElement('roxy-ashtakavarga-grid')
22
+ export class RoxyAshtakavargaGrid extends LitElement {
23
+ static styles = [
24
+ baseStyles,
25
+ css`
26
+ .wrap {
27
+ display: grid;
28
+ gap: var(--roxy-space-md, 1rem);
29
+ }
30
+
31
+ .head {
32
+ display: flex;
33
+ justify-content: space-between;
34
+ align-items: baseline;
35
+ gap: var(--roxy-space-md, 1rem);
36
+ flex-wrap: wrap;
37
+ }
38
+
39
+ .title {
40
+ font-size: var(--roxy-text-lg, 1.125rem);
41
+ font-weight: var(--roxy-weight-bold, 600);
42
+ margin: 0;
43
+ }
44
+
45
+ .subtitle {
46
+ color: var(--roxy-muted, #71717a);
47
+ font-size: var(--roxy-text-sm, 0.875rem);
48
+ margin: 0;
49
+ }
50
+
51
+ /* Tabs */
52
+ .tablist {
53
+ display: flex;
54
+ gap: 2px;
55
+ border-bottom: 2px solid var(--roxy-border, #e4e4e7);
56
+ }
57
+
58
+ .tab {
59
+ padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
60
+ font-size: var(--roxy-text-sm, 0.875rem);
61
+ background: none;
62
+ border: none;
63
+ border-bottom: 2px solid transparent;
64
+ margin-bottom: -2px;
65
+ cursor: pointer;
66
+ color: var(--roxy-muted, #71717a);
67
+ font-family: inherit;
68
+ transition: color var(--roxy-motion-duration, 200ms) var(--roxy-motion-easing, ease);
69
+ }
70
+
71
+ .tab[aria-selected='true'] {
72
+ color: var(--roxy-accent-fg, #b45309);
73
+ border-bottom-color: var(--roxy-accent, #f59e0b);
74
+ font-weight: var(--roxy-weight-bold, 600);
75
+ }
76
+
77
+ .tab:hover:not([aria-selected='true']) {
78
+ color: var(--roxy-fg, #0a0a0a);
79
+ }
80
+
81
+ /* Tables */
82
+ .overflow-scroll {
83
+ overflow-x: auto;
84
+ -webkit-overflow-scrolling: touch;
85
+ }
86
+
87
+ table {
88
+ width: 100%;
89
+ border-collapse: collapse;
90
+ font-size: var(--roxy-text-sm, 0.875rem);
91
+ }
92
+
93
+ th,
94
+ td {
95
+ padding: var(--roxy-space-sm, 0.5rem);
96
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
97
+ text-align: center;
98
+ }
99
+
100
+ th {
101
+ color: var(--roxy-muted, #71717a);
102
+ font-weight: var(--roxy-weight-bold, 600);
103
+ text-transform: uppercase;
104
+ font-size: var(--roxy-text-xs, 0.75rem);
105
+ letter-spacing: 0.06em;
106
+ }
107
+
108
+ td:first-child,
109
+ th:first-child {
110
+ text-align: left;
111
+ }
112
+
113
+ .glyph {
114
+ font-size: 1.1em;
115
+ margin-right: 3px;
116
+ line-height: 1;
117
+ }
118
+
119
+ .planet-cell {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 4px;
123
+ white-space: nowrap;
124
+ }
125
+
126
+ .total-row td {
127
+ font-weight: var(--roxy-weight-bold, 600);
128
+ border-top: 2px solid var(--roxy-border, #e4e4e7);
129
+ border-bottom: none;
130
+ }
131
+
132
+ /* Heat cells */
133
+ .heat-cell {
134
+ border-radius: var(--roxy-radius-sm, 4px);
135
+ font-weight: var(--roxy-weight-bold, 600);
136
+ min-width: 2rem;
137
+ font-variant-numeric: tabular-nums;
138
+ }
139
+
140
+ .heat-1 { background: var(--roxy-heat-1, #f0fdf4); color: var(--roxy-fg, #0a0a0a); }
141
+ .heat-2 { background: var(--roxy-heat-2, #d1fae5); color: var(--roxy-fg, #0a0a0a); }
142
+ .heat-3 { background: var(--roxy-heat-3, #a7f3d0); color: var(--roxy-fg, #0a0a0a); }
143
+ .heat-4 { background: var(--roxy-heat-4, #fde68a); color: var(--roxy-fg, #0a0a0a); }
144
+ .heat-5 { background: var(--roxy-heat-5, #fdba74); color: var(--roxy-fg, #0a0a0a); }
145
+ .heat-6 { background: var(--roxy-heat-6, #fb923c); color: var(--roxy-fg, #0a0a0a); }
146
+ .heat-7 { background: var(--roxy-heat-7, #ef4444); color: var(--roxy-fg, #0a0a0a); }
147
+
148
+ /* Bhinna grid: planet header column narrower */
149
+ .bhinna-table th:first-child,
150
+ .bhinna-table td:first-child {
151
+ min-width: 5rem;
152
+ }
153
+ `,
154
+ ];
155
+
156
+ @property({ attribute: false })
157
+ data: AshtakavargaResponse | null = null;
158
+
159
+ @state()
160
+ activeTab: Tab = 'sarva';
161
+
162
+ render() {
163
+ if (!this.data) {
164
+ return html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;
165
+ }
166
+
167
+ const signs = this.data.signs ?? [];
168
+
169
+ return html`<div class="wrap" aria-label="Ashtakavarga grid">
170
+ <div class="head">
171
+ <h2 class="title">Ashtakavarga</h2>
172
+ ${
173
+ signs.length
174
+ ? html`<p class="subtitle">${signs.length} signs</p>`
175
+ : nothing
176
+ }
177
+ </div>
178
+
179
+ <div
180
+ class="tablist"
181
+ role="tablist"
182
+ aria-label="Ashtakavarga views"
183
+ @keydown=${this.onTabKeyDown}
184
+ >
185
+ ${TABS.map(
186
+ (tab) => html`<button
187
+ class="tab"
188
+ role="tab"
189
+ id="tab-${tab}"
190
+ aria-selected=${this.activeTab === tab ? 'true' : 'false'}
191
+ aria-controls="panel-${tab}"
192
+ tabindex=${this.activeTab === tab ? '0' : '-1'}
193
+ @click=${() => {
194
+ this.activeTab = tab;
195
+ }}
196
+ >
197
+ ${TAB_LABELS[tab]}
198
+ </button>`,
199
+ )}
200
+ </div>
201
+
202
+ <div
203
+ id="panel-${this.activeTab}"
204
+ role="tabpanel"
205
+ aria-labelledby="tab-${this.activeTab}"
206
+ >
207
+ ${
208
+ this.activeTab === 'sarva'
209
+ ? this.renderSarva(signs)
210
+ : this.activeTab === 'bhinna'
211
+ ? this.renderBhinna(signs)
212
+ : this.renderPinda()
213
+ }
214
+ </div>
215
+ </div>`;
216
+ }
217
+
218
+ private onTabKeyDown(e: KeyboardEvent) {
219
+ const idx = TABS.indexOf(this.activeTab);
220
+ if (e.key === 'ArrowRight') {
221
+ e.preventDefault();
222
+ this.activeTab = TABS[(idx + 1) % TABS.length];
223
+ this.focusActiveTab();
224
+ } else if (e.key === 'ArrowLeft') {
225
+ e.preventDefault();
226
+ this.activeTab = TABS[(idx - 1 + TABS.length) % TABS.length];
227
+ this.focusActiveTab();
228
+ }
229
+ }
230
+
231
+ private focusActiveTab() {
232
+ requestAnimationFrame(() => {
233
+ const btn = this.shadowRoot?.querySelector<HTMLButtonElement>(
234
+ `#tab-${this.activeTab}`,
235
+ );
236
+ btn?.focus();
237
+ });
238
+ }
239
+
240
+ private heatClass(count: number): string {
241
+ if (count <= 1) return 'heat-1';
242
+ if (count <= 2) return 'heat-2';
243
+ if (count <= 3) return 'heat-3';
244
+ if (count <= 4) return 'heat-4';
245
+ if (count <= 5) return 'heat-5';
246
+ if (count <= 6) return 'heat-6';
247
+ return 'heat-7';
248
+ }
249
+
250
+ private renderSarva(signs: AshtakavargaResponse['signs']) {
251
+ const sav = this.data!.sarvashtakavarga;
252
+ if (!sav) return html`<p class="roxy-empty">No sarvashtakavarga data</p>`;
253
+
254
+ return html`<div class="overflow-scroll">
255
+ <table aria-label="Sarvashtakavarga bindu counts per sign">
256
+ <thead>
257
+ <tr>
258
+ <th scope="col">Sign</th>
259
+ <th scope="col">Bindus</th>
260
+ </tr>
261
+ </thead>
262
+ <tbody>
263
+ ${signs.map((sign, i) => {
264
+ const count = sav.bindus[i] ?? 0;
265
+ const hc = this.heatClass(count);
266
+ return html`<tr>
267
+ <td>
268
+ <div class="planet-cell">
269
+ <span class="glyph" aria-hidden="true">${SIGN_GLYPH[sign] ?? ''}</span>
270
+ ${sign}
271
+ </div>
272
+ </td>
273
+ <td class="${`heat-cell ${hc}`}">${count}</td>
274
+ </tr>`;
275
+ })}
276
+ </tbody>
277
+ <tfoot>
278
+ <tr class="total-row">
279
+ <td>Total</td>
280
+ <td>${sav.total}</td>
281
+ </tr>
282
+ </tfoot>
283
+ </table>
284
+ </div>`;
285
+ }
286
+
287
+ private renderBhinna(signs: AshtakavargaResponse['signs']) {
288
+ const bhinna = this.data!.bhinnashtakavarga;
289
+ if (!bhinna?.length)
290
+ return html`<p class="roxy-empty">No bhinnashtakavarga data</p>`;
291
+
292
+ return html`<div class="overflow-scroll">
293
+ <table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid">
294
+ <thead>
295
+ <tr>
296
+ <th scope="col">Planet</th>
297
+ ${signs.map(
298
+ (s) =>
299
+ html`<th scope="col" title=${s}>${SIGN_GLYPH[s] ?? s.slice(0, 2)}</th>`,
300
+ )}
301
+ <th scope="col">Total</th>
302
+ </tr>
303
+ </thead>
304
+ <tbody>
305
+ ${bhinna.map(
306
+ (row) => html`<tr>
307
+ <td>${row.planet}</td>
308
+ ${row.bindus.map((count) => {
309
+ const hc = this.heatClass(count);
310
+ return html`<td class="${`heat-cell ${hc}`}">${count}</td>`;
311
+ })}
312
+ <td>${row.total}</td>
313
+ </tr>`,
314
+ )}
315
+ </tbody>
316
+ </table>
317
+ </div>`;
318
+ }
319
+
320
+ private renderPinda() {
321
+ const pinda = this.data!.shodhyaPinda;
322
+ if (!pinda?.length)
323
+ return html`<p class="roxy-empty">No shodhya pinda data</p>`;
324
+
325
+ return html`<div class="overflow-scroll">
326
+ <table aria-label="Shodhya Pinda planet strength scores">
327
+ <thead>
328
+ <tr>
329
+ <th scope="col">Planet</th>
330
+ <th scope="col">Rashi Pinda</th>
331
+ <th scope="col">Graha Pinda</th>
332
+ <th scope="col">Shodhya Pinda</th>
333
+ </tr>
334
+ </thead>
335
+ <tbody>
336
+ ${pinda.map(
337
+ (row) => html`<tr>
338
+ <td>${row.planet}</td>
339
+ <td>${row.rashiPinda}</td>
340
+ <td>${row.grahaPinda}</td>
341
+ <td>${row.shodhyaPinda}</td>
342
+ </tr>`,
343
+ )}
344
+ </tbody>
345
+ </table>
346
+ </div>`;
347
+ }
348
+ }
349
+
350
+ declare global {
351
+ interface HTMLElementTagNameMap {
352
+ 'roxy-ashtakavarga-grid': RoxyAshtakavargaGrid;
353
+ }
354
+ }