@roxyapi/ui 0.6.0 → 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 (137) 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 +3 -3
  13. package/dist/cdn/components/dasha-timeline.js.map +4 -4
  14. package/dist/cdn/components/divisional-chart.js +67 -1
  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 +12 -3
  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 +8 -2
  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 +67 -1
  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 +84 -3
  51. package/dist/cdn/roxy-ui.js.map +4 -4
  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.d.ts.map +1 -1
  61. package/dist/components/dasha-timeline.js +1 -1
  62. package/dist/components/dasha-timeline.js.map +4 -4
  63. package/dist/components/divisional-chart.js +67 -1
  64. package/dist/components/divisional-chart.js.map +2 -2
  65. package/dist/components/endpoint-form.js +1 -1
  66. package/dist/components/endpoint-form.js.map +2 -2
  67. package/dist/components/guna-milan.js +1 -1
  68. package/dist/components/guna-milan.js.map +2 -2
  69. package/dist/components/hexagram.js +1 -1
  70. package/dist/components/hexagram.js.map +2 -2
  71. package/dist/components/horoscope-card.js +1 -1
  72. package/dist/components/horoscope-card.js.map +2 -2
  73. package/dist/components/kp-chart.js +1 -1
  74. package/dist/components/kp-chart.js.map +2 -2
  75. package/dist/components/kp-ruling-planets.js +1 -1
  76. package/dist/components/kp-ruling-planets.js.map +2 -2
  77. package/dist/components/location-search.js +1 -1
  78. package/dist/components/location-search.js.map +2 -2
  79. package/dist/components/nakshatra-card.js +1 -1
  80. package/dist/components/nakshatra-card.js.map +2 -2
  81. package/dist/components/natal-chart.js +10 -1
  82. package/dist/components/natal-chart.js.map +2 -2
  83. package/dist/components/numerology-card.js +1 -1
  84. package/dist/components/numerology-card.js.map +2 -2
  85. package/dist/components/panchang-table.d.ts +22 -1
  86. package/dist/components/panchang-table.d.ts.map +1 -1
  87. package/dist/components/panchang-table.js +1 -1
  88. package/dist/components/panchang-table.js.map +3 -3
  89. package/dist/components/shadbala-table.js +1 -1
  90. package/dist/components/shadbala-table.js.map +2 -2
  91. package/dist/components/synastry-chart.js +7 -1
  92. package/dist/components/synastry-chart.js.map +2 -2
  93. package/dist/components/transits-table.js +1 -1
  94. package/dist/components/transits-table.js.map +2 -2
  95. package/dist/components/vedic-kundli.js +67 -1
  96. package/dist/components/vedic-kundli.js.map +2 -2
  97. package/dist/components/vedic-planets-table.d.ts +14 -0
  98. package/dist/components/vedic-planets-table.d.ts.map +1 -1
  99. package/dist/components/vedic-planets-table.js +1 -1
  100. package/dist/components/vedic-planets-table.js.map +4 -4
  101. package/dist/components/yoga-list.js +1 -1
  102. package/dist/components/yoga-list.js.map +2 -2
  103. package/dist/index.cjs +82 -1
  104. package/dist/index.cjs.map +4 -4
  105. package/dist/index.js +82 -1
  106. package/dist/index.js.map +4 -4
  107. package/dist/styles/tokens.css +4 -4
  108. package/dist/types/types.gen.d.ts +679 -40
  109. package/dist/types/types.gen.d.ts.map +1 -1
  110. package/dist/version.d.ts +1 -1
  111. package/package.json +1 -1
  112. package/src/components/ashtakavarga-grid.ts +1 -1
  113. package/src/components/biorhythm-chart.ts +1 -1
  114. package/src/components/choghadiya-grid.ts +1 -1
  115. package/src/components/compatibility-card.ts +2 -2
  116. package/src/components/dasha-timeline.ts +10 -19
  117. package/src/components/endpoint-form.ts +2 -2
  118. package/src/components/guna-milan.ts +1 -1
  119. package/src/components/hexagram.ts +3 -3
  120. package/src/components/horoscope-card.ts +1 -1
  121. package/src/components/kp-chart.ts +1 -1
  122. package/src/components/kp-ruling-planets.ts +1 -1
  123. package/src/components/location-search.ts +1 -1
  124. package/src/components/nakshatra-card.ts +1 -1
  125. package/src/components/natal-chart.ts +5 -5
  126. package/src/components/numerology-card.ts +2 -2
  127. package/src/components/panchang-table.ts +112 -18
  128. package/src/components/shadbala-table.ts +1 -1
  129. package/src/components/synastry-chart.ts +4 -4
  130. package/src/components/transits-table.ts +1 -1
  131. package/src/components/vedic-planets-table.ts +221 -3
  132. package/src/components/yoga-list.ts +1 -1
  133. package/src/styles/tokens.css +4 -4
  134. package/src/types/types.gen.ts +680 -41
  135. package/src/utils/kundli-styles.ts +2 -2
  136. package/src/utils/tablist.ts +1 -1
  137. package/src/version.ts +1 -1
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const ROXY_UI_VERSION = "0.6.0";
1
+ export declare const ROXY_UI_VERSION = "0.7.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roxyapi/ui",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Web components for the RoxyAPI catalog. Drop-in charts, tables, cards, forms for astrology, tarot, numerology, biorhythm, I Ching, crystals, dreams, angel numbers, and more. One key, beautiful in 30 minutes.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -70,7 +70,7 @@ export class RoxyAshtakavargaGrid extends LitElement {
70
70
  }
