@roxyapi/ui 0.6.1 → 0.7.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 (136) hide show
  1. package/AGENTS.md +13 -0
  2. package/README.md +1 -1
  3. package/THEMING.md +1 -1
  4. package/dist/cdn/components/ashtakavarga-grid.js +1 -1
  5. package/dist/cdn/components/ashtakavarga-grid.js.map +2 -2
  6. package/dist/cdn/components/biorhythm-chart.js +3 -3
  7. package/dist/cdn/components/biorhythm-chart.js.map +2 -2
  8. package/dist/cdn/components/choghadiya-grid.js +1 -1
  9. package/dist/cdn/components/choghadiya-grid.js.map +2 -2
  10. package/dist/cdn/components/compatibility-card.js +1 -1
  11. package/dist/cdn/components/compatibility-card.js.map +2 -2
  12. package/dist/cdn/components/dasha-timeline.js +2 -2
  13. package/dist/cdn/components/dasha-timeline.js.map +2 -2
  14. package/dist/cdn/components/divisional-chart.js +2 -2
  15. package/dist/cdn/components/divisional-chart.js.map +2 -2
  16. package/dist/cdn/components/endpoint-form.js +2 -2
  17. package/dist/cdn/components/endpoint-form.js.map +2 -2
  18. package/dist/cdn/components/guna-milan.js +1 -1
  19. package/dist/cdn/components/guna-milan.js.map +2 -2
  20. package/dist/cdn/components/hexagram.js +1 -1
  21. package/dist/cdn/components/hexagram.js.map +2 -2
  22. package/dist/cdn/components/horoscope-card.js +1 -1
  23. package/dist/cdn/components/horoscope-card.js.map +2 -2
  24. package/dist/cdn/components/kp-chart.js +1 -1
  25. package/dist/cdn/components/kp-chart.js.map +2 -2
  26. package/dist/cdn/components/kp-ruling-planets.js +1 -1
  27. package/dist/cdn/components/kp-ruling-planets.js.map +2 -2
  28. package/dist/cdn/components/location-search.js +1 -1
  29. package/dist/cdn/components/location-search.js.map +2 -2
  30. package/dist/cdn/components/nakshatra-card.js +1 -1
  31. package/dist/cdn/components/nakshatra-card.js.map +2 -2
  32. package/dist/cdn/components/natal-chart.js +4 -4
  33. package/dist/cdn/components/natal-chart.js.map +2 -2
  34. package/dist/cdn/components/numerology-card.js +2 -2
  35. package/dist/cdn/components/numerology-card.js.map +2 -2
  36. package/dist/cdn/components/panchang-table.js +3 -3
  37. package/dist/cdn/components/panchang-table.js.map +3 -3
  38. package/dist/cdn/components/shadbala-table.js +1 -1
  39. package/dist/cdn/components/shadbala-table.js.map +2 -2
  40. package/dist/cdn/components/synastry-chart.js +3 -3
  41. package/dist/cdn/components/synastry-chart.js.map +2 -2
  42. package/dist/cdn/components/transits-table.js +2 -2
  43. package/dist/cdn/components/transits-table.js.map +2 -2
  44. package/dist/cdn/components/vedic-kundli.js +10 -10
  45. package/dist/cdn/components/vedic-kundli.js.map +2 -2
  46. package/dist/cdn/components/vedic-planets-table.js +3 -3
  47. package/dist/cdn/components/vedic-planets-table.js.map +4 -4
  48. package/dist/cdn/components/yoga-list.js +2 -2
  49. package/dist/cdn/components/yoga-list.js.map +2 -2
  50. package/dist/cdn/roxy-ui.js +25 -25
  51. package/dist/cdn/roxy-ui.js.map +3 -3
  52. package/dist/components/ashtakavarga-grid.js +1 -1
  53. package/dist/components/ashtakavarga-grid.js.map +3 -3
  54. package/dist/components/biorhythm-chart.js +1 -1
  55. package/dist/components/biorhythm-chart.js.map +2 -2
  56. package/dist/components/choghadiya-grid.js +1 -1
  57. package/dist/components/choghadiya-grid.js.map +2 -2
  58. package/dist/components/compatibility-card.js +1 -1
  59. package/dist/components/compatibility-card.js.map +2 -2
  60. package/dist/components/dasha-timeline.js +1 -1
  61. package/dist/components/dasha-timeline.js.map +2 -2
  62. package/dist/components/divisional-chart.js +2 -2
  63. package/dist/components/divisional-chart.js.map +2 -2
  64. package/dist/components/endpoint-form.js +1 -1
  65. package/dist/components/endpoint-form.js.map +2 -2
  66. package/dist/components/guna-milan.js +1 -1
  67. package/dist/components/guna-milan.js.map +2 -2
  68. package/dist/components/hexagram.js +1 -1
  69. package/dist/components/hexagram.js.map +2 -2
  70. package/dist/components/horoscope-card.js +1 -1
  71. package/dist/components/horoscope-card.js.map +2 -2
  72. package/dist/components/kp-chart.js +1 -1
  73. package/dist/components/kp-chart.js.map +2 -2
  74. package/dist/components/kp-ruling-planets.js +1 -1
  75. package/dist/components/kp-ruling-planets.js.map +2 -2
  76. package/dist/components/location-search.js +1 -1
  77. package/dist/components/location-search.js.map +2 -2
  78. package/dist/components/nakshatra-card.js +1 -1
  79. package/dist/components/nakshatra-card.js.map +2 -2
  80. package/dist/components/natal-chart.js +2 -2
  81. package/dist/components/natal-chart.js.map +2 -2
  82. package/dist/components/numerology-card.js +1 -1
  83. package/dist/components/numerology-card.js.map +2 -2
  84. package/dist/components/panchang-table.d.ts +22 -1
  85. package/dist/components/panchang-table.d.ts.map +1 -1
  86. package/dist/components/panchang-table.js +1 -1
  87. package/dist/components/panchang-table.js.map +3 -3
  88. package/dist/components/shadbala-table.js +1 -1
  89. package/dist/components/shadbala-table.js.map +2 -2
  90. package/dist/components/synastry-chart.js +4 -4
  91. package/dist/components/synastry-chart.js.map +2 -2
  92. package/dist/components/transits-table.js +1 -1
  93. package/dist/components/transits-table.js.map +2 -2
  94. package/dist/components/vedic-kundli.js +2 -2
  95. package/dist/components/vedic-kundli.js.map +2 -2
  96. package/dist/components/vedic-planets-table.d.ts +14 -0
  97. package/dist/components/vedic-planets-table.d.ts.map +1 -1
  98. package/dist/components/vedic-planets-table.js +1 -1
  99. package/dist/components/vedic-planets-table.js.map +4 -4
  100. package/dist/components/yoga-list.js +1 -1
  101. package/dist/components/yoga-list.js.map +2 -2
  102. package/dist/index.cjs +42 -42
  103. package/dist/index.cjs.map +3 -3
  104. package/dist/index.js +43 -43
  105. package/dist/index.js.map +3 -3
  106. package/dist/styles/tokens.css +4 -4
  107. package/dist/types/types.gen.d.ts +679 -40
  108. package/dist/types/types.gen.d.ts.map +1 -1
  109. package/dist/version.d.ts +1 -1
  110. package/package.json +1 -1
  111. package/src/components/ashtakavarga-grid.ts +1 -1
  112. package/src/components/biorhythm-chart.ts +1 -1
  113. package/src/components/choghadiya-grid.ts +1 -1
  114. package/src/components/compatibility-card.ts +2 -2
  115. package/src/components/dasha-timeline.ts +3 -3
  116. package/src/components/endpoint-form.ts +2 -2
  117. package/src/components/guna-milan.ts +1 -1
  118. package/src/components/hexagram.ts +3 -3
  119. package/src/components/horoscope-card.ts +1 -1
  120. package/src/components/kp-chart.ts +1 -1
  121. package/src/components/kp-ruling-planets.ts +1 -1
  122. package/src/components/location-search.ts +1 -1
  123. package/src/components/nakshatra-card.ts +1 -1
  124. package/src/components/natal-chart.ts +5 -5
  125. package/src/components/numerology-card.ts +2 -2
  126. package/src/components/panchang-table.ts +112 -18
  127. package/src/components/shadbala-table.ts +1 -1
  128. package/src/components/synastry-chart.ts +4 -4
  129. package/src/components/transits-table.ts +1 -1
  130. package/src/components/vedic-planets-table.ts +221 -3
  131. package/src/components/yoga-list.ts +1 -1
  132. package/src/styles/tokens.css +4 -4
  133. package/src/types/types.gen.ts +680 -41
  134. package/src/utils/kundli-styles.ts +2 -2
  135. package/src/utils/tablist.ts +1 -1
  136. package/src/version.ts +1 -1
