@roxyapi/ui 0.5.0 → 0.6.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 (152) hide show
  1. package/README.md +1 -1
  2. package/dist/cdn/components/ashtakavarga-grid.js +3 -362
  3. package/dist/cdn/components/ashtakavarga-grid.js.map +2 -2
  4. package/dist/cdn/components/biorhythm-chart.js +2 -225
  5. package/dist/cdn/components/biorhythm-chart.js.map +2 -2
  6. package/dist/cdn/components/choghadiya-grid.js +2 -231
  7. package/dist/cdn/components/choghadiya-grid.js.map +2 -2
  8. package/dist/cdn/components/compatibility-card.js +2 -230
  9. package/dist/cdn/components/compatibility-card.js.map +2 -2
  10. package/dist/cdn/components/dasha-timeline.js +2 -282
  11. package/dist/cdn/components/dasha-timeline.js.map +2 -2
  12. package/dist/cdn/components/data.js +3 -230
  13. package/dist/cdn/components/data.js.map +2 -2
  14. package/dist/cdn/components/divisional-chart.js +34 -321
  15. package/dist/cdn/components/divisional-chart.js.map +4 -4
  16. package/dist/cdn/components/dosha-card.js +2 -225
  17. package/dist/cdn/components/dosha-card.js.map +2 -2
  18. package/dist/cdn/components/endpoint-form.js +2 -243
  19. package/dist/cdn/components/endpoint-form.js.map +2 -2
  20. package/dist/cdn/components/guna-milan.js +2 -269
  21. package/dist/cdn/components/guna-milan.js.map +2 -2
  22. package/dist/cdn/components/hexagram.js +3 -247
  23. package/dist/cdn/components/hexagram.js.map +2 -2
  24. package/dist/cdn/components/horoscope-card.js +3 -281
  25. package/dist/cdn/components/horoscope-card.js.map +2 -2
  26. package/dist/cdn/components/kp-chart.js +2 -277
  27. package/dist/cdn/components/kp-chart.js.map +2 -2
  28. package/dist/cdn/components/kp-planets-table.js +2 -195
  29. package/dist/cdn/components/kp-planets-table.js.map +2 -2
  30. package/dist/cdn/components/kp-ruling-planets.js +2 -240
  31. package/dist/cdn/components/kp-ruling-planets.js.map +2 -2
  32. package/dist/cdn/components/location-search.js +2 -240
  33. package/dist/cdn/components/location-search.js.map +2 -2
  34. package/dist/cdn/components/moon-phase.js +3 -223
  35. package/dist/cdn/components/moon-phase.js.map +2 -2
  36. package/dist/cdn/components/nakshatra-card.js +2 -200
  37. package/dist/cdn/components/nakshatra-card.js.map +2 -2
  38. package/dist/cdn/components/natal-chart.js +9 -560
  39. package/dist/cdn/components/natal-chart.js.map +4 -4
  40. package/dist/cdn/components/numerology-card.js +2 -232
  41. package/dist/cdn/components/numerology-card.js.map +2 -2
  42. package/dist/cdn/components/panchang-table.js +3 -220
  43. package/dist/cdn/components/panchang-table.js.map +2 -2
  44. package/dist/cdn/components/shadbala-table.js +3 -284
  45. package/dist/cdn/components/shadbala-table.js.map +2 -2
  46. package/dist/cdn/components/synastry-chart.js +5 -395
  47. package/dist/cdn/components/synastry-chart.js.map +2 -2
  48. package/dist/cdn/components/tarot-card.js +3 -261
  49. package/dist/cdn/components/tarot-card.js.map +2 -2
  50. package/dist/cdn/components/tarot-spread.js +2 -248
  51. package/dist/cdn/components/tarot-spread.js.map +2 -2
  52. package/dist/cdn/components/transits-table.js +3 -382
  53. package/dist/cdn/components/transits-table.js.map +4 -4
  54. package/dist/cdn/components/vedic-kundli.js +35 -271
  55. package/dist/cdn/components/vedic-kundli.js.map +4 -4
  56. package/dist/cdn/components/vedic-planets-table.js +2 -202
  57. package/dist/cdn/components/vedic-planets-table.js.map +2 -2
  58. package/dist/cdn/components/western-planets-table.js +3 -192
  59. package/dist/cdn/components/western-planets-table.js.map +2 -2
  60. package/dist/cdn/components/yoga-list.js +2 -305
  61. package/dist/cdn/components/yoga-list.js.map +2 -2
  62. package/dist/cdn/roxy-ui.js +41 -5059
  63. package/dist/cdn/roxy-ui.js.map +4 -4
  64. package/dist/cdn/widgets.js +1 -114
  65. package/dist/components/ashtakavarga-grid.js +1 -577
  66. package/dist/components/ashtakavarga-grid.js.map +3 -3
  67. package/dist/components/biorhythm-chart.js +1 -378
  68. package/dist/components/biorhythm-chart.js.map +3 -3
  69. package/dist/components/choghadiya-grid.js +1 -397
  70. package/dist/components/choghadiya-grid.js.map +3 -3
  71. package/dist/components/compatibility-card.js +1 -359
  72. package/dist/components/compatibility-card.js.map +3 -3
  73. package/dist/components/dasha-timeline.js +1 -447
  74. package/dist/components/dasha-timeline.js.map +3 -3
  75. package/dist/components/data.js +1 -408
  76. package/dist/components/data.js.map +3 -3
  77. package/dist/components/divisional-chart.d.ts.map +1 -1
  78. package/dist/components/divisional-chart.js +64 -929
  79. package/dist/components/divisional-chart.js.map +4 -4
  80. package/dist/components/dosha-card.js +1 -339
  81. package/dist/components/dosha-card.js.map +3 -3
  82. package/dist/components/endpoint-form.js +1 -505
  83. package/dist/components/endpoint-form.js.map +3 -3
  84. package/dist/components/guna-milan.js +1 -420
  85. package/dist/components/guna-milan.js.map +3 -3
  86. package/dist/components/hexagram.js +1 -426
  87. package/dist/components/hexagram.js.map +3 -3
  88. package/dist/components/horoscope-card.js +1 -427
  89. package/dist/components/horoscope-card.js.map +3 -3
  90. package/dist/components/kp-chart.js +1 -441
  91. package/dist/components/kp-chart.js.map +3 -3
  92. package/dist/components/kp-planets-table.js +1 -292
  93. package/dist/components/kp-planets-table.js.map +3 -3
  94. package/dist/components/kp-ruling-planets.js +1 -334
  95. package/dist/components/kp-ruling-planets.js.map +3 -3
  96. package/dist/components/location-search.js +1 -461
  97. package/dist/components/location-search.js.map +3 -3
  98. package/dist/components/moon-phase.js +1 -373
  99. package/dist/components/moon-phase.js.map +3 -3
  100. package/dist/components/nakshatra-card.js +1 -290
  101. package/dist/components/nakshatra-card.js.map +3 -3
  102. package/dist/components/natal-chart.d.ts +0 -1
  103. package/dist/components/natal-chart.d.ts.map +1 -1
  104. package/dist/components/natal-chart.js +8 -1084
  105. package/dist/components/natal-chart.js.map +4 -4
  106. package/dist/components/numerology-card.js +1 -361
  107. package/dist/components/numerology-card.js.map +3 -3
  108. package/dist/components/panchang-table.js +1 -396
  109. package/dist/components/panchang-table.js.map +3 -3
  110. package/dist/components/shadbala-table.js +1 -459
  111. package/dist/components/shadbala-table.js.map +3 -3
  112. package/dist/components/synastry-chart.js +7 -704
  113. package/dist/components/synastry-chart.js.map +3 -3
  114. package/dist/components/tarot-card.js +1 -379
  115. package/dist/components/tarot-card.js.map +3 -3
  116. package/dist/components/tarot-spread.js +1 -356
  117. package/dist/components/tarot-spread.js.map +3 -3
  118. package/dist/components/transits-table.d.ts +2 -0
  119. package/dist/components/transits-table.d.ts.map +1 -1
  120. package/dist/components/transits-table.js +1 -594
  121. package/dist/components/transits-table.js.map +4 -4
  122. package/dist/components/vedic-kundli.d.ts.map +1 -1
  123. package/dist/components/vedic-kundli.js +64 -845
  124. package/dist/components/vedic-kundli.js.map +4 -4
  125. package/dist/components/vedic-planets-table.js +1 -414
  126. package/dist/components/vedic-planets-table.js.map +3 -3
  127. package/dist/components/western-planets-table.js +1 -409
  128. package/dist/components/western-planets-table.js.map +3 -3
  129. package/dist/components/yoga-list.js +1 -429
  130. package/dist/components/yoga-list.js.map +3 -3
  131. package/dist/index.cjs +77 -8721
  132. package/dist/index.cjs.map +4 -4
  133. package/dist/index.js +77 -8701
  134. package/dist/index.js.map +4 -4
  135. package/dist/utils/disclosure.d.ts +16 -0
  136. package/dist/utils/disclosure.d.ts.map +1 -0
  137. package/dist/utils/kundli-render.d.ts.map +1 -1
  138. package/dist/utils/kundli-styles.d.ts.map +1 -1
  139. package/dist/utils/tablist.d.ts +44 -0
  140. package/dist/utils/tablist.d.ts.map +1 -0
  141. package/dist/version.d.ts +1 -1
  142. package/package.json +3 -1
  143. package/src/components/dasha-timeline.ts +7 -7
  144. package/src/components/divisional-chart.ts +2 -0
  145. package/src/components/natal-chart.ts +37 -62
  146. package/src/components/transits-table.ts +45 -18
  147. package/src/components/vedic-kundli.ts +2 -1
  148. package/src/utils/disclosure.ts +62 -0
  149. package/src/utils/kundli-render.ts +21 -35
  150. package/src/utils/kundli-styles.ts +0 -31
  151. package/src/utils/tablist.ts +124 -0
  152. package/src/version.ts +1 -1
