@roxyapi/ui 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/AGENTS.md +6 -0
  2. package/README.md +9 -3
  3. package/dist/cdn/components/ashtakavarga-grid.js +349 -0
  4. package/dist/cdn/components/ashtakavarga-grid.js.map +7 -0
  5. package/dist/cdn/components/choghadiya-grid.js +239 -0
  6. package/dist/cdn/components/choghadiya-grid.js.map +7 -0
  7. package/dist/cdn/components/compatibility-card.js +6 -6
  8. package/dist/cdn/components/compatibility-card.js.map +1 -1
  9. package/dist/cdn/components/dasha-timeline.js +4 -4
  10. package/dist/cdn/components/dasha-timeline.js.map +1 -1
  11. package/dist/cdn/components/data.js +9 -9
  12. package/dist/cdn/components/data.js.map +4 -4
  13. package/dist/cdn/components/divisional-chart.js +279 -0
  14. package/dist/cdn/components/divisional-chart.js.map +7 -0
  15. package/dist/cdn/components/dosha-card.js +39 -39
  16. package/dist/cdn/components/dosha-card.js.map +3 -3
  17. package/dist/cdn/components/endpoint-form.js +8 -8
  18. package/dist/cdn/components/endpoint-form.js.map +4 -4
  19. package/dist/cdn/components/guna-milan.js +64 -22
  20. package/dist/cdn/components/guna-milan.js.map +3 -3
  21. package/dist/cdn/components/hexagram.js +9 -9
  22. package/dist/cdn/components/hexagram.js.map +3 -3
  23. package/dist/cdn/components/horoscope-card.js +28 -21
  24. package/dist/cdn/components/horoscope-card.js.map +4 -4
  25. package/dist/cdn/components/kp-planets-table.js +4 -4
  26. package/dist/cdn/components/kp-planets-table.js.map +1 -1
  27. package/dist/cdn/components/location-search.js.map +2 -2
  28. package/dist/cdn/components/moon-phase.js +13 -13
  29. package/dist/cdn/components/moon-phase.js.map +3 -3
  30. package/dist/cdn/components/natal-chart.js +196 -22
  31. package/dist/cdn/components/natal-chart.js.map +4 -4
  32. package/dist/cdn/components/numerology-card.js +6 -6
  33. package/dist/cdn/components/numerology-card.js.map +4 -4
  34. package/dist/cdn/components/panchang-table.js +9 -9
  35. package/dist/cdn/components/panchang-table.js.map +1 -1
  36. package/dist/cdn/components/shadbala-table.js +312 -0
  37. package/dist/cdn/components/shadbala-table.js.map +7 -0
  38. package/dist/cdn/components/synastry-chart.js +21 -21
  39. package/dist/cdn/components/synastry-chart.js.map +4 -4
  40. package/dist/cdn/components/transits-table.js +396 -0
  41. package/dist/cdn/components/transits-table.js.map +7 -0
  42. package/dist/cdn/components/vedic-kundli.js +51 -29
  43. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  44. package/dist/cdn/components/yoga-list.js +334 -0
  45. package/dist/cdn/components/yoga-list.js.map +7 -0
  46. package/dist/cdn/roxy-ui.js +1877 -522
  47. package/dist/cdn/roxy-ui.js.map +4 -4
  48. package/dist/components/ashtakavarga-grid.d.ts +26 -0
  49. package/dist/components/ashtakavarga-grid.d.ts.map +1 -0
  50. package/dist/components/ashtakavarga-grid.js +457 -0
  51. package/dist/components/ashtakavarga-grid.js.map +7 -0
  52. package/dist/components/choghadiya-grid.d.ts +19 -0
  53. package/dist/components/choghadiya-grid.d.ts.map +1 -0
  54. package/dist/components/choghadiya-grid.js +304 -0
  55. package/dist/components/choghadiya-grid.js.map +7 -0
  56. package/dist/components/compatibility-card.js.map +1 -1
  57. package/dist/components/dasha-timeline.js.map +1 -1
  58. package/dist/components/data.d.ts +5 -7
  59. package/dist/components/data.d.ts.map +1 -1
  60. package/dist/components/data.js +7 -5
  61. package/dist/components/data.js.map +3 -3
  62. package/dist/components/divisional-chart.d.ts +20 -0
  63. package/dist/components/divisional-chart.d.ts.map +1 -0
  64. package/dist/components/divisional-chart.js +471 -0
  65. package/dist/components/divisional-chart.js.map +7 -0
  66. package/dist/components/dosha-card.d.ts.map +1 -1
  67. package/dist/components/dosha-card.js +33 -30
  68. package/dist/components/dosha-card.js.map +2 -2
  69. package/dist/components/endpoint-form.d.ts.map +1 -1
  70. package/dist/components/endpoint-form.js +5 -3
  71. package/dist/components/endpoint-form.js.map +3 -3
  72. package/dist/components/guna-milan.d.ts.map +1 -1
  73. package/dist/components/guna-milan.js +61 -12
  74. package/dist/components/guna-milan.js.map +3 -3
  75. package/dist/components/hexagram.js +17 -0
  76. package/dist/components/hexagram.js.map +2 -2
  77. package/dist/components/horoscope-card.d.ts.map +1 -1
  78. package/dist/components/horoscope-card.js +30 -3
  79. package/dist/components/horoscope-card.js.map +3 -3
  80. package/dist/components/kp-planets-table.js.map +1 -1
  81. package/dist/components/location-search.d.ts +2 -3
  82. package/dist/components/location-search.d.ts.map +1 -1
  83. package/dist/components/location-search.js.map +2 -2
  84. package/dist/components/moon-phase.js +17 -0
  85. package/dist/components/moon-phase.js.map +2 -2
  86. package/dist/components/natal-chart.d.ts +2 -0
  87. package/dist/components/natal-chart.d.ts.map +1 -1
  88. package/dist/components/natal-chart.js +243 -36
  89. package/dist/components/natal-chart.js.map +3 -3
  90. package/dist/components/numerology-card.d.ts.map +1 -1
  91. package/dist/components/numerology-card.js +5 -3
  92. package/dist/components/numerology-card.js.map +3 -3
  93. package/dist/components/panchang-table.js.map +1 -1
  94. package/dist/components/shadbala-table.d.ts +18 -0
  95. package/dist/components/shadbala-table.d.ts.map +1 -0
  96. package/dist/components/shadbala-table.js +400 -0
  97. package/dist/components/shadbala-table.js.map +7 -0
  98. package/dist/components/synastry-chart.d.ts.map +1 -1
  99. package/dist/components/synastry-chart.js +34 -29
  100. package/dist/components/synastry-chart.js.map +3 -3
  101. package/dist/components/transits-table.d.ts +21 -0
  102. package/dist/components/transits-table.d.ts.map +1 -0
  103. package/dist/components/transits-table.js +520 -0
  104. package/dist/components/transits-table.js.map +7 -0
  105. package/dist/components/vedic-kundli.d.ts +3 -6
  106. package/dist/components/vedic-kundli.d.ts.map +1 -1
  107. package/dist/components/vedic-kundli.js +132 -80
  108. package/dist/components/vedic-kundli.js.map +3 -3
  109. package/dist/components/yoga-list.d.ts +29 -0
  110. package/dist/components/yoga-list.d.ts.map +1 -0
  111. package/dist/components/yoga-list.js +389 -0
  112. package/dist/components/yoga-list.js.map +7 -0
  113. package/dist/index.cjs +2707 -980
  114. package/dist/index.cjs.map +4 -4
  115. package/dist/index.d.ts +7 -2
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +2714 -987
  118. package/dist/index.js.map +4 -4
  119. package/dist/manifest.d.ts +4 -10
  120. package/dist/manifest.d.ts.map +1 -1
  121. package/dist/manifest.json +7 -2
  122. package/dist/styles/tokens.css +26 -0
  123. package/dist/tokens/index.d.ts +6 -0
  124. package/dist/tokens/index.d.ts.map +1 -1
  125. package/dist/types/types.gen.d.ts +2 -2
  126. package/dist/utils/format.d.ts +15 -1
  127. package/dist/utils/format.d.ts.map +1 -1
  128. package/dist/utils/kundli-render.d.ts +63 -0
  129. package/dist/utils/kundli-render.d.ts.map +1 -0
  130. package/dist/utils/string.d.ts +14 -0
  131. package/dist/utils/string.d.ts.map +1 -0
  132. package/dist/version.d.ts +1 -1
  133. package/package.json +1 -1
  134. package/src/components/ashtakavarga-grid.ts +354 -0
  135. package/src/components/choghadiya-grid.ts +185 -0
  136. package/src/components/data.ts +8 -15
  137. package/src/components/divisional-chart.ts +214 -0
  138. package/src/components/dosha-card.ts +53 -36
  139. package/src/components/endpoint-form.ts +1 -7
  140. package/src/components/guna-milan.ts +74 -16
  141. package/src/components/horoscope-card.ts +8 -4
  142. package/src/components/location-search.ts +2 -3
  143. package/src/components/natal-chart.ts +251 -42
  144. package/src/components/numerology-card.ts +1 -7
  145. package/src/components/shadbala-table.ts +286 -0
  146. package/src/components/synastry-chart.ts +13 -39
  147. package/src/components/transits-table.ts +358 -0
  148. package/src/components/vedic-kundli.ts +38 -143
  149. package/src/components/yoga-list.ts +328 -0
  150. package/src/index.ts +8 -6
  151. package/src/manifest.ts +74 -100
  152. package/src/styles/tokens.css +26 -0
  153. package/src/tokens/index.ts +9 -0
  154. package/src/types/types.gen.ts +2 -2
  155. package/src/utils/format.ts +21 -3
  156. package/src/utils/kundli-render.ts +197 -0
  157. package/src/utils/string.ts +23 -0
  158. package/src/version.ts +1 -1
  159. package/dist/utils/motion.d.ts +0 -13
  160. package/dist/utils/motion.d.ts.map +0 -1
  161. package/src/utils/motion.ts +0 -18
