@roxyapi/ui 0.5.0 → 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 (153) 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 +3 -283
  11. package/dist/cdn/components/dasha-timeline.js.map +4 -4
  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 +3 -356
  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 +3 -563
  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 +2 -398
  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 +3 -305
  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 +3 -5102
  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.d.ts.map +1 -1
  74. package/dist/components/dasha-timeline.js +1 -447
  75. package/dist/components/dasha-timeline.js.map +4 -4
  76. package/dist/components/data.js +1 -408
  77. package/dist/components/data.js.map +3 -3
  78. package/dist/components/divisional-chart.d.ts.map +1 -1
  79. package/dist/components/divisional-chart.js +1 -932
  80. package/dist/components/divisional-chart.js.map +4 -4
  81. package/dist/components/dosha-card.js +1 -339
  82. package/dist/components/dosha-card.js.map +3 -3
  83. package/dist/components/endpoint-form.js +1 -505
  84. package/dist/components/endpoint-form.js.map +3 -3
  85. package/dist/components/guna-milan.js +1 -420
  86. package/dist/components/guna-milan.js.map +3 -3
  87. package/dist/components/hexagram.js +1 -426
  88. package/dist/components/hexagram.js.map +3 -3
  89. package/dist/components/horoscope-card.js +1 -427
  90. package/dist/components/horoscope-card.js.map +3 -3
  91. package/dist/components/kp-chart.js +1 -441
  92. package/dist/components/kp-chart.js.map +3 -3
  93. package/dist/components/kp-planets-table.js +1 -292
  94. package/dist/components/kp-planets-table.js.map +3 -3
  95. package/dist/components/kp-ruling-planets.js +1 -334
  96. package/dist/components/kp-ruling-planets.js.map +3 -3
  97. package/dist/components/location-search.js +1 -461
  98. package/dist/components/location-search.js.map +3 -3
  99. package/dist/components/moon-phase.js +1 -373
  100. package/dist/components/moon-phase.js.map +3 -3
  101. package/dist/components/nakshatra-card.js +1 -290
  102. package/dist/components/nakshatra-card.js.map +3 -3
  103. package/dist/components/natal-chart.d.ts +0 -1
  104. package/dist/components/natal-chart.d.ts.map +1 -1
  105. package/dist/components/natal-chart.js +1 -1086
  106. package/dist/components/natal-chart.js.map +4 -4
  107. package/dist/components/numerology-card.js +1 -361
  108. package/dist/components/numerology-card.js.map +3 -3
  109. package/dist/components/panchang-table.js +1 -396
  110. package/dist/components/panchang-table.js.map +3 -3
  111. package/dist/components/shadbala-table.js +1 -459
  112. package/dist/components/shadbala-table.js.map +3 -3
  113. package/dist/components/synastry-chart.js +1 -704
  114. package/dist/components/synastry-chart.js.map +3 -3
  115. package/dist/components/tarot-card.js +1 -379
  116. package/dist/components/tarot-card.js.map +3 -3
  117. package/dist/components/tarot-spread.js +1 -356
  118. package/dist/components/tarot-spread.js.map +3 -3
  119. package/dist/components/transits-table.d.ts +2 -0
  120. package/dist/components/transits-table.d.ts.map +1 -1
  121. package/dist/components/transits-table.js +1 -594
  122. package/dist/components/transits-table.js.map +4 -4
  123. package/dist/components/vedic-kundli.d.ts.map +1 -1
  124. package/dist/components/vedic-kundli.js +1 -848
  125. package/dist/components/vedic-kundli.js.map +4 -4
  126. package/dist/components/vedic-planets-table.js +1 -414
  127. package/dist/components/vedic-planets-table.js.map +3 -3
  128. package/dist/components/western-planets-table.js +1 -409
  129. package/dist/components/western-planets-table.js.map +3 -3
  130. package/dist/components/yoga-list.js +1 -429
  131. package/dist/components/yoga-list.js.map +3 -3
  132. package/dist/index.cjs +1 -8726
  133. package/dist/index.cjs.map +4 -4
  134. package/dist/index.js +1 -8706
  135. package/dist/index.js.map +4 -4
  136. package/dist/utils/disclosure.d.ts +16 -0
  137. package/dist/utils/disclosure.d.ts.map +1 -0
  138. package/dist/utils/kundli-render.d.ts.map +1 -1
  139. package/dist/utils/kundli-styles.d.ts.map +1 -1
  140. package/dist/utils/tablist.d.ts +44 -0
  141. package/dist/utils/tablist.d.ts.map +1 -0
  142. package/dist/version.d.ts +1 -1
  143. package/package.json +3 -1
  144. package/src/components/dasha-timeline.ts +10 -1
  145. package/src/components/divisional-chart.ts +2 -0
  146. package/src/components/natal-chart.ts +37 -62
  147. package/src/components/transits-table.ts +45 -18
  148. package/src/components/vedic-kundli.ts +2 -1
  149. package/src/utils/disclosure.ts +62 -0
  150. package/src/utils/kundli-render.ts +21 -35
  151. package/src/utils/kundli-styles.ts +0 -31
  152. package/src/utils/tablist.ts +124 -0
  153. package/src/version.ts +1 -1
