@roxyapi/ui 0.4.1 → 0.6.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 (235) hide show
  1. package/AGENTS.md +21 -0
  2. package/README.md +17 -1
  3. package/dist/cdn/components/ashtakavarga-grid.js +3 -362
  4. package/dist/cdn/components/ashtakavarga-grid.js.map +4 -4
  5. package/dist/cdn/components/biorhythm-chart.js +3 -226
  6. package/dist/cdn/components/biorhythm-chart.js.map +4 -4
  7. package/dist/cdn/components/choghadiya-grid.js +3 -232
  8. package/dist/cdn/components/choghadiya-grid.js.map +4 -4
  9. package/dist/cdn/components/compatibility-card.js +3 -231
  10. package/dist/cdn/components/compatibility-card.js.map +4 -4
  11. package/dist/cdn/components/dasha-timeline.js +3 -283
  12. package/dist/cdn/components/dasha-timeline.js.map +4 -4
  13. package/dist/cdn/components/data.js +3 -230
  14. package/dist/cdn/components/data.js.map +4 -4
  15. package/dist/cdn/components/divisional-chart.js +3 -356
  16. package/dist/cdn/components/divisional-chart.js.map +4 -4
  17. package/dist/cdn/components/dosha-card.js +3 -226
  18. package/dist/cdn/components/dosha-card.js.map +4 -4
  19. package/dist/cdn/components/endpoint-form.js +2 -243
  20. package/dist/cdn/components/endpoint-form.js.map +2 -2
  21. package/dist/cdn/components/guna-milan.js +3 -270
  22. package/dist/cdn/components/guna-milan.js.map +4 -4
  23. package/dist/cdn/components/hexagram.js +3 -247
  24. package/dist/cdn/components/hexagram.js.map +4 -4
  25. package/dist/cdn/components/horoscope-card.js +3 -281
  26. package/dist/cdn/components/horoscope-card.js.map +4 -4
  27. package/dist/cdn/components/kp-chart.js +3 -278
  28. package/dist/cdn/components/kp-chart.js.map +4 -4
  29. package/dist/cdn/components/kp-planets-table.js +3 -196
  30. package/dist/cdn/components/kp-planets-table.js.map +4 -4
  31. package/dist/cdn/components/kp-ruling-planets.js +3 -241
  32. package/dist/cdn/components/kp-ruling-planets.js.map +4 -4
  33. package/dist/cdn/components/location-search.js +2 -240
  34. package/dist/cdn/components/location-search.js.map +2 -2
  35. package/dist/cdn/components/moon-phase.js +3 -223
  36. package/dist/cdn/components/moon-phase.js.map +4 -4
  37. package/dist/cdn/components/nakshatra-card.js +3 -201
  38. package/dist/cdn/components/nakshatra-card.js.map +4 -4
  39. package/dist/cdn/components/natal-chart.js +3 -563
  40. package/dist/cdn/components/natal-chart.js.map +4 -4
  41. package/dist/cdn/components/numerology-card.js +3 -233
  42. package/dist/cdn/components/numerology-card.js.map +4 -4
  43. package/dist/cdn/components/panchang-table.js +3 -220
  44. package/dist/cdn/components/panchang-table.js.map +4 -4
  45. package/dist/cdn/components/shadbala-table.js +3 -284
  46. package/dist/cdn/components/shadbala-table.js.map +4 -4
  47. package/dist/cdn/components/synastry-chart.js +3 -399
  48. package/dist/cdn/components/synastry-chart.js.map +4 -4
  49. package/dist/cdn/components/tarot-card.js +3 -261
  50. package/dist/cdn/components/tarot-card.js.map +4 -4
  51. package/dist/cdn/components/tarot-spread.js +3 -249
  52. package/dist/cdn/components/tarot-spread.js.map +4 -4
  53. package/dist/cdn/components/transits-table.js +3 -382
  54. package/dist/cdn/components/transits-table.js.map +4 -4
  55. package/dist/cdn/components/vedic-kundli.js +3 -305
  56. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  57. package/dist/cdn/components/vedic-planets-table.js +3 -203
  58. package/dist/cdn/components/vedic-planets-table.js.map +4 -4
  59. package/dist/cdn/components/western-planets-table.js +3 -192
  60. package/dist/cdn/components/western-planets-table.js.map +4 -4
  61. package/dist/cdn/components/yoga-list.js +3 -306
  62. package/dist/cdn/components/yoga-list.js.map +4 -4
  63. package/dist/cdn/roxy-ui.js +3 -5102
  64. package/dist/cdn/roxy-ui.js.map +4 -4
  65. package/dist/cdn/widgets.js +1 -114
  66. package/dist/components/ashtakavarga-grid.d.ts +1 -0
  67. package/dist/components/ashtakavarga-grid.d.ts.map +1 -1
  68. package/dist/components/ashtakavarga-grid.js +1 -531
  69. package/dist/components/ashtakavarga-grid.js.map +4 -4
  70. package/dist/components/biorhythm-chart.d.ts +1 -0
  71. package/dist/components/biorhythm-chart.d.ts.map +1 -1
  72. package/dist/components/biorhythm-chart.js +1 -332
  73. package/dist/components/biorhythm-chart.js.map +4 -4
  74. package/dist/components/choghadiya-grid.d.ts +1 -0
  75. package/dist/components/choghadiya-grid.d.ts.map +1 -1
  76. package/dist/components/choghadiya-grid.js +1 -351
  77. package/dist/components/choghadiya-grid.js.map +4 -4
  78. package/dist/components/compatibility-card.d.ts +1 -0
  79. package/dist/components/compatibility-card.d.ts.map +1 -1
  80. package/dist/components/compatibility-card.js +1 -313
  81. package/dist/components/compatibility-card.js.map +4 -4
  82. package/dist/components/dasha-timeline.d.ts +1 -0
  83. package/dist/components/dasha-timeline.d.ts.map +1 -1
  84. package/dist/components/dasha-timeline.js +1 -401
  85. package/dist/components/dasha-timeline.js.map +4 -4
  86. package/dist/components/data.d.ts +1 -0
  87. package/dist/components/data.d.ts.map +1 -1
  88. package/dist/components/data.js +1 -362
  89. package/dist/components/data.js.map +4 -4
  90. package/dist/components/divisional-chart.d.ts +1 -0
  91. package/dist/components/divisional-chart.d.ts.map +1 -1
  92. package/dist/components/divisional-chart.js +1 -886
  93. package/dist/components/divisional-chart.js.map +4 -4
  94. package/dist/components/dosha-card.d.ts +1 -0
  95. package/dist/components/dosha-card.d.ts.map +1 -1
  96. package/dist/components/dosha-card.js +1 -293
  97. package/dist/components/dosha-card.js.map +4 -4
  98. package/dist/components/endpoint-form.js +1 -505
  99. package/dist/components/endpoint-form.js.map +3 -3
  100. package/dist/components/guna-milan.d.ts +1 -0
  101. package/dist/components/guna-milan.d.ts.map +1 -1
  102. package/dist/components/guna-milan.js +1 -374
  103. package/dist/components/guna-milan.js.map +4 -4
  104. package/dist/components/hexagram.d.ts +1 -0
  105. package/dist/components/hexagram.d.ts.map +1 -1
  106. package/dist/components/hexagram.js +1 -380
  107. package/dist/components/hexagram.js.map +4 -4
  108. package/dist/components/horoscope-card.d.ts +1 -0
  109. package/dist/components/horoscope-card.d.ts.map +1 -1
  110. package/dist/components/horoscope-card.js +1 -381
  111. package/dist/components/horoscope-card.js.map +4 -4
  112. package/dist/components/kp-chart.d.ts +1 -0
  113. package/dist/components/kp-chart.d.ts.map +1 -1
  114. package/dist/components/kp-chart.js +1 -395
  115. package/dist/components/kp-chart.js.map +4 -4
  116. package/dist/components/kp-planets-table.d.ts +1 -0
  117. package/dist/components/kp-planets-table.d.ts.map +1 -1
  118. package/dist/components/kp-planets-table.js +1 -246
  119. package/dist/components/kp-planets-table.js.map +4 -4
  120. package/dist/components/kp-ruling-planets.d.ts +1 -0
  121. package/dist/components/kp-ruling-planets.d.ts.map +1 -1
  122. package/dist/components/kp-ruling-planets.js +1 -288
  123. package/dist/components/kp-ruling-planets.js.map +4 -4
  124. package/dist/components/location-search.js +1 -461
  125. package/dist/components/location-search.js.map +3 -3
  126. package/dist/components/moon-phase.d.ts +1 -0
  127. package/dist/components/moon-phase.d.ts.map +1 -1
  128. package/dist/components/moon-phase.js +1 -327
  129. package/dist/components/moon-phase.js.map +4 -4
  130. package/dist/components/nakshatra-card.d.ts +1 -0
  131. package/dist/components/nakshatra-card.d.ts.map +1 -1
  132. package/dist/components/nakshatra-card.js +1 -244
  133. package/dist/components/nakshatra-card.js.map +4 -4
  134. package/dist/components/natal-chart.d.ts +1 -1
  135. package/dist/components/natal-chart.d.ts.map +1 -1
  136. package/dist/components/natal-chart.js +1 -1040
  137. package/dist/components/natal-chart.js.map +4 -4
  138. package/dist/components/numerology-card.d.ts +1 -0
  139. package/dist/components/numerology-card.d.ts.map +1 -1
  140. package/dist/components/numerology-card.js +1 -315
  141. package/dist/components/numerology-card.js.map +4 -4
  142. package/dist/components/panchang-table.d.ts +1 -0
  143. package/dist/components/panchang-table.d.ts.map +1 -1
  144. package/dist/components/panchang-table.js +1 -350
  145. package/dist/components/panchang-table.js.map +4 -4
  146. package/dist/components/shadbala-table.d.ts +1 -0
  147. package/dist/components/shadbala-table.d.ts.map +1 -1
  148. package/dist/components/shadbala-table.js +1 -413
  149. package/dist/components/shadbala-table.js.map +4 -4
  150. package/dist/components/synastry-chart.d.ts +1 -0
  151. package/dist/components/synastry-chart.d.ts.map +1 -1
  152. package/dist/components/synastry-chart.js +1 -658
  153. package/dist/components/synastry-chart.js.map +4 -4
  154. package/dist/components/tarot-card.d.ts +1 -0
  155. package/dist/components/tarot-card.d.ts.map +1 -1
  156. package/dist/components/tarot-card.js +1 -333
  157. package/dist/components/tarot-card.js.map +4 -4
  158. package/dist/components/tarot-spread.d.ts +1 -0
  159. package/dist/components/tarot-spread.d.ts.map +1 -1
  160. package/dist/components/tarot-spread.js +1 -310
  161. package/dist/components/tarot-spread.js.map +4 -4
  162. package/dist/components/transits-table.d.ts +3 -0
  163. package/dist/components/transits-table.d.ts.map +1 -1
  164. package/dist/components/transits-table.js +1 -548
  165. package/dist/components/transits-table.js.map +4 -4
  166. package/dist/components/vedic-kundli.d.ts +1 -0
  167. package/dist/components/vedic-kundli.d.ts.map +1 -1
  168. package/dist/components/vedic-kundli.js +1 -802
  169. package/dist/components/vedic-kundli.js.map +4 -4
  170. package/dist/components/vedic-planets-table.d.ts +1 -0
  171. package/dist/components/vedic-planets-table.d.ts.map +1 -1
  172. package/dist/components/vedic-planets-table.js +1 -368
  173. package/dist/components/vedic-planets-table.js.map +4 -4
  174. package/dist/components/western-planets-table.d.ts +1 -0
  175. package/dist/components/western-planets-table.d.ts.map +1 -1
  176. package/dist/components/western-planets-table.js +1 -363
  177. package/dist/components/western-planets-table.js.map +4 -4
  178. package/dist/components/yoga-list.d.ts +1 -0
  179. package/dist/components/yoga-list.d.ts.map +1 -1
  180. package/dist/components/yoga-list.js +1 -383
  181. package/dist/components/yoga-list.js.map +4 -4
  182. package/dist/index.cjs +1 -8653
  183. package/dist/index.cjs.map +4 -4
  184. package/dist/index.js +1 -8633
  185. package/dist/index.js.map +4 -4
  186. package/dist/types/index.d.ts +1 -1
  187. package/dist/types/index.d.ts.map +1 -1
  188. package/dist/types/types.gen.d.ts +590 -202
  189. package/dist/types/types.gen.d.ts.map +1 -1
  190. package/dist/utils/disclosure.d.ts +16 -0
  191. package/dist/utils/disclosure.d.ts.map +1 -0
  192. package/dist/utils/kundli-render.d.ts.map +1 -1
  193. package/dist/utils/kundli-styles.d.ts.map +1 -1
  194. package/dist/utils/markup-data.d.ts +57 -0
  195. package/dist/utils/markup-data.d.ts.map +1 -0
  196. package/dist/utils/tablist.d.ts +44 -0
  197. package/dist/utils/tablist.d.ts.map +1 -0
  198. package/dist/version.d.ts +1 -1
  199. package/package.json +3 -1
  200. package/src/components/ashtakavarga-grid.ts +9 -0
  201. package/src/components/biorhythm-chart.ts +9 -0
  202. package/src/components/choghadiya-grid.ts +9 -0
  203. package/src/components/compatibility-card.ts +9 -0
  204. package/src/components/dasha-timeline.ts +19 -1
  205. package/src/components/data.ts +9 -0
  206. package/src/components/divisional-chart.ts +11 -0
  207. package/src/components/dosha-card.ts +9 -0
  208. package/src/components/guna-milan.ts +9 -0
  209. package/src/components/hexagram.ts +9 -0
  210. package/src/components/horoscope-card.ts +9 -0
  211. package/src/components/kp-chart.ts +9 -0
  212. package/src/components/kp-planets-table.ts +9 -0
  213. package/src/components/kp-ruling-planets.ts +9 -0
  214. package/src/components/moon-phase.ts +9 -0
  215. package/src/components/nakshatra-card.ts +9 -0
  216. package/src/components/natal-chart.ts +46 -62
  217. package/src/components/numerology-card.ts +9 -0
  218. package/src/components/panchang-table.ts +9 -0
  219. package/src/components/shadbala-table.ts +9 -0
  220. package/src/components/synastry-chart.ts +9 -0
  221. package/src/components/tarot-card.ts +9 -0
  222. package/src/components/tarot-spread.ts +9 -0
  223. package/src/components/transits-table.ts +54 -18
  224. package/src/components/vedic-kundli.ts +11 -1
  225. package/src/components/vedic-planets-table.ts +9 -0
  226. package/src/components/western-planets-table.ts +9 -0
  227. package/src/components/yoga-list.ts +9 -0
  228. package/src/types/index.ts +1 -1
  229. package/src/types/types.gen.ts +602 -200
  230. package/src/utils/disclosure.ts +62 -0
  231. package/src/utils/kundli-render.ts +21 -35
  232. package/src/utils/kundli-styles.ts +0 -31
  233. package/src/utils/markup-data.ts +115 -0
  234. package/src/utils/tablist.ts +124 -0
  235. package/src/version.ts +1 -1