@@ -4,6 +4,8 @@ import { PLANET_GLYPH, SIGN_GLYPH } from '../tokens/index.js';
4
4
  import type { BirthChartResponse } from '../types/index.js';
5
5
  import { baseStyles } from '../utils/base-styles.js';
6
6
  import { formatSignPosition } from '../utils/degree.js';
7
+ import { chevron, disclosureStyles } from '../utils/disclosure.js';
8
+ import { formatNumber } from '../utils/format.js';
7
9
  import { MarkupDataController } from '../utils/markup-data.js';
8
10
  import { capitalize } from '../utils/string.js';
9
11
 
@@ -31,18 +33,28 @@ type MetaEntry = BirthChartResponse['meta'][string];
31
33
  * as the full reference-grade positions grid a practitioner reads alongside
32
34
  * the kundli wheel: graha, rashi, exact degree, nakshatra and pada, nakshatra
33
35
  * lord, bhava (house), Baladi avastha, and retrograde.
36
+ *
37
+ * @remarks
38
+ * The positions grid is the default view. The same birth-chart response also
39
+ * carries chart-wide conditions and readings, surfaced as collapsed accordions
40
+ * below the grid so they never crowd the table: combust grahas (astangata),
41
+ * planetary wars (graha yuddha), per-graha rashi and nakshatra interpretations,
42
+ * the active classical yogas (present === true), and the twelve bhava
43
+ * significations. Each accordion renders only when its source array or map is
44
+ * non-empty.
34
45
  */