@@ -1,578 +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/ashtakavarga-grid.ts
13
- import { css as css2, html, LitElement, nothing } from "lit";
14
- import { customElement, property, state } from "lit/decorators.js";
15
-
16
- // packages/ui/src/tokens/index.ts
17
- var SIGN_GLYPH = {
18
- Aries: "\u2648",
19
- Taurus: "\u2649",
20
- Gemini: "\u264A",
21
- Cancer: "\u264B",
22
- Leo: "\u264C",
23
- Virgo: "\u264D",
24
- Libra: "\u264E",
25
- Scorpio: "\u264F",
26
- Sagittarius: "\u2650",
27
- Capricorn: "\u2651",
28
- Aquarius: "\u2652",
29
- Pisces: "\u2653"
30
- };
31
- var SIGNS_ORDER = [
32
- "Aries",
33
- "Taurus",
34
- "Gemini",
35
- "Cancer",
36
- "Leo",
37
- "Virgo",
38
- "Libra",
39
- "Scorpio",
40
- "Sagittarius",
41
- "Capricorn",
42
- "Aquarius",
43
- "Pisces"
44
- ];
45
- var RASHI_KEYS = SIGNS_ORDER.map(
46
- (s) => s.toLowerCase()
47
- );
48
-
49
- // packages/ui/src/utils/base-styles.ts
50
- import { css } from "lit";
51
- var baseStyles = css`
52
- :host {
53
- display: block;
54
- container-type: inline-size;
55
- font-family: var(
56
- --roxy-font-sans,
57
- system-ui,
58
- -apple-system,
59
- BlinkMacSystemFont,
60
- 'Segoe UI',
61
- Roboto,
62
- sans-serif
63
- );
64
- color: var(--roxy-fg, #0a0a0a);
65
- background: transparent;
66
- font-size: var(--roxy-text-base, 1rem);
67
- line-height: var(--roxy-leading-normal, 1.5);
68
- animation: roxy-fade-in var(--roxy-motion-duration, 200ms)
69
- var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;
70
- }
71
-
72
- *,
73
- *::before,
74
- *::after {
75
- box-sizing: border-box;
76
- }
77
-
78
- @keyframes roxy-fade-in {
79
- from {
80
- opacity: 0;
81
- transform: translateY(2px);
82
- }
83
- to {
84
- opacity: 1;
85
- transform: translateY(0);
86
- }
87
- }
88
-
89
- @media (prefers-reduced-motion: reduce) {
90
- :host {
91
- animation: none;
92
- }
93
- }
94
-
95
- .roxy-skeleton {
96
- background: linear-gradient(
97
- 90deg,
98
- var(--roxy-border, #e4e4e7) 0%,
99
- color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,
100
- var(--roxy-border, #e4e4e7) 100%
101
- );
102
- background-size: 200% 100%;
103
- animation: roxy-shimmer 1.4s ease-in-out infinite;
104
- border-radius: var(--roxy-radius-md, 8px);
105
- }
106
-
107
- @keyframes roxy-shimmer {
108
- 0% {
109
- background-position: 200% 0;
110
- }
111
- 100% {
112
- background-position: -200% 0;
113
- }
114
- }
115
-
116
- @media (prefers-reduced-motion: reduce) {
117
- .roxy-skeleton {
118
- animation: none;
119
- }
120
- }
121
-
122
- .roxy-empty {
123
- padding: var(--roxy-space-lg, 1.5rem);
124
- color: var(--roxy-muted, #71717a);
125
- text-align: center;
126
- font-size: var(--roxy-text-sm, 0.875rem);
127
- }
128
-
129
- :host(:focus-within) .roxy-card {
130
- outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
131
- outline-offset: 2px;
132
- }
133
-
134
- /* Force the text-style variant on every Unicode glyph in the component.
135
- * macOS and iOS substitute coloured emoji glyphs for the planetary and
136
- * gender Unicode code points (Mars, Venus, Mercury, etc.) when the
137
- * system colour-emoji font wins font selection. The text-style variant
138
- * keeps glyphs monochrome so they inherit the surrounding fill colour
139
- * and match the brand palette consistently across platforms.
140
- *
141
- * font-variant-emoji is part of CSS Fonts 4 (Safari 17+, Chrome 134+,
142
- * Firefox 139+). On older browsers the rule is silently ignored.
143
- */
144
- :host {
145
- font-variant-emoji: text;
146
- }
147
- `;
148
-
149
- // packages/ui/src/utils/markup-data.ts
150
- var ROXY_DATA_CLASS = "roxy-data";
151
- function isJsonScript(el) {
152
- return el.nodeName === "SCRIPT" && el.getAttribute("type") === "application/json";
153
- }
154
- var MarkupDataController = class {
155
- constructor(host) {
156
- this.host = host;
157
- host.addController(this);
158
- }
159
- hostConnected() {
160
- if (this.host.data != null) return;
161
- const parsed = this.read();
162
- if (parsed === void 0) return;
163
- this.host.data = parsed;
164
- this.host.requestUpdate();
165
- }
166
- /**
167
- * Resolve the embedded payload. Returns `undefined` when there is nothing valid to read so the caller can leave `host.data` untouched.
168
- */
169
- read() {
170
- const inline = this.findInlineScript();
171
- return inline ? this.parse(inline.textContent) : void 0;
172
- }
173
- /**
174
- * 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.
175
- */
176
- findInlineScript() {
177
- for (const child of Array.from(this.host.children)) {
178
- if (isJsonScript(child) && child.classList.contains(ROXY_DATA_CLASS)) {
179
- return child;
180
- }
181
- }
182
- return null;
183
- }
184
- parse(text) {
185
- if (!text?.trim()) return void 0;
186
- try {
187
- return JSON.parse(text);
188
- } catch {
189
- return void 0;
190
- }
191
- }
192
- };
193
-
194
- // packages/ui/src/components/ashtakavarga-grid.ts
195
- var TAB_LABELS = {
196
- sarva: "Sarvashtakavarga",
197
- bhinna: "Bhinnashtakavarga",
198
- pinda: "Shodhya Pinda"
199
- };
200
- var TABS = ["sarva", "bhinna", "pinda"];
201
- var RoxyAshtakavargaGrid = class extends LitElement {
202
- constructor() {
203
- super();
204
- this.data = null;
205
- this.activeTab = "sarva";
206
- new MarkupDataController(this);
207
- }
208
- render() {
209
- if (!this.data) {
210
- return html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;
211
- }
212
- const signs = this.data.signs ?? [];
213
- return html`<div class="wrap" aria-label="Ashtakavarga grid">
214
- <div class="head">
215
- <h2 class="title">Ashtakavarga</h2>
216
- ${signs.length ? html`<p class="subtitle">${signs.length} signs</p>` : nothing}
217
- </div>
218
-
219
- <div
220
- class="tablist"
221
- role="tablist"
222
- aria-label="Ashtakavarga views"
223
- @keydown=${this.onTabKeyDown}
224
- >
225
- ${TABS.map(
226
- (tab) => html`<button
227
- class="tab"
228
- role="tab"
229
- id="tab-${tab}"
230
- aria-selected=${this.activeTab === tab ? "true" : "false"}
231
- aria-controls="panel-${tab}"
232
- tabindex=${this.activeTab === tab ? "0" : "-1"}
233
- @click=${() => {
234
- this.activeTab = tab;
235
- }}
236
- >
237
- ${TAB_LABELS[tab]}
238
- </button>`
239
- )}
240
- </div>
241
-
242
- <div
243
- id="panel-${this.activeTab}"
244
- role="tabpanel"
245
- aria-labelledby="tab-${this.activeTab}"
246
- >
247
- ${this.activeTab === "sarva" ? this.renderSarva(signs) : this.activeTab === "bhinna" ? this.renderBhinna(signs) : this.renderPinda()}
248
- </div>
249
- </div>`;
250
- }
251
- onTabKeyDown(e) {
252
- const idx = TABS.indexOf(this.activeTab);
253
- if (e.key === "ArrowRight") {
254
- e.preventDefault();
255
- this.activeTab = TABS[(idx + 1) % TABS.length];
256
- this.focusActiveTab();
257
- } else if (e.key === "ArrowLeft") {
258
- e.preventDefault();
259
- this.activeTab = TABS[(idx - 1 + TABS.length) % TABS.length];
260
- this.focusActiveTab();
261
- }
262
- }
263
- focusActiveTab() {
264
- requestAnimationFrame(() => {
265
- const btn = this.shadowRoot?.querySelector(
266
- `#tab-${this.activeTab}`
267
- );
268
- btn?.focus();
269
- });
270
- }
271
- /**
272
- * Bhinna bindus per planet per sign run 0..8 (sum of 0/1 contributions
273
- * from each of the 8 reference points). Bucket directly by raw count.
274
- */
275
- bhinnaHeat(count) {
276
- if (count <= 1) return "heat-1";
277
- if (count <= 2) return "heat-2";
278
- if (count <= 3) return "heat-3";
279
- if (count <= 4) return "heat-4";
280
- if (count <= 5) return "heat-5";
281
- if (count <= 6) return "heat-6";
282
- return "heat-7";
283
- }
284
- /**
285
- * Sarva bindus per sign are the column total across all 7 planets, range
286
- * roughly 0..56 with typical values 20..40. Bucketed per classical
287
- * interpretation: 25 below par, 25..30 average, 30..40 strong, 40+ very
288
- * strong. Bucket spans intentionally widen at the extremes so a single
289
- * outlier sign reads as exceptional.
290
- */
291
- sarvaHeat(count) {
292
- if (count <= 18) return "heat-1";
293
- if (count <= 23) return "heat-2";
294
- if (count <= 28) return "heat-3";
295
- if (count <= 32) return "heat-4";
296
- if (count <= 37) return "heat-5";
297
- if (count <= 42) return "heat-6";
298
- return "heat-7";
299
- }
300
- renderSarva(signs) {
301
- const sav = this.data.sarvashtakavarga;
302
- if (!sav) return html`<p class="roxy-empty">No sarvashtakavarga data</p>`;
303
- return html`<div class="overflow-scroll">
304
- <table aria-label="Sarvashtakavarga bindu counts per sign">
305
- <thead>
306
- <tr>
307
- <th scope="col">Sign</th>
308
- <th scope="col">Bindus</th>
309
- </tr>
310
- </thead>
311
- <tbody>
312
- ${signs.map((sign, i) => {
313
- const count = sav.bindus[i] ?? 0;
314
- const hc = this.sarvaHeat(count);
315
- return html`<tr>
316
- <td>
317
- <div class="planet-cell">
318
- <span class="glyph" aria-hidden="true">${SIGN_GLYPH[sign] ?? ""}</span>
319
- ${sign}
320
- </div>
321
- </td>
322
- <td class="${`heat-cell ${hc}`}">${count}</td>
323
- </tr>`;
324
- })}
325
- </tbody>
326
- <tfoot>
327
- <tr class="total-row">
328
- <td>Total</td>
329
- <td>${sav.total}</td>
330
- </tr>
331
- </tfoot>
332
- </table>
333
- </div>`;
334
- }
335
- renderBhinna(signs) {
336
- const bhinna = this.data.bhinnashtakavarga;
337
- if (!bhinna?.length)
338
- return html`<p class="roxy-empty">No bhinnashtakavarga data</p>`;
339
- return html`<div class="overflow-scroll">
340
- <table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid">
341
- <thead>
342
- <tr>
343
- <th scope="col">Planet</th>
344
- ${signs.map(
345
- (s) => html`<th scope="col" title=${s}>${SIGN_GLYPH[s] ?? s.slice(0, 2)}</th>`
346
- )}
347
- <th scope="col">Total</th>
348
- </tr>
349
- </thead>
350
- <tbody>
351
- ${bhinna.map(
352
- (row) => html`<tr>
353
- <td>${row.planet}</td>
354
- ${row.bindus.map((count) => {
355
- const hc = this.bhinnaHeat(count);
356
- return html`<td class="${`heat-cell ${hc}`}">${count}</td>`;
357
- })}
358
- <td>${row.total}</td>
359
- </tr>`
360
- )}
361
- </tbody>
362
- </table>
363
- </div>`;
364
- }
365
- renderPinda() {
366
- const pinda = this.data.shodhyaPinda;
367
- if (!pinda?.length)
368
- return html`<p class="roxy-empty">No shodhya pinda data</p>`;
369
- return html`<div class="overflow-scroll">
370
- <table aria-label="Shodhya Pinda planet strength scores">
371
- <thead>
372
- <tr>
373
- <th scope="col">Planet</th>
374
- <th scope="col">Rashi Pinda</th>
375
- <th scope="col">Graha Pinda</th>
376
- <th scope="col">Shodhya Pinda</th>
377
- </tr>
378
- </thead>
379
- <tbody>
380
- ${pinda.map(
381
- (row) => html`<tr>
382
- <td>${row.planet}</td>
383
- <td>${row.rashiPinda}</td>
384
- <td>${row.grahaPinda}</td>
385
- <td>${row.shodhyaPinda}</td>
386
- </tr>`
387
- )}
388
- </tbody>
389
- </table>
390
- </div>`;
391
- }
392
- };
393
- RoxyAshtakavargaGrid.styles = [
394
- baseStyles,
395
- css2`
396
- .wrap {
397
- display: grid;
398
- gap: var(--roxy-space-md, 1rem);
399
- }
400
-
401
- .head {
402
- display: flex;
403
- justify-content: space-between;
404
- align-items: baseline;
405
- gap: var(--roxy-space-md, 1rem);
406
- flex-wrap: wrap;
407
- }
408
-
409
- .title {
410
- font-size: var(--roxy-text-lg, 1.125rem);
411
- font-weight: var(--roxy-weight-bold, 600);
412
- margin: 0;
413
- }
414
-
415
- .subtitle {
416
- color: var(--roxy-muted, #71717a);
417
- font-size: var(--roxy-text-sm, 0.875rem);
418
- margin: 0;
419
- }
420
-
421
- /* Tabs */
422
- .tablist {
423
- display: flex;
424
- gap: 2px;
425
- border-bottom: 2px solid var(--roxy-border, #e4e4e7);
426
- }
427
-
428
- .tab {
429
- padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
430
- font-size: var(--roxy-text-sm, 0.875rem);
431
- background: none;
432
- border: none;
433
- border-bottom: 2px solid transparent;
434
- margin-bottom: -2px;
435
- cursor: pointer;
436
- color: var(--roxy-muted, #71717a);
437
- font-family: inherit;
438
- transition: color var(--roxy-motion-duration, 200ms) var(--roxy-motion-easing, ease);
439
- }
440
-
441
- .tab[aria-selected='true'] {
442
- color: var(--roxy-accent-fg, #b45309);
443
- border-bottom-color: var(--roxy-accent, #f59e0b);
444
- font-weight: var(--roxy-weight-bold, 600);
445
- }
446
-
447
- .tab:hover:not([aria-selected='true']) {
448
- color: var(--roxy-fg, #0a0a0a);
449
- }
450
-
451
- /* Tables */
452
- .overflow-scroll {
453
- overflow-x: auto;
454
- -webkit-overflow-scrolling: touch;
455
- }
456
-
457
- table {
458
- width: 100%;
459
- border-collapse: collapse;
460
- font-size: var(--roxy-text-sm, 0.875rem);
461
- }
462
-
463
- th,
464
- td {
465
- padding: var(--roxy-space-sm, 0.5rem);
466
- border-bottom: 1px solid var(--roxy-border, #e4e4e7);
467
- text-align: center;
468
- }
469
-
470
- th {
471
- color: var(--roxy-muted, #71717a);
472
- font-weight: var(--roxy-weight-bold, 600);
473
- text-transform: uppercase;
474
- font-size: var(--roxy-text-xs, 0.75rem);
475
- letter-spacing: 0.06em;
476
- }
477
-
478
- td:first-child,
479
- th:first-child {
480
- text-align: left;
481
- }
482
-
483
- .glyph {
484
- font-size: 1.1em;
485
- margin-right: 3px;
486
- line-height: 1;
487
- }
488
-
489
- .planet-cell {
490
- display: flex;
491
- align-items: center;
492
- gap: 4px;
493
- white-space: nowrap;
494
- }
495
-
496
- .total-row td {
497
- font-weight: var(--roxy-weight-bold, 600);
498
- border-top: 2px solid var(--roxy-border, #e4e4e7);
499
- border-bottom: none;
500
- }
501
-
502
- /* Heat cells. Single base hue (var --roxy-heat) mixed with
503
- * transparent at increasing percentages produces seven readable
504
- * tiers in both light and dark themes. Text colour stays
505
- * var(--roxy-fg) so it inverts with the host theme without
506
- * per-tier overrides. */
507
- .heat-cell {
508
- border-radius: var(--roxy-radius-sm, 4px);
509
- font-weight: var(--roxy-weight-bold, 600);
510
- min-width: 2rem;
511
- font-variant-numeric: tabular-nums;
512
- color: var(--roxy-fg, currentColor);
513
- }
514
-
515
- .heat-1 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 6%, transparent); }
516
- .heat-2 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 14%, transparent); }
517
- .heat-3 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 26%, transparent); }
518
- .heat-4 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 40%, transparent); }
519
- .heat-5 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 55%, transparent); }
520
- .heat-6 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 72%, transparent); }
521
- .heat-7 { background: color-mix(in srgb, var(--roxy-heat, #ef4444) 90%, transparent); }
522
-
523
- /* Bhinna grid: planet header column narrower */
524
- .bhinna-table th:first-child,
525
- .bhinna-table td:first-child {
526
- min-width: 5rem;
527
- }
528
-
529
- /* Tight cells below 480px so the 14-column bhinna grid stops
530
- * overflowing the viewport. The wrapper keeps overflow-x:auto as
531
- * a fallback for very long content. */
532
- @container (max-width: 480px) {
533
- .bhinna-table th,
534
- .bhinna-table td {
535
- padding: 0.3rem 0.35rem;
536
- font-size: var(--roxy-text-xs, 0.75rem);
537
- }
538
- .bhinna-table th:first-child,
539
- .bhinna-table td:first-child {
540
- min-width: 3.5rem;
541
- }
542
- .heat-cell {
543
- min-width: 1.5rem;
544
- }
545
- }
546
- /* Visual cue that the bhinna table is scrollable below the breakpoint:
547
- * a soft gradient at the right edge so users see there is more to scroll. */
548
- .overflow-scroll {
549
- mask-image: linear-gradient(
550
- to right,
551
- transparent 0,
552
- black 0.5rem,
553
- black calc(100% - 1rem),
554
- transparent 100%
555
- );
556
- -webkit-mask-image: linear-gradient(
557
- to right,
558
- transparent 0,
559
- black 0.5rem,
560
- black calc(100% - 1rem),
561
- transparent 100%
562
- );
563
- }
564
- `
565
- ];
566
- __decorateClass([
567
- property({ attribute: false })
568
- ], RoxyAshtakavargaGrid.prototype, "data", 2);
569
- __decorateClass([
570
- state()
571
- ], RoxyAshtakavargaGrid.prototype, "activeTab", 2);
572
- RoxyAshtakavargaGrid = __decorateClass([
573
- customElement("roxy-ashtakavarga-grid")
574
- ], RoxyAshtakavargaGrid);
575
- export {
576
- RoxyAshtakavargaGrid
577
- };
1
+ var m=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var c=(o,a,t,e)=>{for(var r=e>1?void 0:e?g(a,t):a,i=o.length-1,s;i>=0;i--)(s=o[i])&&(r=(e?s(a,t,r):s(r))||r);return e&&r&&m(a,t,r),r};import{css as S,html as n,LitElement as w,nothing as k}from"lit";import{customElement as T,property as A,state as $}from"lit/decorators.js";var p={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 v=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],R=v.map(o=>o.toLowerCase());import{css as f}from"lit";var b=f`: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}`;var x="roxy-data";function y(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var h=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(y(a)&&a.classList.contains(x))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var L={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},l=["sarva","bhinna","pinda"],d=class extends w{constructor(){super();this.data=null;this.activeTab="sarva";new h(this)}render(){if(!this.data)return n`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let t=this.data.signs??[];return n`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${t.length?n`<p class="subtitle">${t.length} signs</p>`:k}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${l.map(e=>n`<button class="tab" role="tab" id="tab-${e}" aria-selected="${this.activeTab===e?"true":"false"}" aria-controls="panel-${e}" tabindex="${this.activeTab===e?"0":"-1"}" @click="${()=>{this.activeTab=e}}">${L[e]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(t):this.activeTab==="bhinna"?this.renderBhinna(t):this.renderPinda()}</div></div>`}onTabKeyDown(t){let e=l.indexOf(this.activeTab);t.key==="ArrowRight"?(t.preventDefault(),this.activeTab=l[(e+1)%l.length],this.focusActiveTab()):t.key==="ArrowLeft"&&(t.preventDefault(),this.activeTab=l[(e-1+l.length)%l.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(t){return t<=1?"heat-1":t<=2?"heat-2":t<=3?"heat-3":t<=4?"heat-4":t<=5?"heat-5":t<=6?"heat-6":"heat-7"}sarvaHeat(t){return t<=18?"heat-1":t<=23?"heat-2":t<=28?"heat-3":t<=32?"heat-4":t<=37?"heat-5":t<=42?"heat-6":"heat-7"}renderSarva(t){let e=this.data.sarvashtakavarga;return e?n`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${t.map((r,i)=>{let s=e.bindus[i]??0,u=this.sarvaHeat(s);return n`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${p[r]??""}</span> ${r}</div></td><td class="${`heat-cell ${u}`}">${s}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${e.total}</td></tr></tfoot></table></div>`:n`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(t){let e=this.data.bhinnashtakavarga;return e?.length?n`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${t.map(r=>n`<th scope="col" title="${r}">${p[r]??r.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${e.map(r=>n`<tr><td>${r.planet}</td>${r.bindus.map(i=>{let s=this.bhinnaHeat(i);return n`<td class="${`heat-cell ${s}`}">${i}</td>`})}<td>${r.total}</td></tr>`)}</tbody></table></div>`:n`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let t=this.data.shodhyaPinda;return t?.length?n`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${t.map(e=>n`<tr><td>${e.planet}</td><td>${e.rashiPinda}</td><td>${e.grahaPinda}</td><td>${e.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:n`<p class="roxy-empty">No shodhya pinda data</p>`}};d.styles=[b,S`.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}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.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}.tab[aria-selected=true]{color:var(--roxy-accent-fg,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}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:center}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:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],c([A({attribute:!1})],d.prototype,"data",2),c([$()],d.prototype,"activeTab",2),d=c([T("roxy-ashtakavarga-grid")],d);export{d as RoxyAshtakavargaGrid};
578
2
  //# sourceMappingURL=ashtakavarga-grid.js.map