@@ -1,14 +1,13 @@
1
1
  /**
2
2
  * Single source of truth for component metadata. Every consumer that needs
3
- * the (tag, pascal, slug, domain, description, heading, endpoints) tuple
4
- * reads from here: scripts/build-react.ts, scripts/build-registry.ts,
5
- * scripts/sync-docs.ts, scripts/build-widgets.ts, and the browser-side
6
- * apps/docs/manifest.js (mirrored at build time).
3
+ * the (tag, pascal, slug, description, heading) tuple reads from here:
4
+ * scripts/build-react.ts, scripts/build-registry.ts, scripts/sync-docs.ts,
5
+ * scripts/build-widgets.ts, and the browser-side apps/docs/manifest.js
6
+ * (mirrored at build time).
7
7
  *
8
8
  * Hand-maintained. Add a component → add one entry here. The OpenAPI spec
9
9
  * does not yet carry component metadata, so this stays manual.
10
10
  */
11
- export type RoxyDomain = 'astrology' | 'vedic' | 'numerology' | 'tarot' | 'biorhythm' | 'iching' | 'utility';
12
11
  export interface RoxyComponent {
13
12
  /** Pascal-case React export name, e.g. RoxyNatalChart */
14
13
  pascal: string;
@@ -16,12 +15,8 @@ export interface RoxyComponent {
16
15
  tag: string;
17
16
  /** Slug used in registry filenames and shadcn paths, e.g. natal-chart */
18
17
  slug: string;
19
- /** Domain bucket for filtering. */
20
- domain: RoxyDomain;
21
18
  /** Short human-readable heading shown on demo cards. */
22
19
  heading: string;
23
- /** SDK methods this component is designed to render. */
24
- endpoints: string[];
25
20
  /** One-line description for registry / docs / SEO meta. */
26
21
  description: string;
27
22
  /** Domain column label in the synced README/AGENTS table. */
@@ -44,6 +39,5 @@ export interface RoxyComponent {
44
39
  selfFetching?: boolean;
45
40
  }
46
41
  export declare const ROXY_COMPONENTS: readonly RoxyComponent[];
47
- export type RoxyComponentTag = (typeof ROXY_COMPONENTS)[number]['tag'];
48
42
  export type RoxyComponentSlug = (typeof ROXY_COMPONENTS)[number]['slug'];
49
43
  //# sourceMappingURL=manifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,UAAU,GACnB,WAAW,GACX,OAAO,GACP,YAAY,GACZ,OAAO,GACP,WAAW,GACX,QAAQ,GACR,SAAS,CAAC;AAEb,MAAM,WAAW,aAAa;IAC7B,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAmTnD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC7B,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAuSnD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
- "generatedAt": "2026-05-10T18:20:57.839Z",
3
2
  "components": [
3
+ "shadbala-table",
4
4
  "tarot-spread",
5
5
  "natal-chart",
6
6
  "biorhythm-chart",
@@ -9,11 +9,16 @@
9
9
  "horoscope-card",
10
10
  "dasha-timeline",
11
11
  "hexagram",
12
+ "transits-table",
12
13
  "location-search",
14
+ "choghadiya-grid",
13
15
  "tarot-card",
14
16
  "kp-planets-table",
15
17
  "endpoint-form",
18
+ "divisional-chart",
19
+ "ashtakavarga-grid",
16
20
  "data",
21
+ "yoga-list",
17
22
  "panchang-table",
18
23
  "guna-milan",
19
24
  "moon-phase",
@@ -21,4 +26,4 @@
21
26
  "synastry-chart",
22
27
  "compatibility-card"
23
28
  ]
24
- }
29
+ }
@@ -89,6 +89,16 @@
89
89
  /* Motion */
