@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.
- package/README.md +1 -1
- package/dist/cdn/components/ashtakavarga-grid.js +3 -362
- package/dist/cdn/components/ashtakavarga-grid.js.map +2 -2
- package/dist/cdn/components/biorhythm-chart.js +2 -225
- package/dist/cdn/components/biorhythm-chart.js.map +2 -2
- package/dist/cdn/components/choghadiya-grid.js +2 -231
- package/dist/cdn/components/choghadiya-grid.js.map +2 -2
- package/dist/cdn/components/compatibility-card.js +2 -230
- package/dist/cdn/components/compatibility-card.js.map +2 -2
- package/dist/cdn/components/dasha-timeline.js +3 -283
- package/dist/cdn/components/dasha-timeline.js.map +4 -4
- package/dist/cdn/components/data.js +3 -230
- package/dist/cdn/components/data.js.map +2 -2
- package/dist/cdn/components/divisional-chart.js +3 -356
- package/dist/cdn/components/divisional-chart.js.map +4 -4
- package/dist/cdn/components/dosha-card.js +2 -225
- package/dist/cdn/components/dosha-card.js.map +2 -2
- package/dist/cdn/components/endpoint-form.js +2 -243
- package/dist/cdn/components/endpoint-form.js.map +2 -2
- package/dist/cdn/components/guna-milan.js +2 -269
- package/dist/cdn/components/guna-milan.js.map +2 -2
- package/dist/cdn/components/hexagram.js +3 -247
- package/dist/cdn/components/hexagram.js.map +2 -2
- package/dist/cdn/components/horoscope-card.js +3 -281
- package/dist/cdn/components/horoscope-card.js.map +2 -2
- package/dist/cdn/components/kp-chart.js +2 -277
- package/dist/cdn/components/kp-chart.js.map +2 -2
- package/dist/cdn/components/kp-planets-table.js +2 -195
- package/dist/cdn/components/kp-planets-table.js.map +2 -2
- package/dist/cdn/components/kp-ruling-planets.js +2 -240
- package/dist/cdn/components/kp-ruling-planets.js.map +2 -2
- package/dist/cdn/components/location-search.js +2 -240
- package/dist/cdn/components/location-search.js.map +2 -2
- package/dist/cdn/components/moon-phase.js +3 -223
- package/dist/cdn/components/moon-phase.js.map +2 -2
- package/dist/cdn/components/nakshatra-card.js +2 -200
- package/dist/cdn/components/nakshatra-card.js.map +2 -2
- package/dist/cdn/components/natal-chart.js +3 -563
- package/dist/cdn/components/natal-chart.js.map +4 -4
- package/dist/cdn/components/numerology-card.js +2 -232
- package/dist/cdn/components/numerology-card.js.map +2 -2
- package/dist/cdn/components/panchang-table.js +3 -220
- package/dist/cdn/components/panchang-table.js.map +2 -2
- package/dist/cdn/components/shadbala-table.js +3 -284
- package/dist/cdn/components/shadbala-table.js.map +2 -2
- package/dist/cdn/components/synastry-chart.js +2 -398
- package/dist/cdn/components/synastry-chart.js.map +2 -2
- package/dist/cdn/components/tarot-card.js +3 -261
- package/dist/cdn/components/tarot-card.js.map +2 -2
- package/dist/cdn/components/tarot-spread.js +2 -248
- package/dist/cdn/components/tarot-spread.js.map +2 -2
- package/dist/cdn/components/transits-table.js +3 -382
- package/dist/cdn/components/transits-table.js.map +4 -4
- package/dist/cdn/components/vedic-kundli.js +3 -305
- package/dist/cdn/components/vedic-kundli.js.map +4 -4
- package/dist/cdn/components/vedic-planets-table.js +2 -202
- package/dist/cdn/components/vedic-planets-table.js.map +2 -2
- package/dist/cdn/components/western-planets-table.js +3 -192
- package/dist/cdn/components/western-planets-table.js.map +2 -2
- package/dist/cdn/components/yoga-list.js +2 -305
- package/dist/cdn/components/yoga-list.js.map +2 -2
- package/dist/cdn/roxy-ui.js +3 -5102
- package/dist/cdn/roxy-ui.js.map +4 -4
- package/dist/cdn/widgets.js +1 -114
- package/dist/components/ashtakavarga-grid.js +1 -577
- package/dist/components/ashtakavarga-grid.js.map +3 -3
- package/dist/components/biorhythm-chart.js +1 -378
- package/dist/components/biorhythm-chart.js.map +3 -3
- package/dist/components/choghadiya-grid.js +1 -397
- package/dist/components/choghadiya-grid.js.map +3 -3
- package/dist/components/compatibility-card.js +1 -359
- package/dist/components/compatibility-card.js.map +3 -3
- package/dist/components/dasha-timeline.d.ts.map +1 -1
- package/dist/components/dasha-timeline.js +1 -447
- package/dist/components/dasha-timeline.js.map +4 -4
- package/dist/components/data.js +1 -408
- package/dist/components/data.js.map +3 -3
- package/dist/components/divisional-chart.d.ts.map +1 -1
- package/dist/components/divisional-chart.js +1 -932
- package/dist/components/divisional-chart.js.map +4 -4
- package/dist/components/dosha-card.js +1 -339
- package/dist/components/dosha-card.js.map +3 -3
- package/dist/components/endpoint-form.js +1 -505
- package/dist/components/endpoint-form.js.map +3 -3
- package/dist/components/guna-milan.js +1 -420
- package/dist/components/guna-milan.js.map +3 -3
- package/dist/components/hexagram.js +1 -426
- package/dist/components/hexagram.js.map +3 -3
- package/dist/components/horoscope-card.js +1 -427
- package/dist/components/horoscope-card.js.map +3 -3
- package/dist/components/kp-chart.js +1 -441
- package/dist/components/kp-chart.js.map +3 -3
- package/dist/components/kp-planets-table.js +1 -292
- package/dist/components/kp-planets-table.js.map +3 -3
- package/dist/components/kp-ruling-planets.js +1 -334
- package/dist/components/kp-ruling-planets.js.map +3 -3
- package/dist/components/location-search.js +1 -461
- package/dist/components/location-search.js.map +3 -3
- package/dist/components/moon-phase.js +1 -373
- package/dist/components/moon-phase.js.map +3 -3
- package/dist/components/nakshatra-card.js +1 -290
- package/dist/components/nakshatra-card.js.map +3 -3
- package/dist/components/natal-chart.d.ts +0 -1
- package/dist/components/natal-chart.d.ts.map +1 -1
- package/dist/components/natal-chart.js +1 -1086
- package/dist/components/natal-chart.js.map +4 -4
- package/dist/components/numerology-card.js +1 -361
- package/dist/components/numerology-card.js.map +3 -3
- package/dist/components/panchang-table.js +1 -396
- package/dist/components/panchang-table.js.map +3 -3
- package/dist/components/shadbala-table.js +1 -459
- package/dist/components/shadbala-table.js.map +3 -3
- package/dist/components/synastry-chart.js +1 -704
- package/dist/components/synastry-chart.js.map +3 -3
- package/dist/components/tarot-card.js +1 -379
- package/dist/components/tarot-card.js.map +3 -3
- package/dist/components/tarot-spread.js +1 -356
- package/dist/components/tarot-spread.js.map +3 -3
- package/dist/components/transits-table.d.ts +2 -0
- package/dist/components/transits-table.d.ts.map +1 -1
- package/dist/components/transits-table.js +1 -594
- package/dist/components/transits-table.js.map +4 -4
- package/dist/components/vedic-kundli.d.ts.map +1 -1
- package/dist/components/vedic-kundli.js +1 -848
- package/dist/components/vedic-kundli.js.map +4 -4
- package/dist/components/vedic-planets-table.js +1 -414
- package/dist/components/vedic-planets-table.js.map +3 -3
- package/dist/components/western-planets-table.js +1 -409
- package/dist/components/western-planets-table.js.map +3 -3
- package/dist/components/yoga-list.js +1 -429
- package/dist/components/yoga-list.js.map +3 -3
- package/dist/index.cjs +1 -8726
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +1 -8706
- package/dist/index.js.map +4 -4
- package/dist/utils/disclosure.d.ts +16 -0
- package/dist/utils/disclosure.d.ts.map +1 -0
- package/dist/utils/kundli-render.d.ts.map +1 -1
- package/dist/utils/kundli-styles.d.ts.map +1 -1
- package/dist/utils/tablist.d.ts +44 -0
- package/dist/utils/tablist.d.ts.map +1 -0
- package/dist/version.d.ts +1 -1
- package/package.json +3 -1
- package/src/components/dasha-timeline.ts +10 -1
- package/src/components/divisional-chart.ts +2 -0
- package/src/components/natal-chart.ts +37 -62
- package/src/components/transits-table.ts +45 -18
- package/src/components/vedic-kundli.ts +2 -1
- package/src/utils/disclosure.ts +62 -0
- package/src/utils/kundli-render.ts +21 -35
- package/src/utils/kundli-styles.ts +0 -31
- package/src/utils/tablist.ts +124 -0
- package/src/version.ts +1 -1
|
@@ -1,1087 +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/natal-chart.ts
|
|
13
|
-
import { css as css2, html, LitElement, nothing, svg } from "lit";
|
|
14
|
-
import { customElement, property, state } 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
|
-
var ASPECT_SYMBOL = {
|
|
73
|
-
conjunction: "\u260C",
|
|
74
|
-
opposition: "\u260D",
|
|
75
|
-
trine: "\u25B3",
|
|
76
|
-
square: "\u25A1",
|
|
77
|
-
sextile: "\u2731",
|
|
78
|
-
quincunx: "\u22BB",
|
|
79
|
-
semisextile: "\u22BC"
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
// packages/ui/src/utils/base-styles.ts
|
|
83
|
-
import { css } from "lit";
|
|
84
|
-
var baseStyles = css`
|
|
85
|
-
:host {
|
|
86
|
-
display: block;
|
|
87
|
-
container-type: inline-size;
|
|
88
|
-
font-family: var(
|
|
89
|
-
--roxy-font-sans,
|
|
90
|
-
system-ui,
|
|
91
|
-
-apple-system,
|
|
92
|
-
BlinkMacSystemFont,
|
|
93
|
-
'Segoe UI',
|
|
94
|
-
Roboto,
|
|
95
|
-
sans-serif
|
|
96
|
-
);
|
|
97
|
-
color: var(--roxy-fg, #0a0a0a);
|
|
98
|
-
background: transparent;
|
|
99
|
-
font-size: var(--roxy-text-base, 1rem);
|
|
100
|
-
line-height: var(--roxy-leading-normal, 1.5);
|
|
101
|
-
animation: roxy-fade-in var(--roxy-motion-duration, 200ms)
|
|
102
|
-
var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
*,
|
|
106
|
-
*::before,
|
|
107
|
-
*::after {
|
|
108
|
-
box-sizing: border-box;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
@keyframes roxy-fade-in {
|
|
112
|
-
from {
|
|
113
|
-
opacity: 0;
|
|
114
|
-
transform: translateY(2px);
|
|
115
|
-
}
|
|
116
|
-
to {
|
|
117
|
-
opacity: 1;
|
|
118
|
-
transform: translateY(0);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
@media (prefers-reduced-motion: reduce) {
|
|
123
|
-
:host {
|
|
124
|
-
animation: none;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
.roxy-skeleton {
|
|
129
|
-
background: linear-gradient(
|
|
130
|
-
90deg,
|
|
131
|
-
var(--roxy-border, #e4e4e7) 0%,
|
|
132
|
-
color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,
|
|
133
|
-
var(--roxy-border, #e4e4e7) 100%
|
|
134
|
-
);
|
|
135
|
-
background-size: 200% 100%;
|
|
136
|
-
animation: roxy-shimmer 1.4s ease-in-out infinite;
|
|
137
|
-
border-radius: var(--roxy-radius-md, 8px);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
@keyframes roxy-shimmer {
|
|
141
|
-
0% {
|
|
142
|
-
background-position: 200% 0;
|
|
143
|
-
}
|
|
144
|
-
100% {
|
|
145
|
-
background-position: -200% 0;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
@media (prefers-reduced-motion: reduce) {
|
|
150
|
-
.roxy-skeleton {
|
|
151
|
-
animation: none;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
.roxy-empty {
|
|
156
|
-
padding: var(--roxy-space-lg, 1.5rem);
|
|
157
|
-
color: var(--roxy-muted, #71717a);
|
|
158
|
-
text-align: center;
|
|
159
|
-
font-size: var(--roxy-text-sm, 0.875rem);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
:host(:focus-within) .roxy-card {
|
|
163
|
-
outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
|
|
164
|
-
outline-offset: 2px;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/* Force the text-style variant on every Unicode glyph in the component.
|
|
168
|
-
* macOS and iOS substitute coloured emoji glyphs for the planetary and
|
|
169
|
-
* gender Unicode code points (Mars, Venus, Mercury, etc.) when the
|
|
170
|
-
* system colour-emoji font wins font selection. The text-style variant
|
|
171
|
-
* keeps glyphs monochrome so they inherit the surrounding fill colour
|
|
172
|
-
* and match the brand palette consistently across platforms.
|
|
173
|
-
*
|
|
174
|
-
* font-variant-emoji is part of CSS Fonts 4 (Safari 17+, Chrome 134+,
|
|
175
|
-
* Firefox 139+). On older browsers the rule is silently ignored.
|
|
176
|
-
*/
|
|
177
|
-
:host {
|
|
178
|
-
font-variant-emoji: text;
|
|
179
|
-
}
|
|
180
|
-
`;
|
|
181
|
-
|
|
182
|
-
// packages/ui/src/utils/degree.ts
|
|
183
|
-
function normalizeLongitude(lon) {
|
|
184
|
-
const wrapped = lon % 360;
|
|
185
|
-
return wrapped < 0 ? wrapped + 360 : wrapped;
|
|
186
|
-
}
|
|
187
|
-
function longitudeToSignPosition(longitude) {
|
|
188
|
-
const lon = normalizeLongitude(longitude);
|
|
189
|
-
const signIndex = Math.floor(lon / 30) % 12;
|
|
190
|
-
const within = lon % 30;
|
|
191
|
-
const degree = Math.floor(within);
|
|
192
|
-
const minuteFloat = (within - degree) * 60;
|
|
193
|
-
const minute = Math.floor(minuteFloat);
|
|
194
|
-
const second = Math.round((minuteFloat - minute) * 60);
|
|
195
|
-
return {
|
|
196
|
-
sign: SIGNS_ORDER[signIndex] ?? "Aries",
|
|
197
|
-
signIndex,
|
|
198
|
-
degree,
|
|
199
|
-
minute,
|
|
200
|
-
second
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
function oppositePoint(longitude) {
|
|
204
|
-
return normalizeLongitude(longitude + 180);
|
|
205
|
-
}
|
|
206
|
-
function arcMidpoint(start, end) {
|
|
207
|
-
const s = normalizeLongitude(start);
|
|
208
|
-
let span = normalizeLongitude(end) - s;
|
|
209
|
-
if (span < 0) span += 360;
|
|
210
|
-
return normalizeLongitude(s + span / 2);
|
|
211
|
-
}
|
|
212
|
-
function polarToCartesian(cx, cy, radius, angleDeg) {
|
|
213
|
-
const angleRad = angleDeg * Math.PI / 180;
|
|
214
|
-
return {
|
|
215
|
-
x: cx + radius * Math.cos(angleRad),
|
|
216
|
-
y: cy + radius * Math.sin(angleRad)
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// packages/ui/src/utils/format.ts
|
|
221
|
-
function formatNumber(value, dp = 1) {
|
|
222
|
-
if (typeof value !== "number" || !Number.isFinite(value)) return "";
|
|
223
|
-
return value.toFixed(dp).replace(/\.?0+$/, "");
|
|
224
|
-
}
|
|
225
|
-
var ASPECT_CLASS = {
|
|
226
|
-
conjunction: "aspect-conjunction",
|
|
227
|
-
sextile: "aspect-sextile",
|
|
228
|
-
square: "aspect-square",
|
|
229
|
-
trine: "aspect-trine",
|
|
230
|
-
opposition: "aspect-opposition"
|
|
231
|
-
};
|
|
232
|
-
function normalizeAspect(a) {
|
|
233
|
-
return (a.type ?? "").toLowerCase().replace(/_/g, "-");
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// packages/ui/src/utils/markup-data.ts
|
|
237
|
-
var ROXY_DATA_CLASS = "roxy-data";
|
|
238
|
-
function isJsonScript(el) {
|
|
239
|
-
return el.nodeName === "SCRIPT" && el.getAttribute("type") === "application/json";
|
|
240
|
-
}
|
|
241
|
-
var MarkupDataController = class {
|
|
242
|
-
constructor(host) {
|
|
243
|
-
this.host = host;
|
|
244
|
-
host.addController(this);
|
|
245
|
-
}
|
|
246
|
-
hostConnected() {
|
|
247
|
-
if (this.host.data != null) return;
|
|
248
|
-
const parsed = this.read();
|
|
249
|
-
if (parsed === void 0) return;
|
|
250
|
-
this.host.data = parsed;
|
|
251
|
-
this.host.requestUpdate();
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Resolve the embedded payload. Returns `undefined` when there is nothing valid to read so the caller can leave `host.data` untouched.
|
|
255
|
-
*/
|
|
256
|
-
read() {
|
|
257
|
-
const inline = this.findInlineScript();
|
|
258
|
-
return inline ? this.parse(inline.textContent) : void 0;
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* 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.
|
|
262
|
-
*/
|
|
263
|
-
findInlineScript() {
|
|
264
|
-
for (const child of Array.from(this.host.children)) {
|
|
265
|
-
if (isJsonScript(child) && child.classList.contains(ROXY_DATA_CLASS)) {
|
|
266
|
-
return child;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
parse(text) {
|
|
272
|
-
if (!text?.trim()) return void 0;
|
|
273
|
-
try {
|
|
274
|
-
return JSON.parse(text);
|
|
275
|
-
} catch {
|
|
276
|
-
return void 0;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
// packages/ui/src/utils/string.ts
|
|
282
|
-
function capitalize(s) {
|
|
283
|
-
if (!s) return "";
|
|
284
|
-
return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// packages/ui/src/components/natal-chart.ts
|
|
288
|
-
var SIZE = 420;
|
|
289
|
-
var CENTER = SIZE / 2;
|
|
290
|
-
var OUTER_R = 164;
|
|
291
|
-
var SIGN_R = 146;
|
|
292
|
-
var HOUSE_R = 120;
|
|
293
|
-
var PLANET_R = 96;
|
|
294
|
-
var ANGLE_TICK_R = 178;
|
|
295
|
-
var ANGLE_LABEL_R = 196;
|
|
296
|
-
var RoxyNatalChart = class extends LitElement {
|
|
297
|
-
constructor() {
|
|
298
|
-
super();
|
|
299
|
-
this.data = null;
|
|
300
|
-
this.houseSystem = "placidus";
|
|
301
|
-
this.view = "wheel";
|
|
302
|
-
new MarkupDataController(this);
|
|
303
|
-
}
|
|
304
|
-
getPlanets() {
|
|
305
|
-
return this.data?.planets ?? [];
|
|
306
|
-
}
|
|
307
|
-
getAscendant() {
|
|
308
|
-
return this.data?.ascendant?.longitude ?? 0;
|
|
309
|
-
}
|
|
310
|
-
getMidheaven() {
|
|
311
|
-
const m = this.data?.midheaven?.longitude;
|
|
312
|
-
return typeof m === "number" ? m : null;
|
|
313
|
-
}
|
|
314
|
-
toAngle(lon) {
|
|
315
|
-
return 180 + this.getAscendant() - lon;
|
|
316
|
-
}
|
|
317
|
-
render() {
|
|
318
|
-
if (!this.data)
|
|
319
|
-
return html`<div class="roxy-empty" role="status">No chart data</div>`;
|
|
320
|
-
const planets = this.getPlanets();
|
|
321
|
-
const aspects = this.data.aspects ?? [];
|
|
322
|
-
const view = this.view;
|
|
323
|
-
return html`<div class="wrap">
|
|
324
|
-
<header>
|
|
325
|
-
<h2 class="title">Natal chart</h2>
|
|
326
|
-
${this.data.birthDetails ? html`<div class="meta">
|
|
327
|
-
${[this.data.birthDetails.date, this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}
|
|
328
|
-
</div>` : nothing}
|
|
329
|
-
</header>
|
|
330
|
-
<div
|
|
331
|
-
class="tablist"
|
|
332
|
-
role="tablist"
|
|
333
|
-
aria-label="Natal chart views"
|
|
334
|
-
@keydown=${this.onTabKeyDown}
|
|
335
|
-
>
|
|
336
|
-
${["wheel", "grid"].map(
|
|
337
|
-
(t) => html`<button
|
|
338
|
-
class="tab"
|
|
339
|
-
role="tab"
|
|
340
|
-
id="tab-${t}"
|
|
341
|
-
aria-selected=${view === t ? "true" : "false"}
|
|
342
|
-
aria-controls="panel-${t}"
|
|
343
|
-
tabindex=${view === t ? "0" : "-1"}
|
|
344
|
-
@click=${() => {
|
|
345
|
-
this.view = t;
|
|
346
|
-
}}
|
|
347
|
-
>
|
|
348
|
-
${t === "wheel" ? "Wheel" : "Aspect grid"}
|
|
349
|
-
</button>`
|
|
350
|
-
)}
|
|
351
|
-
</div>
|
|
352
|
-
<div id="panel-${view}" role="tabpanel" aria-labelledby="tab-${view}">
|
|
353
|
-
${view === "wheel" ? this.renderWheel(planets, aspects) : this.renderAspectGrid(planets, aspects)}
|
|
354
|
-
</div>
|
|
355
|
-
<div class="legend">
|
|
356
|
-
<span>${planets.length} planets</span>
|
|
357
|
-
<span>${aspects.length} aspects</span>
|
|
358
|
-
${this.data.houseSystem ? html`<span>${this.data.houseSystem} houses</span>` : nothing}
|
|
359
|
-
<span><span class="legend-swatch" style="background: var(--roxy-success)"></span>harmonious</span>
|
|
360
|
-
<span><span class="legend-swatch" style="background: var(--roxy-danger)"></span>challenging</span>
|
|
361
|
-
</div>
|
|
362
|
-
${this.renderDetails()}
|
|
363
|
-
${this.renderInterpretations()}
|
|
364
|
-
</div>`;
|
|
365
|
-
}
|
|
366
|
-
onTabKeyDown(e) {
|
|
367
|
-
if (e.key !== "ArrowRight" && e.key !== "ArrowLeft") return;
|
|
368
|
-
e.preventDefault();
|
|
369
|
-
this.view = this.view === "wheel" ? "grid" : "wheel";
|
|
370
|
-
const next = this.view;
|
|
371
|
-
requestAnimationFrame(() => {
|
|
372
|
-
this.shadowRoot?.querySelector(`#tab-${next}`)?.focus();
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
renderWheel(planets, aspects) {
|
|
376
|
-
return html`<svg
|
|
377
|
-
viewBox="0 0 ${SIZE} ${SIZE}"
|
|
378
|
-
role="img"
|
|
379
|
-
aria-label="Natal chart wheel with twelve houses, planets, and aspects"
|
|
380
|
-
>
|
|
381
|
-
<title>Natal chart wheel</title>
|
|
382
|
-
<desc>
|
|
383
|
-
Twelve zodiac sign segments around a circular wheel. Planet glyphs are
|
|
384
|
-
placed at their ecliptic longitudes. Aspect lines connect related planets.
|
|
385
|
-
</desc>
|
|
386
|
-
<circle class="wheel-line" cx=${CENTER} cy=${CENTER} r=${OUTER_R} stroke-width="1.5" />
|
|
387
|
-
<circle class="wheel-line" cx=${CENTER} cy=${CENTER} r=${SIGN_R - 14} stroke-width="0.8" />
|
|
388
|
-
<circle class="wheel-line" cx=${CENTER} cy=${CENTER} r=${HOUSE_R} stroke-width="1" />
|
|
389
|
-
<circle class="wheel-line" cx=${CENTER} cy=${CENTER} r=${PLANET_R - 16} stroke-width="0.5" />
|
|
390
|
-
${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()}
|
|
391
|
-
${this.renderHouseNumbers()} ${this.renderCuspDegrees()}
|
|
392
|
-
${this.renderAspects(planets, aspects)} ${this.renderPlanets(planets)}
|
|
393
|
-
${this.renderAngles()}
|
|
394
|
-
</svg>`;
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* Planet-by-planet aspect grid: the lower-triangular matrix astrologers read
|
|
398
|
-
* alongside the wheel. Each filled cell shows the aspect glyph colored by
|
|
399
|
-
* nature, with the exact orb in the SVG-free `<title>` tooltip.
|
|
400
|
-
*/
|
|
401
|
-
renderAspectGrid(planets, aspects) {
|
|
402
|
-
const names = planets.map((p) => capitalize(p.name));
|
|
403
|
-
const byPair = /* @__PURE__ */ new Map();
|
|
404
|
-
for (const a of aspects) {
|
|
405
|
-
const k = [capitalize(a.planet1), capitalize(a.planet2)].sort().join("|");
|
|
406
|
-
byPair.set(k, a);
|
|
407
|
-
}
|
|
408
|
-
if (names.length === 0)
|
|
409
|
-
return html`<p class="roxy-empty" role="status">No planets to grid</p>`;
|
|
410
|
-
return html`<div class="grid-scroll">
|
|
411
|
-
<table class="aspect-grid" aria-label="Planet by planet aspect grid">
|
|
412
|
-
<thead>
|
|
413
|
-
<tr>
|
|
414
|
-
<th></th>
|
|
415
|
-
${names.slice(0, -1).map((n) => {
|
|
416
|
-
const g = PLANET_GLYPH[n] ?? n.slice(0, 2);
|
|
417
|
-
return html`<th scope="col" title=${n}>${g}</th>`;
|
|
418
|
-
})}
|
|
419
|
-
</tr>
|
|
420
|
-
</thead>
|
|
421
|
-
<tbody>
|
|
422
|
-
${names.slice(1).map((rowName, ri) => {
|
|
423
|
-
const rowGlyph = PLANET_GLYPH[rowName] ?? rowName.slice(0, 2);
|
|
424
|
-
return html`<tr>
|
|
425
|
-
<th scope="row" title=${rowName}>${rowGlyph}</th>
|
|
426
|
-
${names.slice(0, ri + 1).map((colName) => {
|
|
427
|
-
const a = byPair.get([rowName, colName].sort().join("|"));
|
|
428
|
-
if (!a) return html`<td class="empty"></td>`;
|
|
429
|
-
const name = normalizeAspect(a);
|
|
430
|
-
const sym = ASPECT_SYMBOL[name] ?? ASPECT_SYMBOL[name.replace(/-/g, "")] ?? name.slice(0, 3);
|
|
431
|
-
const cls = ASPECT_CLASS[name] ?? "aspect-other";
|
|
432
|
-
const orb = formatNumber(a.orb, 1);
|
|
433
|
-
return html`<td class=${`cell ${cls}`} title=${`${rowName} ${name} ${colName}${orb ? ` (orb ${orb}\xB0)` : ""}`}>
|
|
434
|
-
<span class="asp">${sym}</span>
|
|
435
|
-
</td>`;
|
|
436
|
-
})}
|
|
437
|
-
${names.slice(ri + 1, -1).map(() => html`<td class="empty"></td>`)}
|
|
438
|
-
</tr>`;
|
|
439
|
-
})}
|
|
440
|
-
</tbody>
|
|
441
|
-
</table>
|
|
442
|
-
</div>`;
|
|
443
|
-
}
|
|
444
|
-
renderAngles() {
|
|
445
|
-
const asc = this.getAscendant();
|
|
446
|
-
const mc = this.getMidheaven();
|
|
447
|
-
const items = [
|
|
448
|
-
this.renderAngleMark(asc, "ASC"),
|
|
449
|
-
this.renderAngleMark(oppositePoint(asc), "DSC")
|
|
450
|
-
];
|
|
451
|
-
if (mc !== null) {
|
|
452
|
-
items.push(this.renderAngleMark(mc, "MC"));
|
|
453
|
-
items.push(this.renderAngleMark(oppositePoint(mc), "IC"));
|
|
454
|
-
}
|
|
455
|
-
const pof = this.data?.partOfFortune?.longitude;
|
|
456
|
-
if (typeof pof === "number") {
|
|
457
|
-
items.push(this.renderAngleMark(normalizeLongitude(pof), "PoF"));
|
|
458
|
-
}
|
|
459
|
-
const vertex = this.data?.vertex?.longitude;
|
|
460
|
-
if (typeof vertex === "number") {
|
|
461
|
-
items.push(this.renderAngleMark(normalizeLongitude(vertex), "Vtx"));
|
|
462
|
-
}
|
|
463
|
-
return items;
|
|
464
|
-
}
|
|
465
|
-
renderAngleMark(longitude, label) {
|
|
466
|
-
const angle = this.toAngle(longitude);
|
|
467
|
-
const tickInner = polarToCartesian(CENTER, CENTER, OUTER_R, angle);
|
|
468
|
-
const tickOuter = polarToCartesian(CENTER, CENTER, ANGLE_TICK_R, angle);
|
|
469
|
-
const labelPos = polarToCartesian(CENTER, CENTER, ANGLE_LABEL_R, angle);
|
|
470
|
-
return svg`
|
|
471
|
-
<g>
|
|
472
|
-
<line class="angle-tick" x1=${tickInner.x} y1=${tickInner.y} x2=${tickOuter.x} y2=${tickOuter.y} />
|
|
473
|
-
<text class="angle-marker" x=${labelPos.x} y=${labelPos.y} text-anchor="middle" dominant-baseline="central">${label}</text>
|
|
474
|
-
</g>
|
|
475
|
-
`;
|
|
476
|
-
}
|
|
477
|
-
renderSpokes() {
|
|
478
|
-
const houses = this.data?.houses ?? [];
|
|
479
|
-
const cuspLongitudes = houses.length === 12 ? houses.map((h) => h.longitude) : Array.from({ length: 12 }, (_, i) => this.getAscendant() + i * 30);
|
|
480
|
-
return cuspLongitudes.map((lon) => {
|
|
481
|
-
const angle = this.toAngle(lon);
|
|
482
|
-
const start = polarToCartesian(CENTER, CENTER, HOUSE_R, angle);
|
|
483
|
-
const end = polarToCartesian(CENTER, CENTER, OUTER_R, angle);
|
|
484
|
-
return svg`<line class="wheel-line" x1=${start.x} y1=${start.y} x2=${end.x} y2=${end.y} stroke-width="0.8" />`;
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
renderSigns() {
|
|
488
|
-
return SIGNS_ORDER.map((sign, i) => {
|
|
489
|
-
const angle = this.toAngle(i * 30 + 15);
|
|
490
|
-
const pos = polarToCartesian(CENTER, CENTER, SIGN_R, angle);
|
|
491
|
-
return svg`<text class="sign-glyph" x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central">${SIGN_GLYPH[sign]}</text>`;
|
|
492
|
-
});
|
|
493
|
-
}
|
|
494
|
-
renderHouseNumbers() {
|
|
495
|
-
const houses = this.data?.houses ?? [];
|
|
496
|
-
if (houses.length === 12) {
|
|
497
|
-
return houses.map((house, i) => {
|
|
498
|
-
const next = houses[(i + 1) % 12];
|
|
499
|
-
const mid = arcMidpoint(
|
|
500
|
-
house.longitude,
|
|
501
|
-
next ? next.longitude : house.longitude + 30
|
|
502
|
-
);
|
|
503
|
-
const pos = polarToCartesian(
|
|
504
|
-
CENTER,
|
|
505
|
-
CENTER,
|
|
506
|
-
HOUSE_R - 12,
|
|
507
|
-
this.toAngle(mid)
|
|
508
|
-
);
|
|
509
|
-
return svg`<text class="house-num" x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central">${house.number}</text>`;
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
const ascSignIndex = Math.floor(this.getAscendant() / 30);
|
|
513
|
-
return Array.from({ length: 12 }, (_, i) => {
|
|
514
|
-
const angle = this.toAngle(i * 30 + 15);
|
|
515
|
-
const pos = polarToCartesian(CENTER, CENTER, HOUSE_R - 12, angle);
|
|
516
|
-
const houseNum = (i - ascSignIndex + 12) % 12 + 1;
|
|
517
|
-
return svg`<text class="house-num" x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central">${houseNum}</text>`;
|
|
518
|
-
});
|
|
519
|
-
}
|
|
520
|
-
/**
|
|
521
|
-
* Degree ticks on the outer zodiac band: a short mark every 5 degrees and a
|
|
522
|
-
* longer one on each 30-degree sign cusp, so the wheel reads like a
|
|
523
|
-
* reference-grade chart rather than a bare ring of glyphs.
|
|
524
|
-
*/
|
|
525
|
-
renderTicks() {
|
|
526
|
-
const ticks = [];
|
|
527
|
-
for (let deg = 0; deg < 360; deg += 5) {
|
|
528
|
-
const angle = this.toAngle(deg);
|
|
529
|
-
const isMajor = deg % 30 === 0;
|
|
530
|
-
const inner = isMajor ? SIGN_R - 14 : OUTER_R - 5;
|
|
531
|
-
const a = polarToCartesian(CENTER, CENTER, inner, angle);
|
|
532
|
-
const b = polarToCartesian(CENTER, CENTER, OUTER_R, angle);
|
|
533
|
-
ticks.push(
|
|
534
|
-
svg`<line class=${isMajor ? "tick tick-major" : "tick"} x1=${a.x} y1=${a.y} x2=${b.x} y2=${b.y} stroke-width=${isMajor ? 1 : 0.5} />`
|
|
535
|
-
);
|
|
536
|
-
}
|
|
537
|
-
return ticks;
|
|
538
|
-
}
|
|
539
|
-
/**
|
|
540
|
-
* Degree-and-minute label printed next to each house cusp on the wheel, so
|
|
541
|
-
* the exact cusp position is readable without leaving the chart.
|
|
542
|
-
*/
|
|
543
|
-
renderCuspDegrees() {
|
|
544
|
-
const houses = this.data?.houses ?? [];
|
|
545
|
-
if (houses.length !== 12) return nothing;
|
|
546
|
-
return houses.map((house) => {
|
|
547
|
-
const angle = this.toAngle(house.longitude);
|
|
548
|
-
const pos = polarToCartesian(CENTER, CENTER, HOUSE_R + 9, angle);
|
|
549
|
-
const sp = longitudeToSignPosition(house.longitude);
|
|
550
|
-
return svg`<text class="cusp-deg" x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central">${sp.degree}°${String(sp.minute).padStart(2, "0")}'</text>`;
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
renderPlanets(planets) {
|
|
554
|
-
const MIN_SEPARATION = 7;
|
|
555
|
-
const sorted = planets.filter((p) => Number.isFinite(p.longitude)).map((p) => ({
|
|
556
|
-
p,
|
|
557
|
-
trueLon: normalizeLongitude(p.longitude),
|
|
558
|
-
displayLon: normalizeLongitude(p.longitude)
|
|
559
|
-
})).sort((a, b) => a.trueLon - b.trueLon);
|
|
560
|
-
for (let i = 1; i < sorted.length; i++) {
|
|
561
|
-
const prev = sorted[i - 1];
|
|
562
|
-
const cur = sorted[i];
|
|
563
|
-
if (!prev || !cur) continue;
|
|
564
|
-
const wanted = prev.displayLon + MIN_SEPARATION;
|
|
565
|
-
if (cur.displayLon < wanted) cur.displayLon = wanted;
|
|
566
|
-
}
|
|
567
|
-
const last = sorted[sorted.length - 1];
|
|
568
|
-
if (last && last.displayLon > 360) {
|
|
569
|
-
const shift = last.displayLon - 360;
|
|
570
|
-
for (const s of sorted) s.displayLon -= shift;
|
|
571
|
-
}
|
|
572
|
-
return sorted.map(({ p, trueLon, displayLon }) => {
|
|
573
|
-
const trueAngle = this.toAngle(trueLon);
|
|
574
|
-
const displayAngle = this.toAngle(displayLon);
|
|
575
|
-
const glyphPos = polarToCartesian(CENTER, CENTER, PLANET_R, displayAngle);
|
|
576
|
-
const degPos = polarToCartesian(
|
|
577
|
-
CENTER,
|
|
578
|
-
CENTER,
|
|
579
|
-
PLANET_R - 13,
|
|
580
|
-
displayAngle
|
|
581
|
-
);
|
|
582
|
-
const rimPos = polarToCartesian(CENTER, CENTER, OUTER_R - 4, trueAngle);
|
|
583
|
-
const leaderInner = polarToCartesian(
|
|
584
|
-
CENTER,
|
|
585
|
-
CENTER,
|
|
586
|
-
PLANET_R + 8,
|
|
587
|
-
displayAngle
|
|
588
|
-
);
|
|
589
|
-
const glyph = PLANET_GLYPH[capitalize(p.name)] ?? p.name.slice(0, 2);
|
|
590
|
-
const sp = longitudeToSignPosition(p.longitude);
|
|
591
|
-
const retro = p.isRetrograde === true;
|
|
592
|
-
const degLabel = `${sp.degree}\xB0${String(sp.minute).padStart(2, "0")}'`;
|
|
593
|
-
const offset = Math.abs(displayLon - trueLon) > 0.5;
|
|
594
|
-
return svg`<g>
|
|
595
|
-
${offset ? svg`<line class="planet-leader" x1=${rimPos.x} y1=${rimPos.y} x2=${leaderInner.x} y2=${leaderInner.y} />` : nothing}
|
|
596
|
-
<text class="planet-glyph" x=${glyphPos.x} y=${glyphPos.y} text-anchor="middle" dominant-baseline="central"><title>${p.name}${retro ? " retrograde" : ""} - ${degLabel} ${p.sign ?? ""}</title>${glyph}</text>
|
|
597
|
-
<text class="planet-deg" x=${degPos.x} y=${degPos.y} text-anchor="middle" dominant-baseline="central">${degLabel}${retro ? svg`<tspan class="retro"> ℞</tspan>` : nothing}</text>
|
|
598
|
-
</g>`;
|
|
599
|
-
});
|
|
600
|
-
}
|
|
601
|
-
renderDetails() {
|
|
602
|
-
const summary = this.data?.summary;
|
|
603
|
-
const ai = this.data?.aspectsInterpretation;
|
|
604
|
-
if (!summary && !ai) return nothing;
|
|
605
|
-
const retrogrades = summary?.retrogradePlanets ?? [];
|
|
606
|
-
return html`<div class="details">
|
|
607
|
-
${summary?.dominantElement || summary?.dominantModality ? html`<div class="pill-row">
|
|
608
|
-
${summary.dominantElement ? html`<span class="pill">Dominant element: ${summary.dominantElement}</span>` : nothing}
|
|
609
|
-
${summary.dominantModality ? html`<span class="pill">Dominant modality: ${summary.dominantModality}</span>` : nothing}
|
|
610
|
-
</div>` : nothing}
|
|
611
|
-
${ai ? html`<div class="pill-row">
|
|
612
|
-
<span class="pill pill--success">Harmonious ${ai.harmonious}</span>
|
|
613
|
-
<span class="pill pill--danger">Challenging ${ai.challenging}</span>
|
|
614
|
-
<span class="pill pill--muted">Neutral ${ai.neutral}</span>
|
|
615
|
-
</div>` : nothing}
|
|
616
|
-
${retrogrades.length > 0 ? html`<div class="pill-row">
|
|
617
|
-
${retrogrades.map((p) => {
|
|
618
|
-
const glyph = PLANET_GLYPH[p] ?? p.slice(0, 2);
|
|
619
|
-
return html`<span class="pill pill--muted">${glyph} ${p} R</span>`;
|
|
620
|
-
})}
|
|
621
|
-
</div>` : nothing}
|
|
622
|
-
${ai?.summary ? html`<p class="summary">${ai.summary}</p>` : nothing}
|
|
623
|
-
${this.renderElementModalityGrid()}
|
|
624
|
-
</div>`;
|
|
625
|
-
}
|
|
626
|
-
/**
|
|
627
|
-
* Element by modality grid: the 4x3 cross-tab astrologers read for chart
|
|
628
|
-
* balance. Each planet is placed by its sign into one cell (Fire/Earth/Air/
|
|
629
|
-
* Water row, Cardinal/Fixed/Mutable column). Derived purely from the planet
|
|
630
|
-
* signs, with row, column, and grand totals.
|
|
631
|
-
*/
|
|
632
|
-
renderElementModalityGrid() {
|
|
633
|
-
const planets = this.getPlanets();
|
|
634
|
-
if (planets.length === 0) return nothing;
|
|
635
|
-
const ELEMENTS = ["Fire", "Earth", "Air", "Water"];
|
|
636
|
-
const MODALITIES = ["Cardinal", "Fixed", "Mutable"];
|
|
637
|
-
const order = SIGNS_ORDER;
|
|
638
|
-
const cells = {};
|
|
639
|
-
for (const el of ELEMENTS)
|
|
640
|
-
cells[el] = { Cardinal: [], Fixed: [], Mutable: [] };
|
|
641
|
-
for (const p of planets) {
|
|
642
|
-
const idx = order.indexOf(capitalize(p.sign ?? ""));
|
|
643
|
-
if (idx < 0) continue;
|
|
644
|
-
const el = ELEMENTS[idx % 4];
|
|
645
|
-
const mod = MODALITIES[idx % 3];
|
|
646
|
-
const glyph = PLANET_GLYPH[capitalize(p.name)] ?? capitalize(p.name).slice(0, 2);
|
|
647
|
-
cells[el]?.[mod]?.push(glyph);
|
|
648
|
-
}
|
|
649
|
-
return html`<table class="em-grid" aria-label="Element and modality distribution">
|
|
650
|
-
<thead>
|
|
651
|
-
<tr>
|
|
652
|
-
<th></th>
|
|
653
|
-
${MODALITIES.map((m) => html`<th scope="col">${m.slice(0, 3)}</th>`)}
|
|
654
|
-
<th scope="col">Total</th>
|
|
655
|
-
</tr>
|
|
656
|
-
</thead>
|
|
657
|
-
<tbody>
|
|
658
|
-
${ELEMENTS.map((el) => {
|
|
659
|
-
const rowTotal = MODALITIES.reduce(
|
|
660
|
-
(s, m) => s + (cells[el]?.[m]?.length ?? 0),
|
|
661
|
-
0
|
|
662
|
-
);
|
|
663
|
-
return html`<tr>
|
|
664
|
-
<th scope="row">${el}</th>
|
|
665
|
-
${MODALITIES.map(
|
|
666
|
-
(m) => html`<td>${(cells[el]?.[m] ?? []).join(" ")}</td>`
|
|
667
|
-
)}
|
|
668
|
-
<td class="em-total">${rowTotal}</td>
|
|
669
|
-
</tr>`;
|
|
670
|
-
})}
|
|
671
|
-
<tr>
|
|
672
|
-
<th scope="row">Total</th>
|
|
673
|
-
${MODALITIES.map(
|
|
674
|
-
(m) => html`<td class="em-total">${ELEMENTS.reduce((s, el) => s + (cells[el]?.[m]?.length ?? 0), 0)}</td>`
|
|
675
|
-
)}
|
|
676
|
-
<td class="em-total">${planets.length}</td>
|
|
677
|
-
</tr>
|
|
678
|
-
</tbody>
|
|
679
|
-
</table>`;
|
|
680
|
-
}
|
|
681
|
-
renderInterpretations() {
|
|
682
|
-
const planets = this.getPlanets().filter((p) => p.interpretation);
|
|
683
|
-
if (planets.length === 0) return nothing;
|
|
684
|
-
return html`<section class="interpretations">
|
|
685
|
-
<h3>Planet readings</h3>
|
|
686
|
-
${planets.map((p, idx) => {
|
|
687
|
-
const interp = p.interpretation;
|
|
688
|
-
const glyph = PLANET_GLYPH[capitalize(p.name)] ?? "";
|
|
689
|
-
const deg = formatNumber(p.degree ?? 0, 1);
|
|
690
|
-
return html`<details class="interp-card" name="natal-planet-readings" ?open=${idx === 0}>
|
|
691
|
-
<summary>${glyph} ${p.name} <small>${p.sign ?? ""} ${deg}</small></summary>
|
|
692
|
-
<div class="interp-body">
|
|
693
|
-
${interp.summary ? html`<p class="interp-summary">${interp.summary}</p>` : nothing}
|
|
694
|
-
${interp.detailed ? html`<p class="interp-detail">${interp.detailed}</p>` : nothing}
|
|
695
|
-
${interp.keywords?.length ? html`<div class="interp-keywords">${interp.keywords.map((k) => html`<span class="kw">${k}</span>`)}</div>` : nothing}
|
|
696
|
-
</div>
|
|
697
|
-
</details>`;
|
|
698
|
-
})}
|
|
699
|
-
</section>`;
|
|
700
|
-
}
|
|
701
|
-
renderAspects(planets, aspects) {
|
|
702
|
-
const planetMap = /* @__PURE__ */ new Map();
|
|
703
|
-
for (const p of planets) {
|
|
704
|
-
if (typeof p.longitude !== "number") continue;
|
|
705
|
-
const name = capitalize(p.name);
|
|
706
|
-
if (name) planetMap.set(name, p.longitude);
|
|
707
|
-
}
|
|
708
|
-
return aspects.map((a) => {
|
|
709
|
-
const l1 = planetMap.get(capitalize(a.planet1));
|
|
710
|
-
const l2 = planetMap.get(capitalize(a.planet2));
|
|
711
|
-
if (l1 === void 0 || l2 === void 0) return nothing;
|
|
712
|
-
const p1 = polarToCartesian(
|
|
713
|
-
CENTER,
|
|
714
|
-
CENTER,
|
|
715
|
-
PLANET_R - 18,
|
|
716
|
-
this.toAngle(l1)
|
|
717
|
-
);
|
|
718
|
-
const p2 = polarToCartesian(
|
|
719
|
-
CENTER,
|
|
720
|
-
CENTER,
|
|
721
|
-
PLANET_R - 18,
|
|
722
|
-
this.toAngle(l2)
|
|
723
|
-
);
|
|
724
|
-
const aspectName = normalizeAspect(a);
|
|
725
|
-
const aspectClass = ASPECT_CLASS[aspectName] ?? "aspect-other";
|
|
726
|
-
const orbLabel = formatNumber(a.orb, 1);
|
|
727
|
-
return svg`<line class=${`aspect ${aspectClass}`} x1=${p1.x} y1=${p1.y} x2=${p2.x} y2=${p2.y}><title>${a.planet1} ${aspectName || ""} ${a.planet2}${orbLabel ? ` (orb ${orbLabel}\xB0)` : ""}</title></line>`;
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
};
|
|
731
|
-
RoxyNatalChart.styles = [
|
|
732
|
-
baseStyles,
|
|
733
|
-
css2`
|
|
734
|
-
.wrap {
|
|
735
|
-
width: 100%;
|
|
736
|
-
display: grid;
|
|
737
|
-
gap: var(--roxy-space-md, 1rem);
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
.title {
|
|
741
|
-
font-size: var(--roxy-text-lg, 1.125rem);
|
|
742
|
-
font-weight: var(--roxy-weight-bold, 600);
|
|
743
|
-
margin: 0;
|
|
744
|
-
color: var(--roxy-primary, #0f172a);
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
.meta {
|
|
748
|
-
color: var(--roxy-muted, #71717a);
|
|
749
|
-
font-size: var(--roxy-text-sm, 0.875rem);
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
svg {
|
|
753
|
-
display: block;
|
|
754
|
-
width: 100%;
|
|
755
|
-
max-width: 560px;
|
|
756
|
-
aspect-ratio: 1 / 1;
|
|
757
|
-
height: auto;
|
|
758
|
-
margin: 0 auto;
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
.wheel-line {
|
|
762
|
-
fill: none;
|
|
763
|
-
stroke: var(--roxy-border, #e4e4e7);
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
.sign-glyph {
|
|
767
|
-
fill: var(--roxy-secondary, #475569);
|
|
768
|
-
font-size: 14px;
|
|
769
|
-
font-family: var(--roxy-font-sans);
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
.planet-glyph {
|
|
773
|
-
fill: var(--roxy-accent, #f59e0b);
|
|
774
|
-
font-size: 14px;
|
|
775
|
-
font-weight: 600;
|
|
776
|
-
font-family: var(--roxy-font-sans);
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
.planet-deg {
|
|
780
|
-
fill: var(--roxy-fg, #0a0a0a);
|
|
781
|
-
font-size: 7px;
|
|
782
|
-
font-family: var(--roxy-font-sans);
|
|
783
|
-
}
|
|
784
|
-
|
|
785
|
-
/* Below 480px the chart container shrinks to ~320px on phones.
|
|
786
|
-
* Bump in-SVG text up proportionally so the 7px degree band
|
|
787
|
-
* does not collapse below ~6px on screen.
|
|
788
|
-
*/
|
|
789
|
-
@container (max-width: 480px) {
|
|
790
|
-
.sign-glyph,
|
|
791
|
-
.planet-glyph {
|
|
792
|
-
font-size: 18px;
|
|
793
|
-
}
|
|
794
|
-
.planet-deg {
|
|
795
|
-
font-size: 10px;
|
|
796
|
-
}
|
|
797
|
-
.house-num {
|
|
798
|
-
font-size: 12px;
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
.planet-deg .retro {
|
|
803
|
-
fill: var(--roxy-danger, #dc2626);
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
.planet-leader {
|
|
807
|
-
stroke: var(--roxy-accent, #f59e0b);
|
|
808
|
-
stroke-width: 0.5;
|
|
809
|
-
opacity: 0.55;
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
.house-num {
|
|
813
|
-
fill: var(--roxy-muted, #71717a);
|
|
814
|
-
font-size: 9px;
|
|
815
|
-
font-family: var(--roxy-font-sans);
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
.cusp-deg {
|
|
819
|
-
fill: var(--roxy-muted, #71717a);
|
|
820
|
-
font-size: 6px;
|
|
821
|
-
font-family: var(--roxy-font-sans);
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
.tick {
|
|
825
|
-
stroke: var(--roxy-border, #e4e4e7);
|
|
826
|
-
}
|
|
827
|
-
.tick-major {
|
|
828
|
-
stroke: var(--roxy-secondary, #475569);
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
.aspect {
|
|
832
|
-
stroke-width: 0.8;
|
|
833
|
-
fill: none;
|
|
834
|
-
opacity: 0.55;
|
|
835
|
-
}
|
|
836
|
-
.aspect-trine,
|
|
837
|
-
.aspect-sextile {
|
|
838
|
-
stroke: var(--roxy-success, #16a34a);
|
|
839
|
-
}
|
|
840
|
-
.aspect-square,
|
|
841
|
-
.aspect-opposition {
|
|
842
|
-
stroke: var(--roxy-danger, #dc2626);
|
|
843
|
-
}
|
|
844
|
-
.aspect-conjunction {
|
|
845
|
-
stroke: var(--roxy-accent-fg, #b45309);
|
|
846
|
-
}
|
|
847
|
-
.aspect-other {
|
|
848
|
-
stroke: var(--roxy-muted, #71717a);
|
|
849
|
-
opacity: 0.4;
|
|
850
|
-
}
|
|
851
|
-
|
|
852
|
-
.angle-marker {
|
|
853
|
-
fill: var(--roxy-accent-fg, #b45309);
|
|
854
|
-
font-size: 10px;
|
|
855
|
-
font-weight: 700;
|
|
856
|
-
font-family: var(--roxy-font-sans);
|
|
857
|
-
letter-spacing: 0.04em;
|
|
858
|
-
}
|
|
859
|
-
.angle-tick {
|
|
860
|
-
stroke: var(--roxy-accent-fg, #b45309);
|
|
861
|
-
stroke-width: 1.5;
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
.legend {
|
|
865
|
-
font-size: var(--roxy-text-xs, 0.75rem);
|
|
866
|
-
color: var(--roxy-muted, #71717a);
|
|
867
|
-
display: flex;
|
|
868
|
-
flex-wrap: wrap;
|
|
869
|
-
gap: var(--roxy-space-md, 1rem);
|
|
870
|
-
}
|
|
871
|
-
.legend-swatch {
|
|
872
|
-
display: inline-block;
|
|
873
|
-
width: 8px;
|
|
874
|
-
height: 8px;
|
|
875
|
-
border-radius: 50%;
|
|
876
|
-
margin-right: 4px;
|
|
877
|
-
vertical-align: middle;
|
|
878
|
-
}
|
|
879
|
-
|
|
880
|
-
.tablist {
|
|
881
|
-
display: flex;
|
|
882
|
-
gap: 2px;
|
|
883
|
-
border-bottom: 2px solid var(--roxy-border, #e4e4e7);
|
|
884
|
-
}
|
|
885
|
-
.tab {
|
|
886
|
-
padding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
|
|
887
|
-
font-size: var(--roxy-text-sm, 0.875rem);
|
|
888
|
-
background: none;
|
|
889
|
-
border: none;
|
|
890
|
-
border-bottom: 2px solid transparent;
|
|
891
|
-
margin-bottom: -2px;
|
|
892
|
-
cursor: pointer;
|
|
893
|
-
color: var(--roxy-muted, #71717a);
|
|
894
|
-
font-family: inherit;
|
|
895
|
-
transition: color var(--roxy-motion-duration, 200ms) var(--roxy-motion-easing, ease);
|
|
896
|
-
}
|
|
897
|
-
.tab[aria-selected='true'] {
|
|
898
|
-
color: var(--roxy-accent-fg, #b45309);
|
|
899
|
-
border-bottom-color: var(--roxy-accent, #f59e0b);
|
|
900
|
-
font-weight: var(--roxy-weight-bold, 600);
|
|
901
|
-
}
|
|
902
|
-
.tab:hover:not([aria-selected='true']) {
|
|
903
|
-
color: var(--roxy-fg, #0a0a0a);
|
|
904
|
-
}
|
|
905
|
-
|
|
906
|
-
.grid-scroll {
|
|
907
|
-
overflow-x: auto;
|
|
908
|
-
-webkit-overflow-scrolling: touch;
|
|
909
|
-
}
|
|
910
|
-
table.aspect-grid {
|
|
911
|
-
border-collapse: collapse;
|
|
912
|
-
font-size: var(--roxy-text-xs, 0.75rem);
|
|
913
|
-
margin: 0 auto;
|
|
914
|
-
}
|
|
915
|
-
table.aspect-grid th,
|
|
916
|
-
table.aspect-grid td {
|
|
917
|
-
width: 1.6rem;
|
|
918
|
-
height: 1.6rem;
|
|
919
|
-
text-align: center;
|
|
920
|
-
border: 1px solid var(--roxy-border, #e4e4e7);
|
|
921
|
-
padding: 0;
|
|
922
|
-
}
|
|
923
|
-
table.aspect-grid th {
|
|
924
|
-
color: var(--roxy-secondary, #475569);
|
|
925
|
-
font-weight: var(--roxy-weight-bold, 600);
|
|
926
|
-
}
|
|
927
|
-
table.aspect-grid td.cell {
|
|
928
|
-
cursor: default;
|
|
929
|
-
}
|
|
930
|
-
table.aspect-grid td.empty {
|
|
931
|
-
background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 18%, transparent);
|
|
932
|
-
}
|
|
933
|
-
table.aspect-grid td .asp {
|
|
934
|
-
font-size: 0.95em;
|
|
935
|
-
line-height: 1;
|
|
936
|
-
}
|
|
937
|
-
table.aspect-grid td.aspect-trine .asp,
|
|
938
|
-
table.aspect-grid td.aspect-sextile .asp {
|
|
939
|
-
color: var(--roxy-success, #16a34a);
|
|
940
|
-
}
|
|
941
|
-
table.aspect-grid td.aspect-square .asp,
|
|
942
|
-
table.aspect-grid td.aspect-opposition .asp {
|
|
943
|
-
color: var(--roxy-danger, #dc2626);
|
|
944
|
-
}
|
|
945
|
-
table.aspect-grid td.aspect-conjunction .asp {
|
|
946
|
-
color: var(--roxy-accent-fg, #b45309);
|
|
947
|
-
}
|
|
948
|
-
table.aspect-grid td.aspect-other .asp {
|
|
949
|
-
color: var(--roxy-muted, #71717a);
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
.details {
|
|
953
|
-
margin-top: var(--roxy-space-md, 1rem);
|
|
954
|
-
}
|
|
955
|
-
|
|
956
|
-
.pill-row {
|
|
957
|
-
display: flex;
|
|
958
|
-
flex-wrap: wrap;
|
|
959
|
-
gap: var(--roxy-space-xs, 0.25rem);
|
|
960
|
-
margin-bottom: var(--roxy-space-xs, 0.25rem);
|
|
961
|
-
}
|
|
962
|
-
|
|
963
|
-
.pill {
|
|
964
|
-
padding: 2px 8px;
|
|
965
|
-
border-radius: var(--roxy-radius-sm, 4px);
|
|
966
|
-
font-size: var(--roxy-text-xs, 0.75rem);
|
|
967
|
-
background: color-mix(in srgb, var(--roxy-fg, #0f172a) 8%, transparent);
|
|
968
|
-
color: var(--roxy-fg, #0f172a);
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
.pill--success {
|
|
972
|
-
background: color-mix(in srgb, var(--roxy-success, #16a34a) 15%, transparent);
|
|
973
|
-
color: var(--roxy-success, #16a34a);
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
.pill--danger {
|
|
977
|
-
background: color-mix(in srgb, var(--roxy-danger, #dc2626) 15%, transparent);
|
|
978
|
-
color: var(--roxy-danger, #dc2626);
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
.pill--muted {
|
|
982
|
-
background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);
|
|
983
|
-
color: var(--roxy-fg, #0a0a0a);
|
|
984
|
-
}
|
|
985
|
-
|
|
986
|
-
.summary {
|
|
987
|
-
color: var(--roxy-fg, #0f172a);
|
|
988
|
-
font-size: var(--roxy-text-sm, 0.875rem);
|
|
989
|
-
margin: var(--roxy-space-md, 1rem) 0;
|
|
990
|
-
}
|
|
991
|
-
|
|
992
|
-
.em-grid {
|
|
993
|
-
border-collapse: collapse;
|
|
994
|
-
font-size: var(--roxy-text-xs, 0.75rem);
|
|
995
|
-
width: 100%;
|
|
996
|
-
}
|
|
997
|
-
.em-grid th,
|
|
998
|
-
.em-grid td {
|
|
999
|
-
border: 1px solid var(--roxy-border, #e4e4e7);
|
|
1000
|
-
padding: 3px 5px;
|
|
1001
|
-
text-align: center;
|
|
1002
|
-
vertical-align: middle;
|
|
1003
|
-
}
|
|
1004
|
-
.em-grid th {
|
|
1005
|
-
color: var(--roxy-muted, #71717a);
|
|
1006
|
-
font-weight: var(--roxy-weight-bold, 600);
|
|
1007
|
-
text-transform: uppercase;
|
|
1008
|
-
letter-spacing: 0.04em;
|
|
1009
|
-
}
|
|
1010
|
-
.em-grid th[scope='row'] {
|
|
1011
|
-
text-align: left;
|
|
1012
|
-
}
|
|
1013
|
-
.em-grid td {
|
|
1014
|
-
color: var(--roxy-accent, #f59e0b);
|
|
1015
|
-
font-size: 0.95em;
|
|
1016
|
-
line-height: 1.4;
|
|
1017
|
-
min-width: 1.4rem;
|
|
1018
|
-
}
|
|
1019
|
-
.em-grid .em-total {
|
|
1020
|
-
color: var(--roxy-fg, #0a0a0a);
|
|
1021
|
-
font-weight: var(--roxy-weight-bold, 600);
|
|
1022
|
-
background: color-mix(in srgb, var(--roxy-border, #e4e4e7) 25%, transparent);
|
|
1023
|
-
}
|
|
1024
|
-
|
|
1025
|
-
.interpretations {
|
|
1026
|
-
margin-top: var(--roxy-space-md, 1rem);
|
|
1027
|
-
}
|
|
1028
|
-
.interpretations h3 {
|
|
1029
|
-
font-size: var(--roxy-text-sm, 0.875rem);
|
|
1030
|
-
font-weight: 600;
|
|
1031
|
-
color: var(--roxy-muted, #71717a);
|
|
1032
|
-
text-transform: uppercase;
|
|
1033
|
-
letter-spacing: 0.06em;
|
|
1034
|
-
margin: 0 0 var(--roxy-space-sm, 0.5rem);
|
|
1035
|
-
}
|
|
1036
|
-
.interp-card {
|
|
1037
|
-
border: 1px solid var(--roxy-border, #e4e4e7);
|
|
1038
|
-
border-radius: var(--roxy-radius-md, 8px);
|
|
1039
|
-
padding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);
|
|
1040
|
-
margin-bottom: var(--roxy-space-xs, 0.25rem);
|
|
1041
|
-
}
|
|
1042
|
-
.interp-card summary {
|
|
1043
|
-
cursor: pointer;
|
|
1044
|
-
font-weight: 500;
|
|
1045
|
-
color: var(--roxy-fg, #0f172a);
|
|
1046
|
-
}
|
|
1047
|
-
.interp-card summary small {
|
|
1048
|
-
color: var(--roxy-muted, #71717a);
|
|
1049
|
-
margin-left: 0.5em;
|
|
1050
|
-
font-weight: 400;
|
|
1051
|
-
}
|
|
1052
|
-
.interp-body {
|
|
1053
|
-
margin-top: var(--roxy-space-xs, 0.25rem);
|
|
1054
|
-
color: var(--roxy-fg, #0f172a);
|
|
1055
|
-
font-size: var(--roxy-text-sm, 0.875rem);
|
|
1056
|
-
}
|
|
1057
|
-
.interp-keywords {
|
|
1058
|
-
display: flex;
|
|
1059
|
-
flex-wrap: wrap;
|
|
1060
|
-
gap: 0.25rem;
|
|
1061
|
-
margin-top: 0.5rem;
|
|
1062
|
-
}
|
|
1063
|
-
.interp-keywords .kw {
|
|
1064
|
-
padding: 1px 8px;
|
|
1065
|
-
border-radius: 9999px;
|
|
1066
|
-
background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
|
|
1067
|
-
color: var(--roxy-accent-fg, #b45309);
|
|
1068
|
-
font-size: var(--roxy-text-xs, 0.75rem);
|
|
1069
|
-
}
|
|
1070
|
-
`
|
|
1071
|
-
];
|
|
1072
|
-
__decorateClass([
|
|
1073
|
-
property({ attribute: false })
|
|
1074
|
-
], RoxyNatalChart.prototype, "data", 2);
|
|
1075
|
-
__decorateClass([
|
|
1076
|
-
property({ type: String, attribute: "house-system", reflect: true })
|
|
1077
|
-
], RoxyNatalChart.prototype, "houseSystem", 2);
|
|
1078
|
-
__decorateClass([
|
|
1079
|
-
state()
|
|
1080
|
-
], RoxyNatalChart.prototype, "view", 2);
|
|
1081
|
-
RoxyNatalChart = __decorateClass([
|
|
1082
|
-
customElement("roxy-natal-chart")
|
|
1083
|
-
], RoxyNatalChart);
|
|
1084
|
-
export {
|
|
1085
|
-
RoxyNatalChart
|
|
1086
|
-
};
|
|
1
|
+
var X=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var L=(c,l,r,a)=>{for(var t=a>1?void 0:a?Q(l,r):l,n=c.length-1,e;n>=0;n--)(e=c[n])&&(t=(a?e(l,r,t):e(t))||t);return a&&t&&X(l,r,t),t};import{css as ie,html as d,LitElement as le,nothing as u,svg as h}from"lit";import{customElement as ce,property as J,state as de}from"lit/decorators.js";var $={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 j={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 k=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],ge=k.map(c=>c.toLowerCase()),R={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"};import{css as ee}from"lit";var q=ee`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;function f(c){let l=c%360;return l<0?l+360:l}function N(c){let l=f(c),r=Math.floor(l/30)%12,a=l%30,t=Math.floor(a),n=(a-t)*60,e=Math.floor(n),o=Math.round((n-e)*60);return{sign:k[r]??"Aries",signIndex:r,degree:t,minute:e,second:o}}function C(c){return f(c+180)}function B(c,l){let r=f(c),a=f(l)-r;return a<0&&(a+=360),f(r+a/2)}function m(c,l,r,a){let t=a*Math.PI/180;return{x:c+r*Math.cos(t),y:l+r*Math.sin(t)}}import{css as te,html as re}from"lit";function F(){return re`<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 Y=te`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 E(c,l=1){return typeof c!="number"||!Number.isFinite(c)?"":c.toFixed(l).replace(/\.?0+$/,"")}var z={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function I(c){return(c.type??"").toLowerCase().replace(/_/g,"-")}var ne="roxy-data";function ae(c){return c.nodeName==="SCRIPT"&&c.getAttribute("type")==="application/json"}var M=class{constructor(l){this.host=l,l.addController(this)}hostConnected(){if(this.host.data!=null)return;let l=this.read();l!==void 0&&(this.host.data=l,this.host.requestUpdate())}read(){let l=this.findInlineScript();return l?this.parse(l.textContent):void 0}findInlineScript(){for(let l of Array.from(this.host.children))if(ae(l)&&l.classList.contains(ne))return l;return null}parse(l){if(l?.trim())try{return JSON.parse(l)}catch{return}}};function y(c){return c?c.charAt(0).toUpperCase()+c.slice(1).toLowerCase():""}import{css as oe,html as U,nothing as se}from"lit";var K=oe`.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 V(c){let{items:l,active:r,onSelect:a,label:t,idPrefix:n,controls:e=!1}=c;return U`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${s=>{if(s.key!=="ArrowRight"&&s.key!=="ArrowLeft")return;s.preventDefault();let p=l.findIndex(w=>w.id===r);if(p===-1)return;let g=s.key==="ArrowRight"?1:-1,x=l[(p+g+l.length)%l.length];if(!x)return;a(x.id);let b=s.currentTarget.getRootNode();requestAnimationFrame(()=>{b.querySelector(`#${n}-tab-${x.id}`)?.focus()})}}">${l.map(s=>U`<button type="button" class="roxy-tab" role="tab" id="${n}-tab-${s.id}" aria-selected="${r===s.id?"true":"false"}" aria-controls="${e&&r===s.id?`${n}-panel-${s.id}`:se}" tabindex="${r===s.id?"0":"-1"}" @click="${()=>a(s.id)}">${s.label}</button>`)}</div>`}var D=420,i=D/2,A=164,_=146,P=120,S=96,pe=178,me=196,v=class extends le{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new M(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let r=this.data?.midheaven?.longitude;return typeof r=="number"?r:null}toAngle(r){return 180+this.getAscendant()-r}render(){if(!this.data)return d`<div class="roxy-empty" role="status">No chart data</div>`;let r=this.getPlanets(),a=this.data.aspects??[],t=this.view;return d`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?d`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:u}</header>${V({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:n=>{this.view=n},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(r,a):this.renderAspectGrid(r,a)}</div><div class="legend"><span>${r.length} planets</span> <span>${a.length} aspects</span> ${this.data.houseSystem?d`<span>${this.data.houseSystem} houses</span>`:u} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(r,a){return d`<svg viewBox="0 0 ${D} ${D}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${i}" cy="${i}" r="${A}" stroke-width="1.5"/><circle class="wheel-line" cx="${i}" cy="${i}" r="${_-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${i}" cy="${i}" r="${P}" stroke-width="1"/><circle class="wheel-line" cx="${i}" cy="${i}" r="${S-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(r,a)} ${this.renderPlanets(r)} ${this.renderAngles()}</svg>`}renderAspectGrid(r,a){let t=r.map(e=>y(e.name)),n=new Map;for(let e of a){let o=[y(e.planet1),y(e.planet2)].sort().join("|");n.set(o,e)}return t.length===0?d`<p class="roxy-empty" role="status">No planets to grid</p>`:d`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(e=>{let o=$[e]??e.slice(0,2);return d`<th scope="col" title="${e}">${o}</th>`})}</tr></thead><tbody>${t.slice(1).map((e,o)=>{let s=$[e]??e.slice(0,2);return d`<tr><th scope="row" title="${e}">${s}</th>${t.slice(0,o+1).map(p=>{let g=n.get([e,p].sort().join("|"));if(!g)return d`<td class="empty"></td>`;let x=I(g),b=R[x]??R[x.replace(/-/g,"")]??x.slice(0,3),w=z[x]??"aspect-other",T=E(g.orb,1);return d`<td class="${`cell ${w}`}" title="${`${e} ${x} ${p}${T?` (orb ${T}\xB0)`:""}`}"><span class="asp">${b}</span></td>`})} ${t.slice(o+1,-1).map(()=>d`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let r=this.getAscendant(),a=this.getMidheaven(),t=[this.renderAngleMark(r,"ASC"),this.renderAngleMark(C(r),"DSC")];a!==null&&(t.push(this.renderAngleMark(a,"MC")),t.push(this.renderAngleMark(C(a),"IC")));let n=this.data?.partOfFortune?.longitude;typeof n=="number"&&t.push(this.renderAngleMark(f(n),"PoF"));let e=this.data?.vertex?.longitude;return typeof e=="number"&&t.push(this.renderAngleMark(f(e),"Vtx")),t}renderAngleMark(r,a){let t=this.toAngle(r),n=m(i,i,A,t),e=m(i,i,pe,t),o=m(i,i,me,t);return h`<g><line class="angle-tick" x1="${n.x}" y1="${n.y}" x2="${e.x}" y2="${e.y}"><text class="angle-marker" x="${o.x}" y="${o.y}" text-anchor="middle" dominant-baseline="central">${a}</text></g>`}renderSpokes(){let r=this.data?.houses??[];return(r.length===12?r.map(t=>t.longitude):Array.from({length:12},(t,n)=>this.getAscendant()+n*30)).map(t=>{let n=this.toAngle(t),e=m(i,i,P,n),o=m(i,i,A,n);return h`<line class="wheel-line" x1="${e.x}" y1="${e.y}" x2="${o.x}" y2="${o.y}" stroke-width="0.8">`})}renderSigns(){return k.map((r,a)=>{let t=this.toAngle(a*30+15),n=m(i,i,_,t);return h`<text class="sign-glyph" x="${n.x}" y="${n.y}" text-anchor="middle" dominant-baseline="central">${j[r]}</text>`})}renderHouseNumbers(){let r=this.data?.houses??[];if(r.length===12)return r.map((t,n)=>{let e=r[(n+1)%12],o=B(t.longitude,e?e.longitude:t.longitude+30),s=m(i,i,P-12,this.toAngle(o));return h`<text class="house-num" x="${s.x}" y="${s.y}" text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let a=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,n)=>{let e=this.toAngle(n*30+15),o=m(i,i,P-12,e),s=(n-a+12)%12+1;return h`<text class="house-num" x="${o.x}" y="${o.y}" text-anchor="middle" dominant-baseline="central">${s}</text>`})}renderTicks(){let r=[];for(let a=0;a<360;a+=5){let t=this.toAngle(a),n=a%30===0,e=n?_-14:A-5,o=m(i,i,e,t),s=m(i,i,A,t);r.push(h`<line class="${n?"tick tick-major":"tick"}" x1="${o.x}" y1="${o.y}" x2="${s.x}" y2="${s.y}" stroke-width="${n?1:.5}">`)}return r}renderCuspDegrees(){let r=this.data?.houses??[];return r.length!==12?u:r.map(a=>{let t=this.toAngle(a.longitude),n=m(i,i,P+9,t),e=N(a.longitude);return h`<text class="cusp-deg" x="${n.x}" y="${n.y}" text-anchor="middle" dominant-baseline="central">${e.degree}°${String(e.minute).padStart(2,"0")}'</text>`})}renderPlanets(r){let t=r.filter(e=>Number.isFinite(e.longitude)).map(e=>({p:e,trueLon:f(e.longitude),displayLon:f(e.longitude)})).sort((e,o)=>e.trueLon-o.trueLon);for(let e=1;e<t.length;e++){let o=t[e-1],s=t[e];if(!o||!s)continue;let p=o.displayLon+7;s.displayLon<p&&(s.displayLon=p)}let n=t[t.length-1];if(n&&n.displayLon>360){let e=n.displayLon-360;for(let o of t)o.displayLon-=e}return t.map(({p:e,trueLon:o,displayLon:s})=>{let p=this.toAngle(o),g=this.toAngle(s),x=m(i,i,S,g),b=m(i,i,S-13,g),w=m(i,i,A-4,p),T=m(i,i,S+8,g),W=$[y(e.name)]??e.name.slice(0,2),G=N(e.longitude),H=e.isRetrograde===!0,O=`${G.degree}\xB0${String(G.minute).padStart(2,"0")}'`,Z=Math.abs(s-o)>.5;return h`<g>${Z?h`<line class="planet-leader" x1="${w.x}" y1="${w.y}" x2="${T.x}" y2="${T.y}">`:u}<text class="planet-glyph" x="${x.x}" y="${x.y}" text-anchor="middle" dominant-baseline="central"><title>${e.name}${H?" retrograde":""} - ${O} ${e.sign??""}</title>${W}</text><text class="planet-deg" x="${b.x}" y="${b.y}" text-anchor="middle" dominant-baseline="central">${O}${H?h`<tspan class="retro">℞</tspan>`:u}</text></g>`})}renderDetails(){let r=this.data?.summary,a=this.data?.aspectsInterpretation;if(!r&&!a)return u;let t=r?.retrogradePlanets??[];return d`<div class="details">${r?.dominantElement||r?.dominantModality?d`<div class="pill-row">${r.dominantElement?d`<span class="pill">Dominant element: ${r.dominantElement}</span>`:u} ${r.dominantModality?d`<span class="pill">Dominant modality: ${r.dominantModality}</span>`:u}</div>`:u} ${a?d`<div class="pill-row"><span class="pill pill--success">Harmonious ${a.harmonious}</span> <span class="pill pill--danger">Challenging ${a.challenging}</span> <span class="pill pill--muted">Neutral ${a.neutral}</span></div>`:u} ${t.length>0?d`<div class="pill-row">${t.map(n=>{let e=$[n]??n.slice(0,2);return d`<span class="pill pill--muted">${e} ${n} R</span>`})}</div>`:u} ${a?.summary?d`<p class="summary">${a.summary}</p>`:u} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let r=this.getPlanets();if(r.length===0)return u;let a=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],n=k,e={};for(let o of a)e[o]={Cardinal:[],Fixed:[],Mutable:[]};for(let o of r){let s=n.indexOf(y(o.sign??""));if(s<0)continue;let p=a[s%4],g=t[s%3],x=$[y(o.name)]??y(o.name).slice(0,2);e[p]?.[g]?.push(x)}return d`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(o=>d`<th scope="col">${o.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${a.map(o=>{let s=t.reduce((p,g)=>p+(e[o]?.[g]?.length??0),0);return d`<tr><th scope="row">${o}</th>${t.map(p=>d`<td>${(e[o]?.[p]??[]).join(" ")}</td>`)}<td class="em-total">${s}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(o=>d`<td class="em-total">${a.reduce((s,p)=>s+(e[p]?.[o]?.length??0),0)}</td>`)}<td class="em-total">${r.length}</td></tr></tbody></table>`}renderInterpretations(){let r=this.getPlanets().filter(a=>a.interpretation);return r.length===0?u:d`<section class="interpretations"><h3>Planet readings</h3>${r.map((a,t)=>{let n=a.interpretation,e=$[y(a.name)]??"",o=E(a.degree??0,1);return d`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${e} ${a.name}</span> <span class="interp-aside"><small>${a.sign??""} ${o}</small> ${F()}</span></summary><div class="interp-body">${n.summary?d`<p class="interp-summary">${n.summary}</p>`:u} ${n.detailed?d`<p class="interp-detail">${n.detailed}</p>`:u} ${n.keywords?.length?d`<div class="interp-keywords">${n.keywords.map(s=>d`<span class="kw">${s}</span>`)}</div>`:u}</div></details>`})}</section>`}renderAspects(r,a){let t=new Map;for(let n of r){if(typeof n.longitude!="number")continue;let e=y(n.name);e&&t.set(e,n.longitude)}return a.map(n=>{let e=t.get(y(n.planet1)),o=t.get(y(n.planet2));if(e===void 0||o===void 0)return u;let s=m(i,i,S-18,this.toAngle(e)),p=m(i,i,S-18,this.toAngle(o)),g=I(n),x=z[g]??"aspect-other",b=E(n.orb,1);return h`<line class="${`aspect ${x}`}" x1="${s.x}" y1="${s.y}" x2="${p.x}" y2="${p.y}"><title>${n.planet1} ${g||""} ${n.planet2}${b?` (orb ${b}\xB0)`:""}</title></line>`})}};v.styles=[q,K,Y,ie`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-fg,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-fg,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-fg,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-fg,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-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)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.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}`],L([J({attribute:!1})],v.prototype,"data",2),L([J({type:String,attribute:"house-system",reflect:!0})],v.prototype,"houseSystem",2),L([de()],v.prototype,"view",2),v=L([ce("roxy-natal-chart")],v);export{v as RoxyNatalChart};
|
|
1087
2
|
//# sourceMappingURL=natal-chart.js.map
|