35
46
  @customElement('roxy-vedic-planets-table')
36
47
  export class RoxyVedicPlanetsTable extends LitElement {
37
48
  static styles = [
38
49
  baseStyles,
50
+ disclosureStyles,
39
51
  css`
40
52
  .wrap {
41
53
  border: 1px solid var(--roxy-border, #e4e4e7);
42
54
  border-radius: var(--roxy-radius-md, 8px);
43
55
  background: var(--roxy-bg, #fff);
44
- overflow: auto;
45
56
  box-shadow: var(--roxy-shadow-sm);
57
+ overflow: hidden;
46
58
  }
47
59
  .head {
48
60
  padding: var(--roxy-space-md, 1rem);
@@ -53,6 +65,9 @@ export class RoxyVedicPlanetsTable extends LitElement {
53
65
  font-size: var(--roxy-text-lg, 1.125rem);
54
66
  font-weight: var(--roxy-weight-bold, 600);
55
67
  }
68
+ .scroll {
69
+ overflow-x: auto;
70
+ }
56
71
  table {
57
72
  width: 100%;
58
73
  border-collapse: collapse;
@@ -92,7 +107,7 @@ export class RoxyVedicPlanetsTable extends LitElement {
92
107
  /* On the tinted Lagna row the muted glyph drops below the WCAG AA
93
108
  contrast floor, so use the accent foreground there instead. */
94
109
  tbody tr.lagna .glyph {
95
- color: var(--roxy-accent-fg, #b45309);
110
+ color: var(--roxy-accent-ink, #b45309);
96
111
  }
97
112
  .retro {
98
113
  color: var(--roxy-warning-fg, #9a3412);
@@ -102,6 +117,100 @@ export class RoxyVedicPlanetsTable extends LitElement {
102
117
  .num {
103
118
  font-variant-numeric: tabular-nums;
104
119
  }
120
+ details.panel {
121
+ border-top: 1px solid var(--roxy-border, #e4e4e7);
122
+ }
123
+ details.panel > summary {
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: space-between;
127
+ gap: var(--roxy-space-sm, 0.5rem);
128
+ padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
129
+ cursor: pointer;
130
+ font-size: var(--roxy-text-sm, 0.875rem);
131
+ font-weight: var(--roxy-weight-bold, 600);
132
+ color: var(--roxy-fg, #0a0a0a);
133
+ }
134
+ details.panel > summary:focus-visible {
135
+ outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
136
+ outline-offset: -2px;
137
+ }
138
+ .summary-count {
139
+ margin-left: auto;
140
+ margin-right: var(--roxy-space-xs, 0.25rem);
141
+ font-weight: var(--roxy-weight-normal, 400);
142
+ color: var(--roxy-muted, #71717a);
143
+ font-variant-numeric: tabular-nums;
144
+ }
145
+ .panel-body {
146
+ padding: 0 var(--roxy-space-md, 1rem) var(--roxy-space-md, 1rem);
147
+ display: grid;
148
+ gap: var(--roxy-space-sm, 0.5rem);
149
+ }
150
+ .condition {
151
+ display: flex;
152
+ flex-wrap: wrap;
153
+ align-items: baseline;
154
+ gap: 0.4em;
155
+ font-size: var(--roxy-text-sm, 0.875rem);
156
+ }
157
+ .condition .planet {
158
+ font-weight: var(--roxy-weight-bold, 600);
159
+ }
160
+ .condition .detail {
161
+ color: var(--roxy-muted, #71717a);
162
+ font-variant-numeric: tabular-nums;
163
+ }
164
+ .condition .winner {
165
+ color: var(--roxy-success-fg, #166534);
166
+ font-weight: var(--roxy-weight-bold, 600);
167
+ }
168
+ .interp {
169
+ display: grid;
170
+ gap: 0.15em;
171
+ }
172
+ .interp .planet {
173
+ font-weight: var(--roxy-weight-bold, 600);
174
+ font-size: var(--roxy-text-sm, 0.875rem);
175
+ }
176
+ .interp p {
177
+ margin: 0;
178
+ font-size: var(--roxy-text-sm, 0.875rem);
179
+ line-height: var(--roxy-leading-normal, 1.5);
180
+ }
181
+ .interp .label {
182
+ color: var(--roxy-muted, #71717a);
183
+ font-weight: var(--roxy-weight-bold, 600);
184
+ }
185
+ .bhava {
186
+ display: grid;
187
+ gap: 0.15em;
188
+ }
189
+ .bhava .name {
190
+ font-weight: var(--roxy-weight-bold, 600);
191
+ font-size: var(--roxy-text-sm, 0.875rem);
192
+ }
193
+ .bhava .desc {
194
+ margin: 0;
195
+ font-size: var(--roxy-text-sm, 0.875rem);
196
+ color: var(--roxy-muted, #71717a);
197
+ line-height: var(--roxy-leading-normal, 1.5);
198
+ }
199
+ .quality {
200
+ font-size: var(--roxy-text-xs, 0.75rem);
201
+ font-weight: var(--roxy-weight-bold, 600);
202
+ text-transform: uppercase;
203
+ letter-spacing: 0.04em;
204
+ }
205
+ .quality.positive {
206
+ color: var(--roxy-success-fg, #166534);
207
+ }
208
+ .quality.negative {
209
+ color: var(--roxy-danger-fg, #991b1b);
210
+ }
211
+ .quality.both {
212
+ color: var(--roxy-muted, #71717a);
213
+ }
105
214
  `,
106
215
  ];
107
216
 
@@ -139,10 +248,11 @@ export class RoxyVedicPlanetsTable extends LitElement {
139
248
  return html`<div class="roxy-empty" role="status">No chart data</div>`;
140
249
  const rows = this.orderedRows();
141
250
 
142
- return html`<div class="wrap" aria-label="Vedic planetary positions" tabindex="0">
251
+ return html`<div class="wrap" aria-label="Vedic planetary positions">
143
252
  <header class="head">
144
253
  <h2 class="title">Planetary positions</h2>
145
254
  </header>
255
+ <div class="scroll" tabindex="0">
146
256
  <table role="table">
147
257
  <thead>
148
258
  <tr>
@@ -182,8 +292,116 @@ export class RoxyVedicPlanetsTable extends LitElement {
182
292
  })}