90
90
  --roxy-motion-duration: 200ms;
91
91
  --roxy-motion-easing: cubic-bezier(0.4, 0, 0.2, 1);
92
+
93
+ /* Heat scale: 7-step gradient used by ashtakavarga bindu cells.
94
+ * Low bindus (1) are cool green; high bindus (7+) are hot red. */
95
+ --roxy-heat-1: #f0fdf4;
96
+ --roxy-heat-2: #d1fae5;
97
+ --roxy-heat-3: #a7f3d0;
98
+ --roxy-heat-4: #fde68a;
99
+ --roxy-heat-5: #fdba74;
100
+ --roxy-heat-6: #fb923c;
101
+ --roxy-heat-7: #ef4444;
92
102
  }
93
103
 
94
104
  /* Dark theme via system preference */
@@ -123,6 +133,14 @@
123
133
  --roxy-shadow-md:
124
134
  0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);
125
135
  --roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
136
+
137
+ --roxy-heat-1: #052e16;
138
+ --roxy-heat-2: #14532d;
139
+ --roxy-heat-3: #166534;
140
+ --roxy-heat-4: #92400e;
141
+ --roxy-heat-5: #b45309;
142
+ --roxy-heat-6: #c2410c;
143
+ --roxy-heat-7: #b91c1c;
126
144
  }