71
71
 
72
72
  .tab[aria-selected='true'] {
73
- color: var(--roxy-accent-fg, #b45309);
73
+ color: var(--roxy-accent-ink, #b45309);
74
74
  border-bottom-color: var(--roxy-accent, #f59e0b);
75
75
  font-weight: var(--roxy-weight-bold, 600);
76
76
  }
@@ -52,7 +52,7 @@ export class RoxyBiorhythmChart extends LitElement {
52
52
  }
53
53
  .energy {
54
54
  font-variant-numeric: tabular-nums;
55
- color: var(--roxy-accent-fg, #b45309);
55
+ color: var(--roxy-accent-ink, #b45309);
56
56
  font-weight: var(--roxy-weight-bold, 600);
57
57
  }
58
58
  .bars {
@@ -104,7 +104,7 @@ export class RoxyChoghadiyaGrid extends LitElement {
104
104
  margin-left: 0.4em;
105
105
  font-size: var(--roxy-text-xs, 0.75rem);
106
106
  font-weight: var(--roxy-weight-bold, 600);
107
- color: var(--roxy-accent-fg, #b45309);
107
+ color: var(--roxy-accent-ink, #b45309);
108
108
  text-transform: uppercase;
109
109
  letter-spacing: 0.06em;
110
110
  }
@@ -50,7 +50,7 @@ export class RoxyCompatibilityCard extends LitElement {
50
50
  font-variant-numeric: tabular-nums;
51
51
  font-size: 2rem;
52
52
  font-weight: var(--roxy-weight-bold, 600);
53
- color: var(--roxy-accent-fg, #b45309);
53
+ color: var(--roxy-accent-ink, #b45309);
54
54
  line-height: 1;
55
55
  }
56
56
  .rating {
@@ -86,7 +86,7 @@ export class RoxyCompatibilityCard extends LitElement {
86
86
  }
87
87
 
88
88
  .archetype {
89
- color: var(--roxy-accent-fg, #b45309);
89
+ color: var(--roxy-accent-ink, #b45309);
90
90
  font-weight: var(--roxy-weight-bold, 600);
91
91
  }
92
92
 
@@ -6,7 +6,6 @@ import type {
6
6
  GetSubDashasResponse,
7
7
  } from '../types/index.js';
8
8
  import { baseStyles } from '../utils/base-styles.js';
9
- import { chevron, disclosureStyles } from '../utils/disclosure.js';
10
9
  import { formatNumber } from '../utils/format.js';
11
10
  import { MarkupDataController } from '../utils/markup-data.js';
12
11
 
@@ -26,7 +25,6 @@ type DashaPeriod = GetMajorDashasResponse['mahadashas'][number];
26
25
  export class RoxyDashaTimeline extends LitElement {
27
26
  static styles = [
28
27
  baseStyles,
29
- disclosureStyles,
30
28
  css`
31
29
  .wrap {
32
30
  display: grid;
@@ -90,14 +88,14 @@ export class RoxyDashaTimeline extends LitElement {
90
88
  font-size: var(--roxy-text-sm, 0.875rem);
91
89
  }
92
90
  .bar.now strong {
93
- color: var(--roxy-accent-fg, #b45309);
91
+ color: var(--roxy-accent-ink, #b45309);
94
92
  }
95
93
  .now-badge {
96
94
  display: inline-block;
97
95
  margin-left: 0.4em;
98
96
  font-size: var(--roxy-text-xs, 0.75rem);
99
97
  font-weight: var(--roxy-weight-bold, 600);
100
- color: var(--roxy-accent-fg, #b45309);
98
+ color: var(--roxy-accent-ink, #b45309);
101
99
  text-transform: uppercase;
102
100
  letter-spacing: 0.06em;
103
101
  }
@@ -125,7 +123,7 @@ export class RoxyDashaTimeline extends LitElement {
125
123
  top: -2px;
126
124
  bottom: -2px;
127
125
  width: 2px;
128
- background: var(--roxy-accent-fg, #b45309);
126
+ background: var(--roxy-accent-ink, #b45309);
129
127
  border-radius: 2px;
130
128
  box-shadow: 0 0 0 2px
131
129
  color-mix(in srgb, var(--roxy-accent, #f59e0b) 35%, transparent);
@@ -136,22 +134,18 @@ export class RoxyDashaTimeline extends LitElement {
136
134
  font-variant-numeric: tabular-nums;
137
135
  text-align: right;
138
136
  }
139
- details.interp {
137
+ .interp {
140
138
  border: 1px solid var(--roxy-border, #e4e4e7);
141
139
  border-radius: var(--roxy-radius-md, 8px);
142
140
  padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
143
141
  background: var(--roxy-bg, #fff);
144
142
  }
145
- details.interp summary {
146
- cursor: pointer;
143
+ .interp h3 {
144
+ margin: 0;
147
145
  font-size: var(--roxy-text-sm, 0.875rem);
148
146
  font-weight: var(--roxy-weight-bold, 600);
149
- display: flex;
150
- align-items: center;
151
- justify-content: space-between;
152
- gap: var(--roxy-space-md, 1rem);
153
147
  }
154
- details.interp p {
148
+ .interp p {
155
149
  margin: var(--roxy-space-sm, 0.5rem) 0 0;
156
150
  font-size: var(--roxy-text-sm, 0.875rem);
157
151
  color: var(--roxy-muted, #71717a);
@@ -238,13 +232,10 @@ export class RoxyDashaTimeline extends LitElement {
238
232
  private renderActiveInterpretation(periods: DashaPeriod[]) {
239
233
  const active = periods.find((p) => this.isCurrent(p));
240
234
  if (!active?.interpretation) return nothing;
241
- return html`<details class="interp">
242
- <summary>
243
- <span>${active.planet} mahadasha interpretation</span>
244
- ${chevron()}
245
- </summary>
235
+ return html`<div class="interp">
236
+ <h3>${active.planet} mahadasha</h3>
246
237
  <p>${active.interpretation}</p>
247
- </details>`;
238
+ </div>`;
248
239
  }
249
240
 
250
241
  private renderCurrent(d: DashaData) {
@@ -125,7 +125,7 @@ export class RoxyEndpointForm extends LitElement {
125
125
  select:focus {
126
126
  outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
127
127
  outline-offset: 2px;
128
- border-color: var(--roxy-accent-fg, #b45309);
128
+ border-color: var(--roxy-accent-ink, #b45309);
129
129
  }
130
130
  .help {
131
131
  color: var(--roxy-muted, #71717a);
@@ -146,7 +146,7 @@ export class RoxyEndpointForm extends LitElement {
146
146
  }
147
147
  button.submit {
148
148
  justify-self: start;
149
- background: var(--roxy-accent-fg, #b45309);
149
+ background: var(--roxy-accent-ink, #b45309);
150
150
  color: var(--roxy-bg, #fff);
151
151
  border: 0;
152
152
  border-radius: var(--roxy-radius-md, 8px);
@@ -51,7 +51,7 @@ export class RoxyGunaMilan extends LitElement {
51
51
  .total {
52
52
  font-size: 2.25rem;
53
53
  font-weight: var(--roxy-weight-bold, 600);
54
- color: var(--roxy-accent-fg, #b45309);
54
+ color: var(--roxy-accent-ink, #b45309);
55
55
  font-variant-numeric: tabular-nums;
56
56
  line-height: 1;
57
57
  }
@@ -53,7 +53,7 @@ export class RoxyHexagram extends LitElement {
53
53
  .symbol {
54
54
  font-size: 3rem;
55
55
  line-height: 1;
56
- color: var(--roxy-accent-fg, #b45309);
56
+ color: var(--roxy-accent-ink, #b45309);
57
57
  }
58
58
  .lines {
59
59
  display: grid;
@@ -105,7 +105,7 @@ export class RoxyHexagram extends LitElement {
105
105
  }
106
106
  .tri-glyph {
107
107
  font-size: var(--roxy-text-xl, 1.5rem);
108
- color: var(--roxy-accent-fg, #b45309);
108
+ color: var(--roxy-accent-ink, #b45309);
109
109
  margin-right: 4px;
110
110
  vertical-align: middle;
111
111
  }
@@ -131,7 +131,7 @@ export class RoxyHexagram extends LitElement {
131
131
  margin-top: var(--roxy-space-md, 1rem);
132
132
  padding-top: var(--roxy-space-md, 1rem);
133
133
  border-top: 1px solid var(--roxy-border, #e4e4e7);
134
- color: var(--roxy-accent-fg, #b45309);
134
+ color: var(--roxy-accent-ink, #b45309);
135
135
  font-size: var(--roxy-text-sm, 0.875rem);
136
136
  }
137
137
  `,
@@ -42,7 +42,7 @@ export class RoxyHoroscopeCard extends LitElement {
42
42
 
43
43
  .glyph {
44
44
  font-size: 2.25rem;
45
- color: var(--roxy-accent-fg, #b45309);
45
+ color: var(--roxy-accent-ink, #b45309);
46
46
  line-height: 1;
47
47
  }
48
48
 
@@ -76,7 +76,7 @@ export class RoxyKpChart extends LitElement {
76
76
  font-family: inherit;
77
77
  }
78
78
  .tab[aria-selected='true'] {
79
- color: var(--roxy-accent-fg, #b45309);
79
+ color: var(--roxy-accent-ink, #b45309);
80
80
  border-bottom-color: var(--roxy-accent, #f59e0b);
81
81
  font-weight: var(--roxy-weight-bold, 600);
82
82
  }
@@ -91,7 +91,7 @@ export class RoxyKpRulingPlanets extends LitElement {
91
91
  }
92
92
  .rp .rank {
93
93
  font-size: var(--roxy-text-xs, 0.75rem);
94
- color: var(--roxy-accent-fg, #b45309);
94
+ color: var(--roxy-accent-ink, #b45309);
95
95
  }
96
96
  table {
97
97
  width: 100%;
@@ -50,7 +50,7 @@ export class RoxyLocationSearch extends LitElement {
50
50
  input:focus {
51
51
  outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
52
52
  outline-offset: 2px;
53
- border-color: var(--roxy-accent-fg, #b45309);
53
+ border-color: var(--roxy-accent-ink, #b45309);
54
54
  }
55
55
  .spinner {
56
56
  position: absolute;
@@ -35,7 +35,7 @@ export class RoxyNakshatraCard extends LitElement {
35
35
  font-weight: var(--roxy-weight-bold, 600);
36
36
  }
37
37
  .number {
38
- color: var(--roxy-accent-fg, #b45309);
38
+ color: var(--roxy-accent-ink, #b45309);
39
39
  font-size: var(--roxy-text-sm, 0.875rem);
40
40
  font-weight: var(--roxy-weight-bold, 600);
41
41
  }
@@ -159,7 +159,7 @@ export class RoxyNatalChart extends LitElement {
159
159
  stroke: var(--roxy-danger, #dc2626);
160
160
  }
161
161
  .aspect-conjunction {
162
- stroke: var(--roxy-accent-fg, #b45309);
162
+ stroke: var(--roxy-accent-ink, #b45309);
163
163
  }
164
164
  .aspect-other {
165
165
  stroke: var(--roxy-muted, #71717a);
@@ -167,14 +167,14 @@ export class RoxyNatalChart extends LitElement {
167
167
  }
168
168
 
169
169
  .angle-marker {
170
- fill: var(--roxy-accent-fg, #b45309);
170
+ fill: var(--roxy-accent-ink, #b45309);
171
171
  font-size: 10px;
172
172
  font-weight: 700;
173
173
  font-family: var(--roxy-font-sans);
174
174
  letter-spacing: 0.04em;
175
175
  }
176
176
  .angle-tick {
177
- stroke: var(--roxy-accent-fg, #b45309);
177
+ stroke: var(--roxy-accent-ink, #b45309);
178
178
  stroke-width: 1.5;
179
179
  }
180
180
 
@@ -234,7 +234,7 @@ export class RoxyNatalChart extends LitElement {
234
234
  color: var(--roxy-danger, #dc2626);
235
235
  }
236
236
  table.aspect-grid td.aspect-conjunction .asp {
237
- color: var(--roxy-accent-fg, #b45309);
237
+ color: var(--roxy-accent-ink, #b45309);
238
238
  }
239
239
  table.aspect-grid td.aspect-other .asp {
240
240
  color: var(--roxy-muted, #71717a);
@@ -363,7 +363,7 @@ export class RoxyNatalChart extends LitElement {
363
363
  padding: 1px 8px;
364
364
  border-radius: 9999px;
365
365
  background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
366
- color: var(--roxy-accent-fg, #b45309);
366
+ color: var(--roxy-accent-ink, #b45309);
367
367
  font-size: var(--roxy-text-xs, 0.75rem);
368
368
  }
369
369
  `,
@@ -44,7 +44,7 @@ export class RoxyNumerologyCard extends LitElement {
44
44
  font-size: 4rem;
45
45
  line-height: 1;
46
46
  font-weight: var(--roxy-weight-bold, 600);
47
- color: var(--roxy-accent-fg, #b45309);
47
+ color: var(--roxy-accent-ink, #b45309);
48
48
  font-variant-numeric: tabular-nums;
49
49
  }
50
50
  .label {
@@ -106,7 +106,7 @@ export class RoxyNumerologyCard extends LitElement {
106
106
  text-transform: capitalize;
107
107
  }
108
108
  .cores .item strong {
109
- color: var(--roxy-accent-fg, #b45309);
109
+ color: var(--roxy-accent-ink, #b45309);
110
110
  font-variant-numeric: tabular-nums;
111
111
  font-size: var(--roxy-text-base, 1rem);
112
112
  font-weight: var(--roxy-weight-bold, 600);
@@ -11,7 +11,18 @@ import { MarkupDataController } from '../utils/markup-data.js';
11
11
  type PanchangData = GetBasicPanchangResponse | GetDetailedPanchangResponse;
12
12
  type PanchangTime = GetDetailedPanchangResponse['rahuKaal'];
13
13
 
14
- /** Panchang table for /vedic-astrology/panchang/{basic,detailed}. */
14
+ /**
15
+ * Panchang table for /vedic-astrology/panchang/{basic,detailed}.
16
+ *
17
+ * @remarks
18
+ * The main grid lists the five limbs (tithi, nakshatra, yoga, karana, vara),
19
+ * sun and moon timings, and, in detailed mode, the sunrise placements a reader
20
+ * scans first: Moon rashi, Sun rashi, Sun nakshatra, and the current hora. The
21
+ * detailed mode then groups every timed window into two sections, auspicious
22
+ * (the fixed muhurtas plus each Amrit Kalam) and inauspicious (Rahu Kaal,
23
+ * Yamaganda, Gulika, plus each Dur Muhurta and Varjyam), so a consumer can act
24
+ * on timing without parsing the raw response.
25
+ */
15
26
  @customElement('roxy-panchang-table')
16
27
  export class RoxyPanchangTable extends LitElement {
17
28
  static styles = [
@@ -105,6 +116,15 @@ export class RoxyPanchangTable extends LitElement {
105
116
  ];
106
117
  if (detailed) fivefold.push(['Vara', this.formatPart(detailed.vara)]);
107
118
 
119
+ const placements: Array<[string, string]> = detailed
120
+ ? [
121
+ ['Moon sign', this.formatRashi(detailed.moonSign)],
122
+ ['Sun sign', this.formatRashi(detailed.sunSign)],
123
+ ['Sun nakshatra', this.formatSunNakshatra(detailed.sunNakshatra)],
124
+ ['Hora', this.formatHora(detailed.hora)],
125
+ ].filter((row): row is [string, string] => Boolean(row[1]))
126
+ : [];
127
+
108
128
  const muhurtas: Array<[string, PanchangTime | undefined]> = detailed
109
129
  ? [
110
130
  ['Brahma Muhurta', detailed.brahmaMuhurta],
@@ -117,6 +137,10 @@ export class RoxyPanchangTable extends LitElement {
117
137
  ]
118
138
  : [];
119
139
 
140
+ const auspiciousWindows: Array<[string, PanchangTime]> = detailed
141
+ ? this.expandWindows('Amrit Kalam', detailed.amritKalam)
142
+ : [];
143
+
120
144
  const inauspicious: Array<[string, PanchangTime | undefined]> = detailed
121
145
  ? [
122
146
  ['Rahu Kaal', detailed.rahuKaal],
@@ -125,6 +149,13 @@ export class RoxyPanchangTable extends LitElement {
125
149
  ]
126
150
  : [];
127
151
 
152
+ const inauspiciousWindows: Array<[string, PanchangTime]> = detailed
153
+ ? [
154
+ ...this.expandWindows('Dur Muhurta', detailed.durMuhurta),
155
+ ...this.expandWindows('Varjyam', detailed.varjyam),
156
+ ]
157
+ : [];
158
+
128
159
  const transitions =
129
160
  detailed && 'transitions' in detailed ? detailed.transitions : undefined;
130
161
 
@@ -173,6 +204,12 @@ export class RoxyPanchangTable extends LitElement {
173
204
  </tr>`
174
205
  : nothing
175
206
  }
207
+ ${placements.map(
208
+ ([k, v]) => html`<tr>
209
+ <th>${k}</th>
210
+ <td>${v}</td>
211
+ </tr>`,
212
+ )}
176
213
  </tbody>
177
214
  </table>
178
215
  ${
@@ -192,32 +229,33 @@ export class RoxyPanchangTable extends LitElement {
192
229
  }
193
230
  ${
194
231
  this.detail === 'detailed' &&
195
- (muhurtas.some((m) => !!m[1]) || inauspicious.some((m) => !!m[1]))
232
+ (
233
+ muhurtas.some((m) => !!m[1]) ||
234
+ auspiciousWindows.length > 0 ||
235
+ inauspicious.some((m) => !!m[1]) ||
236
+ inauspiciousWindows.length > 0
237
+ )
196
238
  ? html`
197
239
  <div class="section">Auspicious muhurtas</div>
198
240
  <table>
199
241
  <tbody>
200
- ${muhurtas
201
- .filter(([, v]) => !!v)
202
- .map(
203
- ([k, v]) => html`<tr>
204
- <th>${k}</th>
205
- <td>${formatTimeRange(v)}</td>
206
- </tr>`,
207
- )}
242
+ ${this.renderPeriodRows([
243
+ ...muhurtas.filter(
244
+ (m): m is [string, PanchangTime] => !!m[1],
245
+ ),
246
+ ...auspiciousWindows,
247
+ ])}
208
248
  </tbody>
209
249
  </table>
210
250
  <div class="section">Inauspicious periods</div>
211
251
  <table>
212
252
  <tbody>
213
- ${inauspicious
214
- .filter(([, v]) => !!v)
215
- .map(
216
- ([k, v]) => html`<tr>
217
- <th>${k}</th>
218
- <td>${formatTimeRange(v)}</td>
219
- </tr>`,
220
- )}
253
+ ${this.renderPeriodRows([
254
+ ...inauspicious.filter(
255
+ (m): m is [string, PanchangTime] => !!m[1],
256
+ ),
257
+ ...inauspiciousWindows,
258
+ ])}
221
259
  </tbody>
222
260
  </table>
223
261
  `
@@ -226,6 +264,31 @@ export class RoxyPanchangTable extends LitElement {
226
264
  </div>`;
227
265
  }
228
266
 
267
+ /** Renders one row per [label, period] pair, dropping any with no range. */
268
+ private renderPeriodRows(rows: Array<[string, PanchangTime]>) {
269
+ return rows.map(([k, v]) => {
270
+ const range = formatTimeRange(v);
271
+ return range
272
+ ? html`<tr>
273
+ <th>${k}</th>
274
+ <td>${range}</td>
275
+ </tr>`
276
+ : nothing;
277
+ });
278
+ }
279
+
280
+ /** Expands an array of periods into labeled rows, numbering when more than one. */
281
+ private expandWindows(
282
+ label: string,
283
+ windows: PanchangTime[] | undefined,
284
+ ): Array<[string, PanchangTime]> {
285
+ if (!windows || windows.length === 0) return [];
286
+ return windows.map((w, i) => [
287
+ windows.length > 1 ? `${label} ${i + 1}` : label,
288
+ w,
289
+ ]);
290
+ }
291
+
229
292
  private renderTransitionRow(
230
293
  label: string,
231
294
  t: { endsAt?: string; next?: string } | undefined,
@@ -260,8 +323,39 @@ export class RoxyPanchangTable extends LitElement {
260
323
  }
261
324
  return String(v);
262
325
  }
326
+
327
+ /** "English (Sanskrit)" label for the Moon or Sun rashi at sunrise. */
328
+ private formatRashi(r: RashiPlacement | undefined): string {
329
+ if (!r?.name) return '';
330
+ return r.sanskritName && r.sanskritName !== r.name
331
+ ? `${r.name} (${r.sanskritName})`
332
+ : r.name;
333
+ }
334
+
335
+ /** Sun nakshatra with pada and lord, the form a panchang reader expects. */
336
+ private formatSunNakshatra(n: SunNakshatra | undefined): string {
337
+ if (!n?.name) return '';
338
+ const parts = [
339
+ n.name,
340
+ typeof n.pada === 'number' ? `pada ${n.pada}` : '',
341
+ n.lord ? `· ${n.lord}` : '',
342
+ ].filter(Boolean);
343
+ return parts.join(' ');
344
+ }
345
+
346
+ /** Current planetary hora with its active window. */
347
+ private formatHora(h: Hora | undefined): string {
348
+ if (!h?.current) return '';
349
+ const range = formatTimeRange(h);
350
+ return range ? `${h.current} (${range})` : h.current;
351
+ }
263
352
  }
264
353
 
354
+ type PanchangPlacements = GetDetailedPanchangResponse;
355
+ type RashiPlacement = PanchangPlacements['moonSign'];
356
+ type SunNakshatra = PanchangPlacements['sunNakshatra'];
357
+ type Hora = PanchangPlacements['hora'];
358
+
265
359
  declare global {
266
360
  interface HTMLElementTagNameMap {
267
361
  'roxy-panchang-table': RoxyPanchangTable;
@@ -149,7 +149,7 @@ export class RoxyShadbalaTable extends LitElement {
149
149
 
150
150
  .rank-badge {
151
151
  font-size: var(--roxy-text-xs, 0.75rem);
152
- color: var(--roxy-accent-fg, #b45309);
152
+ color: var(--roxy-accent-ink, #b45309);
153
153
  font-weight: var(--roxy-weight-bold, 600);
154
154
  }
155
155
 
@@ -66,7 +66,7 @@ export class RoxySynastryChart extends LitElement {
66
66
  .score {
67
67
  font-variant-numeric: tabular-nums;
68
68
  font-weight: var(--roxy-weight-bold, 600);
69
- color: var(--roxy-accent-fg, #b45309);
69
+ color: var(--roxy-accent-ink, #b45309);
70
70
  font-size: var(--roxy-text-xl, 1.5rem);
71
71
  }
72
72
 
@@ -111,12 +111,12 @@ export class RoxySynastryChart extends LitElement {
111
111
  fill: var(--roxy-danger, #dc2626);
112
112
  }
113
113
  .asc-tick {
114
- stroke: var(--roxy-accent-fg, #b45309);
114
+ stroke: var(--roxy-accent-ink, #b45309);
115
115
  stroke-width: 1;
116
116
  opacity: 0.75;
117
117
  }
118
118
  .asc-label {
119
- fill: var(--roxy-accent-fg, #b45309);
119
+ fill: var(--roxy-accent-ink, #b45309);
120
120
  font-size: 9px;
121
121
  font-weight: 700;
122
122
  font-family: var(--roxy-font-sans);
@@ -136,7 +136,7 @@ export class RoxySynastryChart extends LitElement {
136
136
  stroke: var(--roxy-danger, #dc2626);
137
137
  }
138
138
  .aspect-conjunction {
139
- stroke: var(--roxy-accent-fg, #b45309);
139
+ stroke: var(--roxy-accent-ink, #b45309);
140
140
  }
141
141
  .aspect-other {
142
142
  stroke: var(--roxy-muted, #71717a);
@@ -194,7 +194,7 @@ export class RoxyTransitsTable extends LitElement {
194
194
  padding: 1px 8px;
195
195
  border-radius: 9999px;
196
196
  background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
197
- color: var(--roxy-accent-fg, #b45309);
197
+ color: var(--roxy-accent-ink, #b45309);
198
198
  font-size: var(--roxy-text-xs, 0.75rem);
199
199
  }
200
200
  .nature-badge {