@@ -1,659 +1,2 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __decorateClass = (decorators, target, key, kind) => {
4
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
- if (decorator = decorators[i])
7
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
- if (kind && result) __defProp(target, key, result);
9
- return result;
10
- };
11
-
12
- // packages/ui/src/components/synastry-chart.ts
13
- import { css as css2, html, LitElement, nothing, svg } from "lit";
14
- import { customElement, property } from "lit/decorators.js";
15
-
16
- // packages/ui/src/tokens/index.ts
17
- var PLANET_GLYPH = {
18
- Sun: "\u2609",
19
- Moon: "\u263D",
20
- Mercury: "\u263F",
21
- Venus: "\u2640",
22
- Earth: "\u2641",
23
- Mars: "\u2642",
24
- Jupiter: "\u2643",
25
- Saturn: "\u2644",
26
- Uranus: "\u2645",
27
- Neptune: "\u2646",
28
- Pluto: "\u2647",
29
- Rahu: "\u260A",
30
- Ketu: "\u260B",
31
- Ascendant: "Asc",
32
- Lagna: "La",
33
- NorthNode: "\u260A",
34
- SouthNode: "\u260B",
35
- "North node": "\u260A",
36
- "South node": "\u260B",
37
- Chiron: "\u26B7",
38
- Lilith: "\u26B8",
39
- "Black moon lilith": "\u26B8"
40
- };
41
- var SIGN_GLYPH = {
42
- Aries: "\u2648",
43
- Taurus: "\u2649",
44
- Gemini: "\u264A",
45
- Cancer: "\u264B",
46
- Leo: "\u264C",
47
- Virgo: "\u264D",
48
- Libra: "\u264E",
49
- Scorpio: "\u264F",
50
- Sagittarius: "\u2650",
51
- Capricorn: "\u2651",
52
- Aquarius: "\u2652",
53
- Pisces: "\u2653"
54
- };
55
- var SIGNS_ORDER = [
56
- "Aries",
57
- "Taurus",
58
- "Gemini",
59
- "Cancer",
60
- "Leo",
61
- "Virgo",
62
- "Libra",
63
- "Scorpio",
64
- "Sagittarius",
65
- "Capricorn",
66
- "Aquarius",
67
- "Pisces"
68
- ];
69
- var RASHI_KEYS = SIGNS_ORDER.map(
70
- (s) => s.toLowerCase()
71
- );
72
-
73
- // packages/ui/src/utils/base-styles.ts
74
- import { css } from "lit";
75
- var baseStyles = css`
76
- :host {
77
- display: block;
78
- container-type: inline-size;
79
- font-family: var(
80
- --roxy-font-sans,
81
- system-ui,
82
- -apple-system,
83
- BlinkMacSystemFont,
84
- 'Segoe UI',
85
- Roboto,
86
- sans-serif
87
- );
88
- color: var(--roxy-fg, #0a0a0a);
89
- background: transparent;
90
- font-size: var(--roxy-text-base, 1rem);
91
- line-height: var(--roxy-leading-normal, 1.5);
92
- animation: roxy-fade-in var(--roxy-motion-duration, 200ms)
93
- var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;
94
- }
95
-
96
- *,
97
- *::before,
98
- *::after {
99
- box-sizing: border-box;
100
- }
101
-
102
- @keyframes roxy-fade-in {
103
- from {
104
- opacity: 0;
105
- transform: translateY(2px);
106
- }
107
- to {
108
- opacity: 1;
109
- transform: translateY(0);
110
- }
111
- }
112
-
113
- @media (prefers-reduced-motion: reduce) {
114
- :host {
115
- animation: none;
116
- }
117
- }
118
-
119
- .roxy-skeleton {
120
- background: linear-gradient(
121
- 90deg,
122
- var(--roxy-border, #e4e4e7) 0%,
123
- color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,
124
- var(--roxy-border, #e4e4e7) 100%
125
- );
126
- background-size: 200% 100%;
127
- animation: roxy-shimmer 1.4s ease-in-out infinite;
128
- border-radius: var(--roxy-radius-md, 8px);
129
- }
130
-
131
- @keyframes roxy-shimmer {
132
- 0% {
133
- background-position: 200% 0;
134
- }
135
- 100% {
136
- background-position: -200% 0;
137
- }
138
- }
139
-
140
- @media (prefers-reduced-motion: reduce) {
141
- .roxy-skeleton {
142
- animation: none;
143
- }
144
- }
145
-
146
- .roxy-empty {
147
- padding: var(--roxy-space-lg, 1.5rem);
148
- color: var(--roxy-muted, #71717a);
149
- text-align: center;
150
- font-size: var(--roxy-text-sm, 0.875rem);
151
- }
152
-
153
- :host(:focus-within) .roxy-card {
154
- outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
155
- outline-offset: 2px;
156
- }
157
-
158
- /* Force the text-style variant on every Unicode glyph in the component.
159
- * macOS and iOS substitute coloured emoji glyphs for the planetary and
160
- * gender Unicode code points (Mars, Venus, Mercury, etc.) when the
161
- * system colour-emoji font wins font selection. The text-style variant
162
- * keeps glyphs monochrome so they inherit the surrounding fill colour
163
- * and match the brand palette consistently across platforms.
164
- *
165
- * font-variant-emoji is part of CSS Fonts 4 (Safari 17+, Chrome 134+,
166
- * Firefox 139+). On older browsers the rule is silently ignored.
167
- */
168
- :host {
169
- font-variant-emoji: text;
170
- }
171
- `;
172
-
173
- // packages/ui/src/utils/degree.ts
174
- function normalizeLongitude(lon) {
175
- const wrapped = lon % 360;
176
- return wrapped < 0 ? wrapped + 360 : wrapped;
177
- }
178
- function longitudeToSignPosition(longitude) {
179
- const lon = normalizeLongitude(longitude);
180
- const signIndex = Math.floor(lon / 30) % 12;
181
- const within = lon % 30;
182
- const degree = Math.floor(within);
183
- const minuteFloat = (within - degree) * 60;
184
- const minute = Math.floor(minuteFloat);
185
- const second = Math.round((minuteFloat - minute) * 60);
186
- return {
187
- sign: SIGNS_ORDER[signIndex] ?? "Aries",
188
- signIndex,
189
- degree,
190
- minute,
191
- second
192
- };
193
- }
194
- function polarToCartesian(cx, cy, radius, angleDeg) {
195
- const angleRad = angleDeg * Math.PI / 180;
196
- return {
197
- x: cx + radius * Math.cos(angleRad),
198
- y: cy + radius * Math.sin(angleRad)
199
- };
200
- }
201
-
202
- // packages/ui/src/utils/format.ts
203
- function formatNumber(value, dp = 1) {
204
- if (typeof value !== "number" || !Number.isFinite(value)) return "";
205
- return value.toFixed(dp).replace(/\.?0+$/, "");
206
- }
207
- var ASPECT_CLASS = {
208
- conjunction: "aspect-conjunction",
209
- sextile: "aspect-sextile",
210
- square: "aspect-square",
211
- trine: "aspect-trine",
212
- opposition: "aspect-opposition"
213
- };
214
- function normalizeAspect(a) {
215
- return (a.type ?? "").toLowerCase().replace(/_/g, "-");
216
- }
217
-
218
- // packages/ui/src/utils/string.ts
219
- function capitalize(s) {
220
- if (!s) return "";
221
- return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
222
- }
223
-
224
- // packages/ui/src/components/synastry-chart.ts
225
- var SIZE = 360;
226
- var CENTER = SIZE / 2;
227
- var OUTER_R = 170;
228
- var SIGN_R = 154;
229
- var P1_R = 124;
230
- var P2_R = 96;
231
- var RoxySynastryChart = class extends LitElement {
232
- constructor() {
233
- super(...arguments);
234
- this.data = null;
235
- }
236
- render() {
237
- if (!this.data)
238
- return html`<div class="roxy-empty" role="status">No synastry data</div>`;
239
- const { person1, person2, compatibilityScore, analysis } = this.data;
240
- const interAspects = this.data.interAspects ?? [];
241
- const p1Planets = person1?.planets ?? [];
242
- const p2Planets = person2?.planets ?? [];
243
- const score = typeof compatibilityScore === "number" ? Math.round(compatibilityScore) : void 0;
244
- const summaryText = analysis?.overall;
245
- const strengths = analysis?.strengths ?? [];
246
- const challenges = analysis?.challenges ?? [];
247
- const hasPlanets = p1Planets.length > 0 && p2Planets.length > 0;
248
- if (!hasPlanets) {
249
- return html`<div
250
- class="wrap"
251
- aria-label="Synastry compatibility chart"
252
- >
253
- <div class="head">
254
- <h2 class="title">Synastry</h2>
255
- ${typeof score === "number" ? html`<span class="score" aria-label=${`Score ${score} of 100`}
256
- >${score} / 100</span
257
- >` : nothing}
258
- </div>
259
- <div class="missing-planets" role="status">
260
- Synastry response missing planet positions. Pass
261
- <code>data</code> with <code>person1.planets</code> and
262
- <code>person2.planets</code> arrays from the natal-chart endpoint, or
263
- use the <code>&lt;roxy-data&gt;</code> fallback.
264
- </div>
265
- ${summaryText ? html`<p class="summary">${summaryText}</p>` : nothing}
266
- ${interAspects.length > 0 ? this.renderAspects(interAspects) : nothing}
267
- ${strengths.length > 0 || challenges.length > 0 ? html`<div class="lists">
268
- ${strengths.length ? html`<div>
269
- <h3>Strengths</h3>
270
- <ul>
271
- ${strengths.map((s) => html`<li>${s}</li>`)}
272
- </ul>
273
- </div>` : nothing}
274
- ${challenges.length ? html`<div>
275
- <h3>Challenges</h3>
276
- <ul>
277
- ${challenges.map((s) => html`<li>${s}</li>`)}
278
- </ul>
279
- </div>` : nothing}
280
- </div>` : nothing}
281
- </div>`;
282
- }
283
- return html`<div
284
- class="wrap"
285
- aria-label="Synastry compatibility chart"
286
- >
287
- <div class="head">
288
- <h2 class="title">Synastry</h2>
289
- ${typeof score === "number" ? html`<span class="score" aria-label=${`Score ${score} of 100`}
290
- >${score} / 100</span
291
- >` : nothing}
292
- </div>
293
- <svg
294
- viewBox="0 0 ${SIZE} ${SIZE}"
295
- role="img"
296
- aria-label="Dual chart wheel comparing two natal charts"
297
- >
298
- <title>Synastry dual wheel</title>
299
- <circle
300
- class="wheel-line"
301
- cx=${CENTER}
302
- cy=${CENTER}
303
- r=${OUTER_R}
304
- stroke-width="1.5"
305
- />
306
- <circle
307
- class="wheel-line"
308
- cx=${CENTER}
309
- cy=${CENTER}
310
- r=${P2_R + 14}
311
- stroke-width="0.8"
312
- />
313
- <circle
314
- class="wheel-line"
315
- cx=${CENTER}
316
- cy=${CENTER}
317
- r=${P2_R - 14}
318
- stroke-width="0.6"
319
- />
320
- ${this.renderSpokes()} ${this.renderSigns()}
321
- ${this.renderInterAspectLines(p1Planets, p2Planets, interAspects)}
322
- ${this.renderRing(p1Planets, P1_R, "p1", 1)} ${this.renderRing(p2Planets, P2_R, "p2", 2)}
323
- ${this.renderAscendants(this.data)}
324
- </svg>
325
- <div class="legend-row">
326
- <span><span class="swatch" style="background: var(--roxy-accent)"></span>Person 1</span>
327
- <span><span class="swatch" style="background: var(--roxy-info)"></span>Person 2</span>
328
- <span><span class="swatch" style="background: var(--roxy-success)"></span>harmonious</span>
329
- <span><span class="swatch" style="background: var(--roxy-danger)"></span>challenging</span>
330
- </div>
331
- ${summaryText ? html`<p class="summary">${summaryText}</p>` : nothing}
332
- ${interAspects.length > 0 ? this.renderAspects(interAspects) : nothing}
333
- ${strengths.length > 0 || challenges.length > 0 ? html`<div class="lists">
334
- ${strengths.length ? html`<div>
335
- <h3>Strengths</h3>
336
- <ul>
337
- ${strengths.map((s) => html`<li>${s}</li>`)}
338
- </ul>
339
- </div>` : nothing}
340
- ${challenges.length ? html`<div>
341
- <h3>Challenges</h3>
342
- <ul>
343
- ${challenges.map((s) => html`<li>${s}</li>`)}
344
- </ul>
345
- </div>` : nothing}
346
- </div>` : nothing}
347
- </div>`;
348
- }
349
- toAngle(longitude) {
350
- return 180 - longitude;
351
- }
352
- renderSpokes() {
353
- return Array.from({ length: 12 }, (_, i) => {
354
- const angle = this.toAngle(i * 30);
355
- const start = polarToCartesian(CENTER, CENTER, P2_R - 14, angle);
356
- const end = polarToCartesian(CENTER, CENTER, OUTER_R, angle);
357
- return svg`<line class="wheel-line" x1=${start.x} y1=${start.y} x2=${end.x} y2=${end.y} stroke-width="0.6" />`;
358
- });
359
- }
360
- renderSigns() {
361
- return SIGNS_ORDER.map((s, i) => {
362
- const angle = this.toAngle(i * 30 + 15);
363
- const pos = polarToCartesian(CENTER, CENTER, SIGN_R, angle);
364
- return svg`<text class="sign" x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central">${SIGN_GLYPH[s]}</text>`;
365
- });
366
- }
367
- renderRing(planets, radius, cls, personIndex) {
368
- return planets.map((p) => {
369
- if (!Number.isFinite(p.longitude)) return nothing;
370
- const angle = this.toAngle(p.longitude);
371
- const pos = polarToCartesian(CENTER, CENTER, radius, angle);
372
- const degOffset = personIndex === 1 ? -12 : -10;
373
- const degPos = polarToCartesian(
374
- CENTER,
375
- CENTER,
376
- radius + degOffset,
377
- angle
378
- );
379
- const glyph = PLANET_GLYPH[capitalize(p.name)] ?? p.name.slice(0, 2);
380
- const sp = longitudeToSignPosition(p.longitude);
381
- const retro = p.isRetrograde === true;
382
- const degLabel = `${sp.degree}\xB0${String(sp.minute).padStart(2, "0")}'`;
383
- const tooltip = `${p.name}${retro ? " retrograde" : ""} - ${degLabel} ${sp.sign}`;
384
- return svg`<g>
385
- <text class=${cls} x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central"><title>${tooltip}</title>${glyph}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${personIndex}</tspan></text>
386
- <text class="planet-deg" x=${degPos.x} y=${degPos.y} text-anchor="middle" dominant-baseline="central">${sp.degree}°${retro ? svg`<tspan class="retro"> ℞</tspan>` : nothing}</text>
387
- </g>`;
388
- });
389
- }
390
- /**
391
- * Ascendant markers for both people. Drawn as small spokes at the inner
392
- * rim with the label outside, so the two rising signs are immediately
393
- * scannable on the wheel without depending on tooltips.
394
- */
395
- renderAscendants(data) {
396
- const items = [];
397
- const make = (asc, personIndex) => {
398
- if (!asc) return;
399
- const signIdx = SIGNS_ORDER.findIndex(
400
- (s) => s.toLowerCase() === asc.sign.toLowerCase()
401
- );
402
- if (signIdx === -1) return;
403
- const longitude = signIdx * 30 + asc.degree;
404
- const angle = this.toAngle(longitude);
405
- const innerR = personIndex === 1 ? P1_R + 14 : P2_R + 14;
406
- const tickPos = polarToCartesian(CENTER, CENTER, innerR, angle);
407
- const labelPos = polarToCartesian(CENTER, CENTER, OUTER_R + 14, angle);
408
- items.push(svg`<g>
409
- <line class="asc-tick" x1=${tickPos.x} y1=${tickPos.y} x2=${labelPos.x} y2=${labelPos.y} />
410
- <text class="asc-label" x=${labelPos.x} y=${labelPos.y} text-anchor="middle" dominant-baseline="central">Asc${personIndex}</text>
411
- </g>`);
412
- };
413
- make(data.person1?.ascendant, 1);
414
- make(data.person2?.ascendant, 2);
415
- return items;
416
- }
417
- renderInterAspectLines(p1, p2, aspects) {
418
- const longitudeOf = (list, name) => {
419
- const target = capitalize(name);
420
- for (const p of list) {
421
- if (capitalize(p.name) !== target) continue;
422
- if (typeof p.longitude === "number") return p.longitude;
423
- }
424
- return void 0;
425
- };
426
- return aspects.map((a) => {
427
- const l1 = longitudeOf(p1, a.planet1);
428
- const l2 = longitudeOf(p2, a.planet2);
429
- if (l1 === void 0 || l2 === void 0) return nothing;
430
- const out = polarToCartesian(CENTER, CENTER, P1_R - 12, this.toAngle(l1));
431
- const inn = polarToCartesian(CENTER, CENTER, P2_R + 8, this.toAngle(l2));
432
- const aspectName = normalizeAspect(a);
433
- const cls = ASPECT_CLASS[aspectName] ?? "aspect-other";
434
- const orbLabel = formatNumber(a.orb, 1);
435
- return svg`<line class=${`aspect ${cls}`} x1=${out.x} y1=${out.y} x2=${inn.x} y2=${inn.y}><title>${a.planet1} ${aspectName} ${a.planet2}${orbLabel ? ` (orb ${orbLabel}\xB0)` : ""}</title></line>`;
436
- });
437
- }
438
- renderAspects(aspects) {
439
- return html`<table>
440
- <thead>
441
- <tr>
442
- <th>Planet 1</th>
443
- <th>Planet 2</th>
444
- <th>Aspect</th>
445
- <th>Orb</th>
446
- <th>Strength</th>
447
- </tr>
448
- </thead>
449
- <tbody>
450
- ${aspects.slice(0, 12).map(
451
- (a) => html`<tr>
452
- <td>${a.planet1}</td>
453
- <td>${a.planet2}</td>
454
- <td>${normalizeAspect(a) || ""}</td>
455
- <td class="orb">${formatNumber(a.orb, 1)}</td>
456
- <td>${formatStrength(a.strength)}</td>
457
- </tr>`
458
- )}
459
- </tbody>
460
- </table>`;
461
- }
462
- };
463
- RoxySynastryChart.styles = [
464
- baseStyles,
465
- css2`
466
- .wrap {
467
- display: grid;
468
- gap: var(--roxy-space-md, 1rem);
469
- }
470
-
471
- .head {
472
- display: flex;
473
- justify-content: space-between;
474
- align-items: center;
475
- gap: var(--roxy-space-md, 1rem);
476
- flex-wrap: wrap;
477
- }
478
-
479
- .title {
480
- font-size: var(--roxy-text-lg, 1.125rem);
481
- font-weight: var(--roxy-weight-bold, 600);
482
- margin: 0;
483
- }
484
-
485
- .score {
486
- font-variant-numeric: tabular-nums;
487
- font-weight: var(--roxy-weight-bold, 600);
488
- color: var(--roxy-accent-fg, #b45309);
489
- font-size: var(--roxy-text-xl, 1.5rem);
490
- }
491
-
492
- svg {
493
- display: block;
494
- width: 100%;
495
- max-width: 560px;
496
- aspect-ratio: 1 / 1;
497
- height: auto;
498
- margin: 0 auto;
499
- }
500
-
501
- .wheel-line {
502
- fill: none;
503
- stroke: var(--roxy-border, #e4e4e7);
504
- }
505
- .sign {
506
- fill: var(--roxy-secondary, #475569);
507
- font-size: 14px;
508
- }
509
- .p1 {
510
- fill: var(--roxy-accent, #f59e0b);
511
- font-weight: 600;
512
- font-size: 13px;
513
- }
514
- .p2 {
515
- fill: var(--roxy-info, #0284c7);
516
- font-weight: 600;
517
- font-size: 13px;
518
- }
519
- .person-tag {
520
- font-size: 7px;
521
- font-weight: 700;
522
- opacity: 0.85;
523
- }
524
- .planet-deg {
525
- fill: var(--roxy-muted, #71717a);
526
- font-size: 7px;
527
- font-family: var(--roxy-font-sans);
528
- }
529
- .planet-deg .retro {
530
- fill: var(--roxy-danger, #dc2626);
531
- }
532
- .asc-tick {
533
- stroke: var(--roxy-accent-fg, #b45309);
534
- stroke-width: 1;
535
- opacity: 0.75;
536
- }
537
- .asc-label {
538
- fill: var(--roxy-accent-fg, #b45309);
539
- font-size: 9px;
540
- font-weight: 700;
541
- font-family: var(--roxy-font-sans);
542
- letter-spacing: 0.04em;
543
- }
544
- .aspect {
545
- stroke-width: 0.8;
546
- fill: none;
547
- opacity: 0.5;
548
- }
549
- .aspect-trine,
550
- .aspect-sextile {
551
- stroke: var(--roxy-success, #16a34a);
552
- }
553
- .aspect-square,
554
- .aspect-opposition {
555
- stroke: var(--roxy-danger, #dc2626);
556
- }
557
- .aspect-conjunction {
558
- stroke: var(--roxy-accent-fg, #b45309);
559
- }
560
- .aspect-other {
561
- stroke: var(--roxy-muted, #71717a);
562
- opacity: 0.35;
563
- }
564
- .legend-row {
565
- display: flex;
566
- flex-wrap: wrap;
567
- gap: var(--roxy-space-md, 1rem);
568
- font-size: var(--roxy-text-xs, 0.75rem);
569
- color: var(--roxy-muted, #71717a);
570
- margin-top: calc(var(--roxy-space-xs, 0.25rem) * -1);
571
- }
572
- .legend-row .swatch {
573
- display: inline-block;
574
- width: 8px;
575
- height: 8px;
576
- border-radius: 50%;
577
- margin-right: 4px;
578
- vertical-align: middle;
579
- }
580
-
581
- .summary {
582
- margin: 0;
583
- color: var(--roxy-fg, #0a0a0a);
584
- font-size: var(--roxy-text-base, 1rem);
585
- }
586
-
587
- table {
588
- width: 100%;
589
- border-collapse: collapse;
590
- font-size: var(--roxy-text-sm, 0.875rem);
591
- }
592
- th,
593
- td {
594
- padding: var(--roxy-space-sm, 0.5rem);
595
- border-bottom: 1px solid var(--roxy-border, #e4e4e7);
596
- text-align: left;
597
- }
598
- th {
599
- color: var(--roxy-muted, #71717a);
600
- font-weight: var(--roxy-weight-bold, 600);
601
- text-transform: uppercase;
602
- font-size: var(--roxy-text-xs, 0.75rem);
603
- letter-spacing: 0.06em;
604
- }
605
- td.orb {
606
- font-variant-numeric: tabular-nums;
607
- color: var(--roxy-muted, #71717a);
608
- }
609
-
610
- .lists {
611
- display: grid;
612
- grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
613
- gap: var(--roxy-space-md, 1rem);
614
- }
615
- .lists h3 {
616
- margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
617
- font-size: var(--roxy-text-xs, 0.75rem);
618
- color: var(--roxy-muted, #71717a);
619
- text-transform: uppercase;
620
- letter-spacing: 0.06em;
621
- }
622
- .lists ul {
623
- margin: 0;
624
- padding-left: var(--roxy-space-md, 1rem);
625
- font-size: var(--roxy-text-sm, 0.875rem);
626
- }
627
-
628
- .missing-planets {
629
- background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 8%, transparent);
630
- border: 1px solid var(--roxy-border, #e4e4e7);
631
- border-radius: var(--roxy-radius-md, 8px);
632
- padding: var(--roxy-space-md, 1rem);
633
- color: var(--roxy-fg, #0a0a0a);
634
- font-size: var(--roxy-text-sm, 0.875rem);
635
- line-height: 1.5;
636
- }
637
- .missing-planets code {
638
- font-family: var(--roxy-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
639
- font-size: 0.95em;
640
- background: color-mix(in srgb, var(--roxy-fg, #0a0a0a) 6%, transparent);
641
- padding: 0 4px;
642
- border-radius: 4px;
643
- }
644
- `
645
- ];
646
- __decorateClass([
647
- property({ attribute: false })
648
- ], RoxySynastryChart.prototype, "data", 2);
649
- RoxySynastryChart = __decorateClass([
650
- customElement("roxy-synastry-chart")
651
- ], RoxySynastryChart);
652
- function formatStrength(s) {
653
- if (typeof s === "number") return Math.round(s).toString();
654
- return "";
655
- }
656
- export {
657
- RoxySynastryChart
658
- };
1
+ var G=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var P=(n,t,a,r)=>{for(var o=r>1?void 0:r?H(t,a):t,s=n.length-1,e;s>=0;s--)(e=n[s])&&(o=(r?e(t,a,o):e(o))||o);return r&&o&&G(t,a,o),o};import{css as j,html as c,LitElement as B,nothing as u,svg as v}from"lit";import{customElement as U,property as F}from"lit/decorators.js";var C={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"};var E={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"};var b=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],K=b.map(n=>n.toLowerCase());import{css as O}from"lit";var M=O`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;function D(n){let t=n%360;return t<0?t+360:t}function z(n){let t=D(n),a=Math.floor(t/30)%12,r=t%30,o=Math.floor(r),s=(r-o)*60,e=Math.floor(s),p=Math.round((s-e)*60);return{sign:b[a]??"Aries",signIndex:a,degree:o,minute:e,second:p}}function y(n,t,a,r){let o=r*Math.PI/180;return{x:n+a*Math.cos(o),y:t+a*Math.sin(o)}}function k(n,t=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(t).replace(/\.?0+$/,"")}var _={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function R(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}var q="roxy-data";function Y(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var w=class{constructor(t){this.host=t,t.addController(this)}hostConnected(){if(this.host.data!=null)return;let t=this.read();t!==void 0&&(this.host.data=t,this.host.requestUpdate())}read(){let t=this.findInlineScript();return t?this.parse(t.textContent):void 0}findInlineScript(){for(let t of Array.from(this.host.children))if(Y(t)&&t.classList.contains(q))return t;return null}parse(t){if(t?.trim())try{return JSON.parse(t)}catch{return}}};function A(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}var N=360,i=N/2,L=170,V=154,T=124,$=96,S=class extends B{constructor(){super();this.data=null;new w(this)}render(){if(!this.data)return c`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:a,person2:r,compatibilityScore:o,analysis:s}=this.data,e=this.data.interAspects??[],p=a?.planets??[],g=r?.planets??[],d=typeof o=="number"?Math.round(o):void 0,x=s?.overall,m=s?.strengths??[],l=s?.challenges??[];return p.length>0&&g.length>0?c`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof d=="number"?c`<span class="score" aria-label="${`Score ${d} of 100`}">${d} / 100</span>`:u}</div><svg viewBox="0 0 ${N} ${N}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${i}" cy="${i}" r="${L}" stroke-width="1.5"/><circle class="wheel-line" cx="${i}" cy="${i}" r="${$+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${i}" cy="${i}" r="${$-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(p,g,e)} ${this.renderRing(p,T,"p1",1)} ${this.renderRing(g,$,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${x?c`<p class="summary">${x}</p>`:u} ${e.length>0?this.renderAspects(e):u} ${m.length>0||l.length>0?c`<div class="lists">${m.length?c`<div><h3>Strengths</h3><ul>${m.map(f=>c`<li>${f}</li>`)}</ul></div>`:u} ${l.length?c`<div><h3>Challenges</h3><ul>${l.map(f=>c`<li>${f}</li>`)}</ul></div>`:u}</div>`:u}</div>`:c`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof d=="number"?c`<span class="score" aria-label="${`Score ${d} of 100`}">${d} / 100</span>`:u}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code>&lt;roxy-data></code> fallback.</div>${x?c`<p class="summary">${x}</p>`:u} ${e.length>0?this.renderAspects(e):u} ${m.length>0||l.length>0?c`<div class="lists">${m.length?c`<div><h3>Strengths</h3><ul>${m.map(f=>c`<li>${f}</li>`)}</ul></div>`:u} ${l.length?c`<div><h3>Challenges</h3><ul>${l.map(f=>c`<li>${f}</li>`)}</ul></div>`:u}</div>`:u}</div>`}toAngle(a){return 180-a}renderSpokes(){return Array.from({length:12},(a,r)=>{let o=this.toAngle(r*30),s=y(i,i,$-14,o),e=y(i,i,L,o);return v`<line class="wheel-line" x1="${s.x}" y1="${s.y}" x2="${e.x}" y2="${e.y}" stroke-width="0.6">`})}renderSigns(){return b.map((a,r)=>{let o=this.toAngle(r*30+15),s=y(i,i,V,o);return v`<text class="sign" x="${s.x}" y="${s.y}" text-anchor="middle" dominant-baseline="central">${E[a]}</text>`})}renderRing(a,r,o,s){return a.map(e=>{if(!Number.isFinite(e.longitude))return u;let p=this.toAngle(e.longitude),g=y(i,i,r,p),x=y(i,i,r+(s===1?-12:-10),p),m=C[A(e.name)]??e.name.slice(0,2),l=z(e.longitude),h=e.isRetrograde===!0,f=`${l.degree}\xB0${String(l.minute).padStart(2,"0")}'`,I=`${e.name}${h?" retrograde":""} - ${f} ${l.sign}`;return v`<g><text class="${o}" x="${g.x}" y="${g.y}" text-anchor="middle" dominant-baseline="central"><title>${I}</title>${m}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${s}</tspan></text><text class="planet-deg" x="${x.x}" y="${x.y}" text-anchor="middle" dominant-baseline="central">${l.degree}°${h?v`<tspan class="retro">℞</tspan>`:u}</text></g>`})}renderAscendants(a){let r=[],o=(s,e)=>{if(!s)return;let p=b.findIndex(h=>h.toLowerCase()===s.sign.toLowerCase());if(p===-1)return;let g=p*30+s.degree,d=this.toAngle(g),x=e===1?T+14:$+14,m=y(i,i,x,d),l=y(i,i,L+14,d);r.push(v`<g><line class="asc-tick" x1="${m.x}" y1="${m.y}" x2="${l.x}" y2="${l.y}"><text class="asc-label" x="${l.x}" y="${l.y}" text-anchor="middle" dominant-baseline="central">Asc${e}</text></g>`)};return o(a.person1?.ascendant,1),o(a.person2?.ascendant,2),r}renderInterAspectLines(a,r,o){let s=(e,p)=>{let g=A(p);for(let d of e)if(A(d.name)===g&&typeof d.longitude=="number")return d.longitude};return o.map(e=>{let p=s(a,e.planet1),g=s(r,e.planet2);if(p===void 0||g===void 0)return u;let d=y(i,i,T-12,this.toAngle(p)),x=y(i,i,$+8,this.toAngle(g)),m=R(e),l=_[m]??"aspect-other",h=k(e.orb,1);return v`<line class="${`aspect ${l}`}" x1="${d.x}" y1="${d.y}" x2="${x.x}" y2="${x.y}"><title>${e.planet1} ${m} ${e.planet2}${h?` (orb ${h}\xB0)`:""}</title></line>`})}renderAspects(a){return c`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(r=>c`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${R(r)||""}</td><td class="orb">${k(r.orb,1)}</td><td>${J(r.strength)}</td></tr>`)}</tbody></table>`}};S.styles=[M,j`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-fg,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-fg,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-fg,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-fg,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],P([F({attribute:!1})],S.prototype,"data",2),S=P([U("roxy-synastry-chart")],S);function J(n){return typeof n=="number"?Math.round(n).toString():""}export{S as RoxySynastryChart};
659
2
  //# sourceMappingURL=synastry-chart.js.map