127
145
  }
128
146
 
@@ -182,6 +200,14 @@
182
200
  --roxy-shadow-md:
183
201
  0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);
184
202
  --roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
203
+
204
+ --roxy-heat-1: #052e16;
205
+ --roxy-heat-2: #14532d;
206
+ --roxy-heat-3: #166534;
207
+ --roxy-heat-4: #92400e;
208
+ --roxy-heat-5: #b45309;
209
+ --roxy-heat-6: #c2410c;
210
+ --roxy-heat-7: #b91c1c;
185
211
  }
186
212
 
187
213
  /* Reduced motion override */
@@ -8,6 +8,12 @@ export declare const PLANET_ABBR: Record<string, string>;
8
8
  export declare const SIGN_GLYPH: Record<string, string>;
9
9
  export declare const SIGN_ABBR: Record<string, string>;
10
10
  export declare const SIGNS_ORDER: readonly ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"];
11
+ /**
12
+ * Lowercase rashi keys in canonical zodiac order. Derived from `SIGNS_ORDER`
13
+ * so the two stay in lockstep. The /vedic-astrology/birth-chart response
14
+ * carries planet buckets keyed by these names.
15
+ */
16
+ export declare const RASHI_KEYS: readonly Lowercase<(typeof SIGNS_ORDER)[number]>[];
11
17
  /** Aspect symbols. Used by synastry and natal chart aspect tables. */
12
18
  export declare const ASPECT_SYMBOL: Record<string, string>;
13
19
  /** Trigrams used by I Ching hexagrams. Eight trigrams compose 64 hexagrams. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuB/C,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAe9C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAa7C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAa5C,CAAC;AAEF,eAAO,MAAM,WAAW,wIAad,CAAC;AAEX,sEAAsE;AACtE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQhD,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBhD,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASnD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuB/C,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAe9C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAa7C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAa5C,CAAC;AAEF,eAAO,MAAM,WAAW,wIAad,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAElB,SAAS,SAAS,CAAC,CAAC,OAAO,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;AAExD,sEAAsE;AACtE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQhD,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBhD,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASnD,CAAC"}
@@ -27210,7 +27210,7 @@ export type ListCountriesData = {
27210
27210
  path?: never;
27211
27211
  query?: {
27212
27212
  /**
27213
- * Maximum items to return per page. Range: 1-50, default 50.
27213
+ * Maximum items to return per page. Range: 1-250, default 50.
27214
27214
  */
27215
27215
  limit?: number;
27216
27216
  /**
@@ -27373,7 +27373,7 @@ export type GetCitiesByCountryData = {
27373
27373
  };
27374
27374
  query?: {
27375
27375
  /**
27376
- * Maximum items to return per page. Range: 1-200, default 50.
27376
+ * Maximum items to return per page. Range: 1-100, default 20.
27377
27377
  */
27378
27378
  limit?: number;
27379
27379
  /**
@@ -11,5 +11,19 @@ export declare function formatTimeRange(t: {
11
11
  } | undefined): string;
12
12
  export declare function formatNumber(value: unknown, dp?: number): string;
13
13
  export declare function formatPercent(value: unknown, dp?: number): string;
14
- export declare function formatLongitude(value: unknown): 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;
15
29
  //# sourceMappingURL=format.d.ts.map
@@ -1 +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,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGtD"}
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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const ROXY_UI_VERSION = "0.1.3";
1
+ export declare const ROXY_UI_VERSION = "0.2.1";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roxyapi/ui",
3
- "version": "0.1.3",
3
+ "version": "0.2.1",
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",
@@ -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
+ }