183
293
  </tbody>
184
294
  </table>
295
+ </div>
296
+ ${this.renderCombustion()}
297
+ ${this.renderPlanetaryWar()}
298
+ ${this.renderInterpretations()}
299
+ ${this.renderYogas()}
300
+ ${this.renderHouses()}
185
301
  </div>`;
186
302
  }
303
+
304
+ private renderCombustion() {
305
+ const combust = this.data?.combustion ?? [];
306
+ if (combust.length === 0) return nothing;
307
+ return html`<details class="panel">
308
+ <summary>
309
+ Combust grahas<span class="summary-count">${combust.length}</span>${chevron()}
310
+ </summary>
311
+ <div class="panel-body">
312
+ ${combust.map((c) => {
313
+ const glyph = PLANET_GLYPH[capitalize(c.planet)] ?? '';
314
+ const dist = formatNumber(c.distanceFromSun, 2);
315
+ const orb = formatNumber(c.orb, 1);
316
+ return html`<div class="condition">
317
+ <span class="planet">${glyph ? `${glyph} ` : ''}${c.planet}</span>
318
+ <span class="detail">${dist} deg from Sun, within ${orb} deg orb</span>
319
+ </div>`;
320
+ })}
321
+ </div>
322
+ </details>`;
323
+ }
324
+
325
+ private renderPlanetaryWar() {
326
+ const wars = this.data?.planetaryWar ?? [];
327
+ if (wars.length === 0) return nothing;
328
+ return html`<details class="panel">
329
+ <summary>
330
+ Planetary wars<span class="summary-count">${wars.length}</span>${chevron()}
331
+ </summary>
332
+ <div class="panel-body">
333
+ ${wars.map((w) => {
334
+ const dist = formatNumber(w.distance, 2);
335
+ return html`<div class="condition">
336
+ <span class="planet">${w.planet1} vs ${w.planet2}</span>
337
+ <span class="detail">${dist} deg apart</span>
338
+ <span class="winner">${w.winner} wins</span>
339
+ </div>`;
340
+ })}
341
+ </div>
342
+ </details>`;
343
+ }
344
+
345
+ private renderInterpretations() {
346
+ const interp = this.data?.interpretations ?? {};
347
+ const entries = this.orderedRows()
348
+ .map(([name, p]) => [p.graha ?? name, interp[p.graha ?? name]] as const)
349
+ .filter(([, v]) => v != null);
350
+ if (entries.length === 0) return nothing;
351
+ return html`<details class="panel">
352
+ <summary>
353
+ Interpretations<span class="summary-count">${entries.length}</span>${chevron()}
354
+ </summary>
355
+ <div class="panel-body">
356
+ ${entries.map(([name, v]) => {
357
+ const glyph = PLANET_GLYPH[capitalize(name)] ?? '';
358
+ return html`<div class="interp">
359
+ <span class="planet">${glyph ? `${glyph} ` : ''}${name}</span>
360
+ ${v.rashi ? html`<p><span class="label">Rashi.</span> ${v.rashi}</p>` : nothing}
361
+ ${v.nakshatra ? html`<p><span class="label">Nakshatra.</span> ${v.nakshatra}</p>` : nothing}
362
+ </div>`;
363
+ })}
364
+ </div>
365
+ </details>`;
366
+ }
367
+
368
+ private renderHouses() {
369
+ const houses = (this.data?.houses ?? []).filter(
370
+ (h) => h.name || h.description,
371
+ );
372
+ if (houses.length === 0) return nothing;
373
+ return html`<details class="panel">
374
+ <summary>
375
+ Bhava significations<span class="summary-count">${houses.length}</span>${chevron()}
376
+ </summary>
377
+ <div class="panel-body">
378
+ ${houses.map(
379
+ (h) => html`<div class="bhava">
380
+ <span class="name">${h.number}. ${h.name ?? ''}</span>
381
+ ${h.description ? html`<p class="desc">${h.description}</p>` : nothing}
382
+ </div>`,
383
+ )}
384
+ </div>
385
+ </details>`;
386
+ }
387
+
388
+ private renderYogas() {
389
+ const yogas = (this.data?.yogas ?? []).filter((y) => y.present);
390
+ if (yogas.length === 0) return nothing;
391
+ return html`<details class="panel">
392
+ <summary>
393
+ Yogas<span class="summary-count">${yogas.length}</span>${chevron()}
394
+ </summary>
395
+ <div class="panel-body">
396
+ ${yogas.map(
397
+ (y) => html`<div class="bhava">
398
+ <span class="name">${y.name} ${y.quality ? html`<span class="quality ${y.quality.toLowerCase()}">${y.quality}</span>` : nothing}</span>
399
+ ${y.result ? html`<p class="desc">${y.result}</p>` : nothing}
400
+ </div>`,
401
+ )}
402
+ </div>
403
+ </details>`;
404
+ }
187
405
  }
188
406
 
189
407
  declare global {
@@ -138,7 +138,7 @@ export class RoxyYogaList extends LitElement {
138
138
  }
139
139
  details summary {
140
140
  cursor: pointer;
141
- color: var(--roxy-accent-fg, #b45309);
141
+ color: var(--roxy-accent-ink, #b45309);
142
142
  font-weight: 500;
143
143
  padding: 0.25em 0;
144
144
  list-style: none;
@@ -23,7 +23,7 @@
23
23
  * WCAG AA for body text. amber-700 hits 4.5:1, used wherever the accent
24
24
  * tone is applied to text. Fills (planet glyphs, chart accents, badges
25
25
  * with non-text use) keep --roxy-accent. */
26
- --roxy-accent-fg: #b45309;
26
+ --roxy-accent-ink: #b45309;
27
27
 
28
28
  /* Color: status. The base value (success, warning, danger, info) is for
29
29
  * fills and tints. The -fg variant is darker so text on a light tint passes
@@ -105,7 +105,7 @@
105
105
  --roxy-primary: #f8fafc;
106
106
  --roxy-secondary: #94a3b8;
107
107
  --roxy-accent: #fbbf24;
108
- --roxy-accent-fg: #fbbf24;
108
+ --roxy-accent-ink: #fbbf24;
109
109
 
110
110
  /* Status -fg overrides must mirror the explicit [data-theme="dark"] block
111
111
  * below. Without these, a user on system dark with no data-theme attribute
@@ -144,7 +144,7 @@
144
144
  --roxy-primary: #0f172a;
145
145
  --roxy-secondary: #475569;
146
146
  --roxy-accent: #f59e0b;
147
- --roxy-accent-fg: #b45309;
147
+ --roxy-accent-ink: #b45309;
148
148
 
149
149
  --roxy-success: #16a34a;
150
150
  --roxy-success-fg: #166534;
@@ -174,7 +174,7 @@
174
174
  --roxy-primary: #f8fafc;
175
175
  --roxy-secondary: #94a3b8;
176
176
  --roxy-accent: #fbbf24;
177
- --roxy-accent-fg: #fbbf24;
177
+ --roxy-accent-ink: #fbbf24;
178
178
 
179
179
  --roxy-success: #22c55e;
180
180
  --roxy-success-fg: #86efac;