@@ -1,595 +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/transits-table.ts
13
- import { css as css2, html, LitElement, nothing } 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/format.ts
174
- function formatTime(input) {
175
- if (typeof input !== "string" || input.length === 0) return "";
176
- if (/^\d{4}-\d{2}-\d{2}$/.test(input)) return "";
177
- const bareTime = /^\d{2}:\d{2}(:\d{2})?$/.test(input);
178
- const iso = bareTime ? `1970-01-01T${input}` : input;
179
- const d = new Date(iso);
180
- if (Number.isNaN(d.getTime())) return input;
181
- return d.toLocaleTimeString(void 0, {
182
- hour: "numeric",
183
- minute: "2-digit",
184
- hour12: true
185
- });
186
- }
187
- function formatDate(input) {
188
- if (typeof input !== "string" || input.length === 0) return "";
189
- const d = new Date(
190
- /^\d{4}-\d{2}-\d{2}$/.test(input) ? `${input}T00:00:00` : input
191
- );
192
- if (Number.isNaN(d.getTime())) return input;
193
- return d.toLocaleDateString(void 0, {
194
- month: "short",
195
- day: "numeric",
196
- year: "numeric"
197
- });
198
- }
199
- function formatNumber(value, dp = 1) {
200
- if (typeof value !== "number" || !Number.isFinite(value)) return "";
201
- return value.toFixed(dp).replace(/\.?0+$/, "");
202
- }
203
-
204
- // packages/ui/src/utils/markup-data.ts
205
- var ROXY_DATA_CLASS = "roxy-data";
206
- function isJsonScript(el) {
207
- return el.nodeName === "SCRIPT" && el.getAttribute("type") === "application/json";
208
- }
209
- var MarkupDataController = class {
210
- constructor(host) {
211
- this.host = host;
212
- host.addController(this);
213
- }
214
- hostConnected() {
215
- if (this.host.data != null) return;
216
- const parsed = this.read();
217
- if (parsed === void 0) return;
218
- this.host.data = parsed;
219
- this.host.requestUpdate();
220
- }
221
- /**
222
- * Resolve the embedded payload. Returns `undefined` when there is nothing valid to read so the caller can leave `host.data` untouched.
223
- */
224
- read() {
225
- const inline = this.findInlineScript();
226
- return inline ? this.parse(inline.textContent) : void 0;
227
- }
228
- /**
229
- * Direct-child `<script type="application/json" class="roxy-data">`. Scoped to immediate children so a nested data-driven component never has its script read by an ancestor, and so sibling fallback markup is ignored.
230
- */
231
- findInlineScript() {
232
- for (const child of Array.from(this.host.children)) {
233
- if (isJsonScript(child) && child.classList.contains(ROXY_DATA_CLASS)) {
234
- return child;
235
- }
236
- }
237
- return null;
238
- }
239
- parse(text) {
240
- if (!text?.trim()) return void 0;
241
- try {
242
- return JSON.parse(text);
243
- } catch {
244
- return void 0;
245
- }
246
- }
247
- };
248
-
249
- // packages/ui/src/utils/string.ts
250
- function capitalize(s) {
251
- if (!s) return "";
252
- return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
253
- }
254
-
255
- // packages/ui/src/components/transits-table.ts
256
- var RoxyTransitsTable = class extends LitElement {
257
- constructor() {
258
- super();
259
- this.data = null;
260
- new MarkupDataController(this);
261
- }
262
- render() {
263
- if (!this.data?.transitPlanets?.length) {
264
- return html`<div class="roxy-empty" role="status">No transits data</div>`;
265
- }
266
- const {
267
- transitDate,
268
- transitTime,
269
- transitPlanets,
270
- transitAspects,
271
- summary
272
- } = this.data;
273
- const dateStr = [formatDate(transitDate), formatTime(transitTime)].filter(Boolean).join(" ");
274
- return html`<div class="wrap" aria-label="Transit positions table">
275
- <div class="head">
276
- <h2 class="title">Transits</h2>
277
- ${dateStr ? html`<p class="subtitle">${dateStr}</p>` : nothing}
278
- </div>
279
-
280
- ${summary ? this.renderSummaryPills(summary) : nothing}
281
-
282
- <div>
283
- <p class="section-label">Planet positions</p>
284
- <div class="overflow-scroll">
285
- ${this.renderPlanetsTable(transitPlanets)}
286
- </div>
287
- </div>
288
-
289
- ${transitAspects?.length ? html`<div>
290
- <p class="section-label">Transit aspects</p>
291
- <div class="overflow-scroll">
292
- ${this.renderAspectsList(transitAspects)}
293
- </div>
294
- </div>` : nothing}
295
- </div>`;
296
- }
297
- renderSummaryPills(summary) {
298
- return html`<div class="summary-pills" role="region" aria-label="Aspect summary">
299
- <span class="pill pill--muted">
300
- Total: ${summary.totalAspects}
301
- </span>
302
- <span class="pill pill--success">
303
- Harmonious: ${summary.harmonious}
304
- </span>
305
- <span class="pill pill--danger">
306
- Challenging: ${summary.challenging}
307
- </span>
308
- <span class="pill pill--muted">
309
- Neutral: ${summary.neutral}
310
- </span>
311
- </div>`;
312
- }
313
- renderPlanetsTable(planets) {
314
- return html`<table class="planets-table">
315
- <thead>
316
- <tr>
317
- <th scope="col">Planet</th>
318
- <th scope="col">Sign</th>
319
- <th scope="col">Degree</th>
320
- <th scope="col">Speed</th>
321
- </tr>
322
- </thead>
323
- <tbody>
324
- ${planets.map((p) => {
325
- const pGlyph = PLANET_GLYPH[capitalize(p.name)] ?? "";
326
- const sGlyph = SIGN_GLYPH[capitalize(p.sign)] ?? "";
327
- const speedArrow = p.speed >= 0 ? "\u2191" : "\u2193";
328
- return html`<tr>
329
- <td>
330
- <div class="planet-cell">
331
- <span class="glyph" aria-hidden="true">${pGlyph}</span>
332
- ${p.name}
333
- ${p.isRetrograde ? html`<span class="retro-badge" aria-label="retrograde">R</span>` : nothing}
334
- </div>
335
- </td>
336
- <td>
337
- <div class="planet-cell">
338
- <span class="glyph" aria-hidden="true">${sGlyph}</span>
339
- ${p.sign}
340
- </div>
341
- </td>
342
- <td class="num">${formatNumber(p.degree, 2)}</td>
343
- <td class="speed">
344
- <span class="speed-arrow" aria-hidden="true">${speedArrow}</span>
345
- ${formatNumber(Math.abs(p.speed), 4)}
346
- </td>
347
- </tr>`;
348
- })}
349
- </tbody>
350
- </table>`;
351
- }
352
- renderAspectsList(aspects) {
353
- return html`<div role="list" aria-label="Transit aspects">
354
- ${aspects.map((a, idx) => {
355
- const tGlyph = PLANET_GLYPH[capitalize(a.transitPlanet)] ?? "";
356
- const nGlyph = PLANET_GLYPH[capitalize(a.natalPlanet)] ?? "";
357
- const nature = (a.nature ?? "neutral").toLowerCase();
358
- const interp = a.interpretation;
359
- const type = (a.type ?? "").toLowerCase();
360
- const status = a.isApplying ? "Applying" : "Separating";
361
- return html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open=${idx === 0}>
362
- <summary>
363
- <span aria-hidden="true">${tGlyph}</span>
364
- ${a.transitPlanet}
365
- <span class="nature-badge ${nature}">${type}</span>
366
- <span aria-hidden="true">${nGlyph}</span>
367
- ${a.natalPlanet}
368
- <span class="meta">
369
- ${status} · orb ${formatNumber(a.orb, 2)}° · strength ${formatNumber(a.strength, 1)}
370
- </span>
371
- </summary>
372
- <div class="interp-body">
373
- ${interp?.summary ? html`<p>${interp.summary}</p>` : nothing}
374
- ${interp?.impact ? html`<p><strong>Impact:</strong> ${interp.impact}</p>` : nothing}
375
- ${interp?.timing ? html`<p><strong>Timing:</strong> ${interp.timing}</p>` : nothing}
376
- ${interp?.guidance ? html`<p><strong>Guidance:</strong> ${interp.guidance}</p>` : nothing}
377
- ${interp?.keywords?.length ? html`<div class="interp-keywords">
378
- ${interp.keywords.map((k) => html`<span class="kw">${k}</span>`)}
379
- </div>` : nothing}
380
- </div>
381
- </details>`;
382
- })}
383
- </div>`;
384
- }
385
- };
386
- RoxyTransitsTable.styles = [
387
- baseStyles,
388
- css2`
389
- .wrap {
390
- display: grid;
391
- gap: var(--roxy-space-md, 1rem);
392
- }
393
-
394
- .head {
395
- display: flex;
396
- justify-content: space-between;
397
- align-items: baseline;
398
- gap: var(--roxy-space-md, 1rem);
399
- flex-wrap: wrap;
400
- }
401
-
402
- .title {
403
- font-size: var(--roxy-text-lg, 1.125rem);
404
- font-weight: var(--roxy-weight-bold, 600);
405
- margin: 0;
406
- }
407
-
408
- .subtitle {
409
- color: var(--roxy-muted, #71717a);
410
- font-size: var(--roxy-text-sm, 0.875rem);
411
- margin: 0;
412
- }
413
-
414
- .summary-pills {
415
- display: flex;
416
- flex-wrap: wrap;
417
- gap: var(--roxy-space-sm, 0.5rem);
418
- }
419
-
420
- .pill {
421
- display: inline-flex;
422
- align-items: center;
423
- gap: 4px;
424
- padding: 2px var(--roxy-space-sm, 0.5rem);
425
- border-radius: var(--roxy-radius-full, 9999px);
426
- font-size: var(--roxy-text-xs, 0.75rem);
427
- font-weight: var(--roxy-weight-bold, 600);
428
- border: 1px solid currentColor;
429
- }
430
-
431
- .pill--muted {
432
- color: var(--roxy-fg, #0a0a0a);
433
- background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
434
- }
435
-
436
- .pill--success {
437
- color: var(--roxy-success-fg, #166534);
438
- background: color-mix(in srgb, var(--roxy-success, #16a34a) 10%, transparent);
439
- }
440
-
441
- .pill--danger {
442
- color: var(--roxy-danger-fg, #991b1b);
443
- background: color-mix(in srgb, var(--roxy-danger, #dc2626) 10%, transparent);
444
- }
445
-
446
- table {
447
- width: 100%;
448
- border-collapse: collapse;
449
- font-size: var(--roxy-text-sm, 0.875rem);
450
- }
451
-
452
- th,
453
- td {
454
- padding: var(--roxy-space-sm, 0.5rem);
455
- border-bottom: 1px solid var(--roxy-border, #e4e4e7);
456
- text-align: left;
457
- }
458
-
459
- th {
460
- color: var(--roxy-muted, #71717a);
461
- font-weight: var(--roxy-weight-bold, 600);
462
- text-transform: uppercase;
463
- font-size: var(--roxy-text-xs, 0.75rem);
464
- letter-spacing: 0.06em;
465
- }
466
-
467
- .section-label {
468
- font-size: var(--roxy-text-xs, 0.75rem);
469
- color: var(--roxy-muted, #71717a);
470
- text-transform: uppercase;
471
- letter-spacing: 0.06em;
472
- font-weight: var(--roxy-weight-bold, 600);
473
- margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
474
- }
475
-
476
- .glyph {
477
- font-size: 1.1em;
478
- margin-right: 2px;
479
- line-height: 1;
480
- }
481
-
482
- .planet-cell {
483
- display: flex;
484
- align-items: center;
485
- gap: 4px;
486
- white-space: nowrap;
487
- }
488
-
489
- .retro-badge {
490
- display: inline-block;
491
- font-size: 0.7em;
492
- padding: 1px 4px;
493
- border-radius: var(--roxy-radius-sm, 4px);
494
- background: color-mix(in srgb, var(--roxy-warning, #ea580c) 12%, transparent);
495
- color: var(--roxy-warning-fg, #9a3412);
496
- font-weight: var(--roxy-weight-bold, 600);
497
- margin-left: 2px;
498
- vertical-align: middle;
499
- }
500
-
501
- .speed {
502
- font-variant-numeric: tabular-nums;
503
- color: var(--roxy-muted, #71717a);
504
- white-space: nowrap;
505
- }
506
-
507
- .speed-arrow {
508
- font-size: 0.85em;
509
- }
510
-
511
- td.num {
512
- font-variant-numeric: tabular-nums;
513
- color: var(--roxy-muted, #71717a);
514
- }
515
-
516
- .overflow-scroll {
517
- overflow-x: auto;
518
- -webkit-overflow-scrolling: touch;
519
- }
520
-
521
- .aspect-card {
522
- border: 1px solid var(--roxy-border, #e4e4e7);
523
- border-radius: var(--roxy-radius-md, 8px);
524
- padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
525
- margin-bottom: var(--roxy-space-xs, 0.25rem);
526
- }
527
- .aspect-card summary {
528
- cursor: pointer;
529
- font-weight: 500;
530
- color: var(--roxy-fg, #0a0a0a);
531
- display: flex;
532
- flex-wrap: wrap;
533
- align-items: center;
534
- gap: 0.5em;
535
- }
536
- .aspect-card summary .meta {
537
- color: var(--roxy-muted, #71717a);
538
- font-weight: 400;
539
- font-size: var(--roxy-text-xs, 0.75rem);
540
- margin-left: auto;
541
- font-variant-numeric: tabular-nums;
542
- }
543
- .aspect-card .interp-body {
544
- margin-top: var(--roxy-space-xs, 0.25rem);
545
- color: var(--roxy-fg, #0a0a0a);
546
- font-size: var(--roxy-text-sm, 0.875rem);
547
- line-height: 1.45;
548
- }
549
- .aspect-card .interp-body p {
550
- margin: 0 0 var(--roxy-space-xs, 0.25rem);
551
- }
552
- .interp-keywords {
553
- display: flex;
554
- flex-wrap: wrap;
555
- gap: 0.25rem;
556
- margin-top: 0.5rem;
557
- }
558
- .interp-keywords .kw {
559
- padding: 1px 8px;
560
- border-radius: 9999px;
561
- background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
562
- color: var(--roxy-accent-fg, #b45309);
563
- font-size: var(--roxy-text-xs, 0.75rem);
564
- }
565
- .nature-badge {
566
- display: inline-block;
567
- padding: 1px 8px;
568
- border-radius: 9999px;
569
- font-size: var(--roxy-text-xs, 0.75rem);
570
- font-weight: 600;
571
- }
572
- .nature-badge.harmonious {
573
- background: color-mix(in srgb, var(--roxy-success, #16a34a) 12%, transparent);
574
- color: var(--roxy-success-fg, #166534);
575
- }
576
- .nature-badge.challenging {
577
- background: color-mix(in srgb, var(--roxy-danger, #dc2626) 12%, transparent);
578
- color: var(--roxy-danger-fg, #991b1b);
579
- }
580
- .nature-badge.neutral {
581
- background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
582
- color: var(--roxy-fg, #0a0a0a);
583
- }
584
- `
585
- ];
586
- __decorateClass([
587
- property({ attribute: false })
588
- ], RoxyTransitsTable.prototype, "data", 2);
589
- RoxyTransitsTable = __decorateClass([
590
- customElement("roxy-transits-table")
591
- ], RoxyTransitsTable);
592
- export {
593
- RoxyTransitsTable
594
- };
1
+ var C=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var f=(r,e,o,t)=>{for(var s=t>1?void 0:t?z(e,o):e,i=r.length-1,l;i>=0;i--)(l=r[i])&&(s=(t?l(e,o,s):l(s))||s);return t&&s&&C(e,o,s),s};import{css as B,html as n,LitElement as Y,nothing as d}from"lit";import{customElement as j,property as O,state as K}from"lit/decorators.js";var b={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 h={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 M=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],V=M.map(r=>r.toLowerCase());import{css as E}from"lit";var w=E`: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}`;import{css as G,html as H}from"lit";function $(){return H`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var S=G`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;function T(r){if(typeof r!="string"||r.length===0||/^\d{4}-\d{2}-\d{2}$/.test(r))return"";let o=/^\d{2}:\d{2}(:\d{2})?$/.test(r)?`1970-01-01T${r}`:r,t=new Date(o);return Number.isNaN(t.getTime())?r:t.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function k(r){if(typeof r!="string"||r.length===0)return"";let e=new Date(/^\d{4}-\d{2}-\d{2}$/.test(r)?`${r}T00:00:00`:r);return Number.isNaN(e.getTime())?r:e.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function x(r,e=1){return typeof r!="number"||!Number.isFinite(r)?"":r.toFixed(e).replace(/\.?0+$/,"")}var _="roxy-data";function D(r){return r.nodeName==="SCRIPT"&&r.getAttribute("type")==="application/json"}var v=class{constructor(e){this.host=e,e.addController(this)}hostConnected(){if(this.host.data!=null)return;let e=this.read();e!==void 0&&(this.host.data=e,this.host.requestUpdate())}read(){let e=this.findInlineScript();return e?this.parse(e.textContent):void 0}findInlineScript(){for(let e of Array.from(this.host.children))if(D(e)&&e.classList.contains(_))return e;return null}parse(e){if(e?.trim())try{return JSON.parse(e)}catch{return}}};function y(r){return r?r.charAt(0).toUpperCase()+r.slice(1).toLowerCase():""}import{css as I,html as A,nothing as q}from"lit";var L=I`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-fg,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function R(r){let{items:e,active:o,onSelect:t,label:s,idPrefix:i,controls:l=!1}=r;return A`<div class="roxy-tablist" role="tablist" aria-label="${s}" @keydown="${a=>{if(a.key!=="ArrowRight"&&a.key!=="ArrowLeft")return;a.preventDefault();let c=e.findIndex(N=>N.id===o);if(c===-1)return;let u=a.key==="ArrowRight"?1:-1,g=e[(c+u+e.length)%e.length];if(!g)return;t(g.id);let P=a.currentTarget.getRootNode();requestAnimationFrame(()=>{P.querySelector(`#${i}-tab-${g.id}`)?.focus()})}}">${e.map(a=>A`<button type="button" class="roxy-tab" role="tab" id="${i}-tab-${a.id}" aria-selected="${o===a.id?"true":"false"}" aria-controls="${l&&o===a.id?`${i}-panel-${a.id}`:q}" tabindex="${o===a.id?"0":"-1"}" @click="${()=>t(a.id)}">${a.label}</button>`)}</div>`}var p=class extends Y{constructor(){super();this.data=null;this.tab="positions";new v(this)}render(){if(!this.data?.transitPlanets?.length)return n`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:o,transitTime:t,transitPlanets:s,transitAspects:i,summary:l}=this.data,m=[k(o),T(t)].filter(Boolean).join(" "),a=i?.length??0,c=this.tab;return n`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${m?n`<p class="subtitle">${m}</p>`:d}</div>${a>0?n`${R({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${a})`}],active:c,onSelect:u=>{this.tab=u},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?n`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:n`${l?this.renderSummaryPills(l):d}<div class="overflow-scroll">${this.renderAspectsList(i??[])}</div>`}</div>`:n`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(o){return n`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${o.totalAspects} </span><span class="pill pill--success">Harmonious: ${o.harmonious} </span><span class="pill pill--danger">Challenging: ${o.challenging} </span><span class="pill pill--muted">Neutral: ${o.neutral}</span></div>`}renderPlanetsTable(o){return n`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${o.map(t=>{let s=b[y(t.name)]??"",i=h[y(t.sign)]??"",l=t.speed>=0?"\u2191":"\u2193";return n`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${t.name} ${t.isRetrograde?n`<span class="retro-badge" aria-label="retrograde">R</span>`:d}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${i}</span> ${t.sign}</div></td><td class="num">${x(t.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${l}</span> ${x(Math.abs(t.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(o){return n`<div role="list" aria-label="Transit aspects">${o.map((t,s)=>{let i=b[y(t.transitPlanet)]??"",l=b[y(t.natalPlanet)]??"",m=(t.nature??"neutral").toLowerCase(),a=t.interpretation,c=(t.type??"").toLowerCase(),u=t.isApplying?"Applying":"Separating";return n`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${s===0}"><summary><span aria-hidden="true">${i}</span> ${t.transitPlanet} <span class="nature-badge ${m}">${c}</span> <span aria-hidden="true">${l}</span> ${t.natalPlanet} <span class="meta">${u} · orb ${x(t.orb,2)}° · strength ${x(t.strength,1)} </span>${$()}</summary><div class="interp-body">${a?.summary?n`<p>${a.summary}</p>`:d} ${a?.impact?n`<p><strong>Impact:</strong> ${a.impact}</p>`:d} ${a?.timing?n`<p><strong>Timing:</strong> ${a.timing}</p>`:d} ${a?.guidance?n`<p><strong>Guidance:</strong> ${a.guidance}</p>`:d} ${a?.keywords?.length?n`<div class="interp-keywords">${a.keywords.map(g=>n`<span class="kw">${g}</span>`)}</div>`:d}</div></details>`})}</div>`}};p.styles=[w,L,S,B`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-fg,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],f([O({attribute:!1})],p.prototype,"data",2),f([K()],p.prototype,"tab",2),p=f([j("roxy-transits-table")],p);export{p as RoxyTransitsTable};
595
2
  //# sourceMappingURL=transits-table.js.map