@roxyapi/ui 0.0.1 → 0.1.2
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/AGENTS.md +169 -0
- package/LICENSE +21 -0
- package/README.md +198 -0
- package/THEMING.md +129 -0
- package/dist/cdn/components/biorhythm-chart.js +261 -0
- package/dist/cdn/components/biorhythm-chart.js.map +7 -0
- package/dist/cdn/components/compatibility-card.js +257 -0
- package/dist/cdn/components/compatibility-card.js.map +7 -0
- package/dist/cdn/components/dasha-timeline.js +244 -0
- package/dist/cdn/components/dasha-timeline.js.map +7 -0
- package/dist/cdn/components/data.js +258 -0
- package/dist/cdn/components/data.js.map +7 -0
- package/dist/cdn/components/dosha-card.js +254 -0
- package/dist/cdn/components/dosha-card.js.map +7 -0
- package/dist/cdn/components/endpoint-form.js +253 -0
- package/dist/cdn/components/endpoint-form.js.map +7 -0
- package/dist/cdn/components/guna-milan.js +256 -0
- package/dist/cdn/components/guna-milan.js.map +7 -0
- package/dist/cdn/components/hexagram.js +275 -0
- package/dist/cdn/components/hexagram.js.map +7 -0
- package/dist/cdn/components/horoscope-card.js +302 -0
- package/dist/cdn/components/horoscope-card.js.map +7 -0
- package/dist/cdn/components/kp-planets-table.js +224 -0
- package/dist/cdn/components/kp-planets-table.js.map +7 -0
- package/dist/cdn/components/location-search.js +267 -0
- package/dist/cdn/components/location-search.js.map +7 -0
- package/dist/cdn/components/moon-phase.js +251 -0
- package/dist/cdn/components/moon-phase.js.map +7 -0
- package/dist/cdn/components/natal-chart.js +237 -0
- package/dist/cdn/components/natal-chart.js.map +7 -0
- package/dist/cdn/components/numerology-card.js +252 -0
- package/dist/cdn/components/numerology-card.js.map +7 -0
- package/dist/cdn/components/panchang-table.js +234 -0
- package/dist/cdn/components/panchang-table.js.map +7 -0
- package/dist/cdn/components/synastry-chart.js +303 -0
- package/dist/cdn/components/synastry-chart.js.map +7 -0
- package/dist/cdn/components/tarot-card.js +260 -0
- package/dist/cdn/components/tarot-card.js.map +7 -0
- package/dist/cdn/components/tarot-spread.js +261 -0
- package/dist/cdn/components/tarot-spread.js.map +7 -0
- package/dist/cdn/components/vedic-kundli.js +189 -0
- package/dist/cdn/components/vedic-kundli.js.map +7 -0
- package/dist/cdn/roxy-ui.js +2552 -0
- package/dist/cdn/roxy-ui.js.map +7 -0
- package/dist/cdn/widgets.js +114 -0
- package/dist/components/biorhythm-chart.d.ts +66 -0
- package/dist/components/biorhythm-chart.d.ts.map +1 -0
- package/dist/components/biorhythm-chart.js +318 -0
- package/dist/components/biorhythm-chart.js.map +7 -0
- package/dist/components/compatibility-card.d.ts +46 -0
- package/dist/components/compatibility-card.d.ts.map +1 -0
- package/dist/components/compatibility-card.js +279 -0
- package/dist/components/compatibility-card.js.map +7 -0
- package/dist/components/dasha-timeline.d.ts +53 -0
- package/dist/components/dasha-timeline.d.ts.map +1 -0
- package/dist/components/dasha-timeline.js +269 -0
- package/dist/components/dasha-timeline.js.map +7 -0
- package/dist/components/data.d.ts +40 -0
- package/dist/components/data.d.ts.map +1 -0
- package/dist/components/data.js +339 -0
- package/dist/components/data.js.map +7 -0
- package/dist/components/dosha-card.d.ts +35 -0
- package/dist/components/dosha-card.d.ts.map +1 -0
- package/dist/components/dosha-card.js +278 -0
- package/dist/components/dosha-card.js.map +7 -0
- package/dist/components/endpoint-form.d.ts +39 -0
- package/dist/components/endpoint-form.d.ts.map +1 -0
- package/dist/components/endpoint-form.js +432 -0
- package/dist/components/endpoint-form.js.map +7 -0
- package/dist/components/guna-milan.d.ts +35 -0
- package/dist/components/guna-milan.d.ts.map +1 -0
- package/dist/components/guna-milan.js +302 -0
- package/dist/components/guna-milan.js.map +7 -0
- package/dist/components/hexagram.d.ts +47 -0
- package/dist/components/hexagram.d.ts.map +1 -0
- package/dist/components/hexagram.js +334 -0
- package/dist/components/hexagram.js.map +7 -0
- package/dist/components/horoscope-card.d.ts +38 -0
- package/dist/components/horoscope-card.d.ts.map +1 -0
- package/dist/components/horoscope-card.js +332 -0
- package/dist/components/horoscope-card.js.map +7 -0
- package/dist/components/kp-planets-table.d.ts +36 -0
- package/dist/components/kp-planets-table.d.ts.map +1 -0
- package/dist/components/kp-planets-table.js +227 -0
- package/dist/components/kp-planets-table.js.map +7 -0
- package/dist/components/location-search.d.ts +56 -0
- package/dist/components/location-search.d.ts.map +1 -0
- package/dist/components/location-search.js +401 -0
- package/dist/components/location-search.js.map +7 -0
- package/dist/components/moon-phase.d.ts +38 -0
- package/dist/components/moon-phase.d.ts.map +1 -0
- package/dist/components/moon-phase.js +284 -0
- package/dist/components/moon-phase.js.map +7 -0
- package/dist/components/natal-chart.d.ts +65 -0
- package/dist/components/natal-chart.d.ts.map +1 -0
- package/dist/components/natal-chart.js +407 -0
- package/dist/components/natal-chart.js.map +7 -0
- package/dist/components/numerology-card.d.ts +55 -0
- package/dist/components/numerology-card.d.ts.map +1 -0
- package/dist/components/numerology-card.js +274 -0
- package/dist/components/numerology-card.js.map +7 -0
- package/dist/components/panchang-table.d.ts +77 -0
- package/dist/components/panchang-table.d.ts.map +1 -0
- package/dist/components/panchang-table.js +285 -0
- package/dist/components/panchang-table.js.map +7 -0
- package/dist/components/synastry-chart.d.ts +52 -0
- package/dist/components/synastry-chart.d.ts.map +1 -0
- package/dist/components/synastry-chart.js +415 -0
- package/dist/components/synastry-chart.js.map +7 -0
- package/dist/components/tarot-card.d.ts +47 -0
- package/dist/components/tarot-card.d.ts.map +1 -0
- package/dist/components/tarot-card.js +281 -0
- package/dist/components/tarot-card.js.map +7 -0
- package/dist/components/tarot-spread.d.ts +42 -0
- package/dist/components/tarot-spread.d.ts.map +1 -0
- package/dist/components/tarot-spread.js +271 -0
- package/dist/components/tarot-spread.js.map +7 -0
- package/dist/components/vedic-kundli.d.ts +45 -0
- package/dist/components/vedic-kundli.d.ts.map +1 -0
- package/dist/components/vedic-kundli.js +325 -0
- package/dist/components/vedic-kundli.js.map +7 -0
- package/dist/index.cjs +4174 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4154 -0
- package/dist/index.js.map +7 -0
- package/dist/manifest.json +24 -0
- package/dist/styles/tokens.css +147 -0
- package/dist/tokens/index.d.ts +17 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/utils/base-styles.d.ts +6 -0
- package/dist/utils/base-styles.d.ts.map +1 -0
- package/dist/utils/debounce.d.ts +5 -0
- package/dist/utils/debounce.d.ts.map +1 -0
- package/dist/utils/degree.d.ts +29 -0
- package/dist/utils/degree.d.ts.map +1 -0
- package/dist/utils/motion.d.ts +13 -0
- package/dist/utils/motion.d.ts.map +1 -0
- package/package.json +71 -3
- package/src/components/biorhythm-chart.ts +290 -0
- package/src/components/compatibility-card.ts +231 -0
- package/src/components/dasha-timeline.ts +251 -0
- package/src/components/data.ts +287 -0
- package/src/components/dosha-card.ts +215 -0
- package/src/components/endpoint-form.ts +433 -0
- package/src/components/guna-milan.ts +245 -0
- package/src/components/hexagram.ts +279 -0
- package/src/components/horoscope-card.ts +291 -0
- package/src/components/kp-planets-table.ts +156 -0
- package/src/components/location-search.ts +335 -0
- package/src/components/moon-phase.ts +221 -0
- package/src/components/natal-chart.ts +298 -0
- package/src/components/numerology-card.ts +243 -0
- package/src/components/panchang-table.ts +265 -0
- package/src/components/synastry-chart.ts +341 -0
- package/src/components/tarot-card.ts +235 -0
- package/src/components/tarot-spread.ts +224 -0
- package/src/components/vedic-kundli.ts +257 -0
- package/src/index.ts +61 -0
- package/src/styles/tokens.css +147 -0
- package/src/tokens/index.ts +130 -0
- package/src/types/index.ts +3 -0
- package/src/types/types.gen.ts +28526 -0
- package/src/utils/base-styles.ts +89 -0
- package/src/utils/debounce.ts +13 -0
- package/src/utils/degree.ts +64 -0
- package/src/utils/motion.ts +18 -0
|
@@ -0,0 +1,407 @@
|
|
|
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 } 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
|
+
};
|
|
36
|
+
var SIGN_GLYPH = {
|
|
37
|
+
Aries: "\u2648",
|
|
38
|
+
Taurus: "\u2649",
|
|
39
|
+
Gemini: "\u264A",
|
|
40
|
+
Cancer: "\u264B",
|
|
41
|
+
Leo: "\u264C",
|
|
42
|
+
Virgo: "\u264D",
|
|
43
|
+
Libra: "\u264E",
|
|
44
|
+
Scorpio: "\u264F",
|
|
45
|
+
Sagittarius: "\u2650",
|
|
46
|
+
Capricorn: "\u2651",
|
|
47
|
+
Aquarius: "\u2652",
|
|
48
|
+
Pisces: "\u2653"
|
|
49
|
+
};
|
|
50
|
+
var SIGNS_ORDER = [
|
|
51
|
+
"Aries",
|
|
52
|
+
"Taurus",
|
|
53
|
+
"Gemini",
|
|
54
|
+
"Cancer",
|
|
55
|
+
"Leo",
|
|
56
|
+
"Virgo",
|
|
57
|
+
"Libra",
|
|
58
|
+
"Scorpio",
|
|
59
|
+
"Sagittarius",
|
|
60
|
+
"Capricorn",
|
|
61
|
+
"Aquarius",
|
|
62
|
+
"Pisces"
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
// packages/ui/src/utils/base-styles.ts
|
|
66
|
+
import { css } from "lit";
|
|
67
|
+
var baseStyles = css`
|
|
68
|
+
:host {
|
|
69
|
+
display: block;
|
|
70
|
+
container-type: inline-size;
|
|
71
|
+
font-family: var(
|
|
72
|
+
--roxy-font-sans,
|
|
73
|
+
system-ui,
|
|
74
|
+
-apple-system,
|
|
75
|
+
BlinkMacSystemFont,
|
|
76
|
+
'Segoe UI',
|
|
77
|
+
Roboto,
|
|
78
|
+
sans-serif
|
|
79
|
+
);
|
|
80
|
+
color: var(--roxy-fg, #0a0a0a);
|
|
81
|
+
background: transparent;
|
|
82
|
+
font-size: var(--roxy-text-base, 1rem);
|
|
83
|
+
line-height: var(--roxy-leading-normal, 1.5);
|
|
84
|
+
animation: roxy-fade-in var(--roxy-motion-duration, 200ms)
|
|
85
|
+
var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
*,
|
|
89
|
+
*::before,
|
|
90
|
+
*::after {
|
|
91
|
+
box-sizing: border-box;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@keyframes roxy-fade-in {
|
|
95
|
+
from {
|
|
96
|
+
opacity: 0;
|
|
97
|
+
transform: translateY(2px);
|
|
98
|
+
}
|
|
99
|
+
to {
|
|
100
|
+
opacity: 1;
|
|
101
|
+
transform: translateY(0);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@media (prefers-reduced-motion: reduce) {
|
|
106
|
+
:host {
|
|
107
|
+
animation: none;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.roxy-skeleton {
|
|
112
|
+
background: linear-gradient(
|
|
113
|
+
90deg,
|
|
114
|
+
var(--roxy-border, #e4e4e7) 0%,
|
|
115
|
+
color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,
|
|
116
|
+
var(--roxy-border, #e4e4e7) 100%
|
|
117
|
+
);
|
|
118
|
+
background-size: 200% 100%;
|
|
119
|
+
animation: roxy-shimmer 1.4s ease-in-out infinite;
|
|
120
|
+
border-radius: var(--roxy-radius-md, 8px);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@keyframes roxy-shimmer {
|
|
124
|
+
0% {
|
|
125
|
+
background-position: 200% 0;
|
|
126
|
+
}
|
|
127
|
+
100% {
|
|
128
|
+
background-position: -200% 0;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@media (prefers-reduced-motion: reduce) {
|
|
133
|
+
.roxy-skeleton {
|
|
134
|
+
animation: none;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.roxy-empty {
|
|
139
|
+
padding: var(--roxy-space-lg, 1.5rem);
|
|
140
|
+
color: var(--roxy-muted, #71717a);
|
|
141
|
+
text-align: center;
|
|
142
|
+
font-size: var(--roxy-text-sm, 0.875rem);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
:host(:focus-within) .roxy-card {
|
|
146
|
+
outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
|
|
147
|
+
outline-offset: 2px;
|
|
148
|
+
}
|
|
149
|
+
`;
|
|
150
|
+
|
|
151
|
+
// packages/ui/src/utils/degree.ts
|
|
152
|
+
function normalizeLongitude(lon) {
|
|
153
|
+
const wrapped = lon % 360;
|
|
154
|
+
return wrapped < 0 ? wrapped + 360 : wrapped;
|
|
155
|
+
}
|
|
156
|
+
function longitudeToSignPosition(longitude) {
|
|
157
|
+
const lon = normalizeLongitude(longitude);
|
|
158
|
+
const signIndex = Math.floor(lon / 30) % 12;
|
|
159
|
+
const within = lon % 30;
|
|
160
|
+
const degree = Math.floor(within);
|
|
161
|
+
const minuteFloat = (within - degree) * 60;
|
|
162
|
+
const minute = Math.floor(minuteFloat);
|
|
163
|
+
const second = Math.round((minuteFloat - minute) * 60);
|
|
164
|
+
return {
|
|
165
|
+
sign: SIGNS_ORDER[signIndex] ?? "Aries",
|
|
166
|
+
signIndex,
|
|
167
|
+
degree,
|
|
168
|
+
minute,
|
|
169
|
+
second
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function polarToCartesian(cx, cy, radius, angleDeg) {
|
|
173
|
+
const angleRad = angleDeg * Math.PI / 180;
|
|
174
|
+
return {
|
|
175
|
+
x: cx + radius * Math.cos(angleRad),
|
|
176
|
+
y: cy + radius * Math.sin(angleRad)
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// packages/ui/src/components/natal-chart.ts
|
|
181
|
+
var SIZE = 320;
|
|
182
|
+
var CENTER = SIZE / 2;
|
|
183
|
+
var OUTER_R = 150;
|
|
184
|
+
var SIGN_R = 134;
|
|
185
|
+
var HOUSE_R = 110;
|
|
186
|
+
var PLANET_R = 88;
|
|
187
|
+
var RoxyNatalChart = class extends LitElement {
|
|
188
|
+
constructor() {
|
|
189
|
+
super(...arguments);
|
|
190
|
+
this.data = null;
|
|
191
|
+
this.houseSystem = "placidus";
|
|
192
|
+
}
|
|
193
|
+
getPlanets() {
|
|
194
|
+
const p = this.data?.planets;
|
|
195
|
+
if (!p) return [];
|
|
196
|
+
if (Array.isArray(p)) return p;
|
|
197
|
+
return Object.entries(p).map(([name, entry]) => ({ ...entry, name }));
|
|
198
|
+
}
|
|
199
|
+
render() {
|
|
200
|
+
if (!this.data)
|
|
201
|
+
return html`<div class="roxy-empty" role="status">No chart data</div>`;
|
|
202
|
+
const planets = this.getPlanets();
|
|
203
|
+
const aspects = this.data.aspects ?? [];
|
|
204
|
+
return html`<div class="wrap">
|
|
205
|
+
<header>
|
|
206
|
+
<h2 class="title">Natal chart</h2>
|
|
207
|
+
${this.data.birthDetails ? html`<div class="meta">
|
|
208
|
+
${[
|
|
209
|
+
this.data.birthDetails.date,
|
|
210
|
+
this.data.birthDetails.time,
|
|
211
|
+
this.data.birthDetails.location
|
|
212
|
+
].filter(Boolean).join(" \xB7 ")}
|
|
213
|
+
</div>` : nothing}
|
|
214
|
+
</header>
|
|
215
|
+
<svg
|
|
216
|
+
viewBox="0 0 ${SIZE} ${SIZE}"
|
|
217
|
+
role="img"
|
|
218
|
+
aria-label="Natal chart wheel with twelve houses, planets, and aspects"
|
|
219
|
+
>
|
|
220
|
+
<title>Natal chart wheel</title>
|
|
221
|
+
<desc>
|
|
222
|
+
Twelve zodiac sign segments around a circular wheel. Planet glyphs are
|
|
223
|
+
placed at their ecliptic longitudes. Aspect lines connect related planets.
|
|
224
|
+
</desc>
|
|
225
|
+
<circle
|
|
226
|
+
class="wheel-line"
|
|
227
|
+
cx=${CENTER}
|
|
228
|
+
cy=${CENTER}
|
|
229
|
+
r=${OUTER_R}
|
|
230
|
+
stroke-width="1.5"
|
|
231
|
+
/>
|
|
232
|
+
<circle
|
|
233
|
+
class="wheel-line"
|
|
234
|
+
cx=${CENTER}
|
|
235
|
+
cy=${CENTER}
|
|
236
|
+
r=${HOUSE_R}
|
|
237
|
+
stroke-width="1"
|
|
238
|
+
/>
|
|
239
|
+
<circle
|
|
240
|
+
class="wheel-line"
|
|
241
|
+
cx=${CENTER}
|
|
242
|
+
cy=${CENTER}
|
|
243
|
+
r=${PLANET_R - 16}
|
|
244
|
+
stroke-width="0.5"
|
|
245
|
+
/>
|
|
246
|
+
${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()}
|
|
247
|
+
${this.renderAspects(planets, aspects)} ${this.renderPlanets(planets)}
|
|
248
|
+
</svg>
|
|
249
|
+
<div class="legend">
|
|
250
|
+
<span>${planets.length} planets</span>
|
|
251
|
+
<span>${aspects.length} aspects</span>
|
|
252
|
+
<span>House system: ${this.houseSystem}</span>
|
|
253
|
+
</div>
|
|
254
|
+
</div>`;
|
|
255
|
+
}
|
|
256
|
+
renderSpokes() {
|
|
257
|
+
return Array.from({ length: 12 }, (_, i) => {
|
|
258
|
+
const angle = i * 30 - 90;
|
|
259
|
+
const start = polarToCartesian(CENTER, CENTER, HOUSE_R, angle);
|
|
260
|
+
const end = polarToCartesian(CENTER, CENTER, OUTER_R, angle);
|
|
261
|
+
return svg`<line class="wheel-line" x1=${start.x} y1=${start.y} x2=${end.x} y2=${end.y} stroke-width="0.8" />`;
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
renderSigns() {
|
|
265
|
+
const order = [
|
|
266
|
+
"Aries",
|
|
267
|
+
"Taurus",
|
|
268
|
+
"Gemini",
|
|
269
|
+
"Cancer",
|
|
270
|
+
"Leo",
|
|
271
|
+
"Virgo",
|
|
272
|
+
"Libra",
|
|
273
|
+
"Scorpio",
|
|
274
|
+
"Sagittarius",
|
|
275
|
+
"Capricorn",
|
|
276
|
+
"Aquarius",
|
|
277
|
+
"Pisces"
|
|
278
|
+
];
|
|
279
|
+
return order.map((sign, i) => {
|
|
280
|
+
const angle = i * 30 + 15 - 90;
|
|
281
|
+
const pos = polarToCartesian(CENTER, CENTER, SIGN_R, angle);
|
|
282
|
+
return svg`<text class="sign-glyph" x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central">${SIGN_GLYPH[sign]}</text>`;
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
renderHouseNumbers() {
|
|
286
|
+
return Array.from({ length: 12 }, (_, i) => {
|
|
287
|
+
const angle = i * 30 + 15 - 90;
|
|
288
|
+
const pos = polarToCartesian(CENTER, CENTER, HOUSE_R - 12, angle);
|
|
289
|
+
return svg`<text class="house-num" x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central">${i + 1}</text>`;
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
renderPlanets(planets) {
|
|
293
|
+
return planets.map((p) => {
|
|
294
|
+
const lon = typeof p.longitude === "number" ? p.longitude : typeof p.degree === "number" ? p.degree : NaN;
|
|
295
|
+
if (!Number.isFinite(lon)) return nothing;
|
|
296
|
+
const angle = lon - 90;
|
|
297
|
+
const pos = polarToCartesian(CENTER, CENTER, PLANET_R, angle);
|
|
298
|
+
const name = p.name ?? p.planet ?? "";
|
|
299
|
+
const glyph = PLANET_GLYPH[capitalize(name)] ?? name.slice(0, 2);
|
|
300
|
+
const retro = p.retrograde || p.isRetrograde ? " R" : "";
|
|
301
|
+
return svg`<text class="planet-glyph" x=${pos.x} y=${pos.y} text-anchor="middle" dominant-baseline="central"><title>${name}${retro}</title>${glyph}</text>`;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
renderAspects(planets, aspects) {
|
|
305
|
+
const planetMap = /* @__PURE__ */ new Map();
|
|
306
|
+
for (const p of planets) {
|
|
307
|
+
const lon = typeof p.longitude === "number" ? p.longitude : typeof p.degree === "number" ? p.degree : null;
|
|
308
|
+
if (lon === null) continue;
|
|
309
|
+
const name = capitalize(p.name ?? p.planet ?? "");
|
|
310
|
+
if (name) planetMap.set(name, lon);
|
|
311
|
+
}
|
|
312
|
+
return aspects.map((a) => {
|
|
313
|
+
const l1 = planetMap.get(capitalize(a.planet1 ?? ""));
|
|
314
|
+
const l2 = planetMap.get(capitalize(a.planet2 ?? ""));
|
|
315
|
+
if (l1 === void 0 || l2 === void 0) return nothing;
|
|
316
|
+
const p1 = polarToCartesian(CENTER, CENTER, PLANET_R - 18, l1 - 90);
|
|
317
|
+
const p2 = polarToCartesian(CENTER, CENTER, PLANET_R - 18, l2 - 90);
|
|
318
|
+
return svg`<line class="aspect" x1=${p1.x} y1=${p1.y} x2=${p2.x} y2=${p2.y} />`;
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
RoxyNatalChart.styles = [
|
|
323
|
+
baseStyles,
|
|
324
|
+
css2`
|
|
325
|
+
.wrap {
|
|
326
|
+
width: 100%;
|
|
327
|
+
display: grid;
|
|
328
|
+
gap: var(--roxy-space-md, 1rem);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.title {
|
|
332
|
+
font-size: var(--roxy-text-lg, 1.125rem);
|
|
333
|
+
font-weight: var(--roxy-weight-bold, 600);
|
|
334
|
+
margin: 0;
|
|
335
|
+
color: var(--roxy-primary, #0f172a);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.meta {
|
|
339
|
+
color: var(--roxy-muted, #71717a);
|
|
340
|
+
font-size: var(--roxy-text-sm, 0.875rem);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
svg {
|
|
344
|
+
display: block;
|
|
345
|
+
width: 100%;
|
|
346
|
+
max-width: 360px;
|
|
347
|
+
height: auto;
|
|
348
|
+
margin: 0 auto;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
.wheel-line {
|
|
352
|
+
fill: none;
|
|
353
|
+
stroke: var(--roxy-border, #e4e4e7);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.sign-glyph {
|
|
357
|
+
fill: var(--roxy-secondary, #475569);
|
|
358
|
+
font-size: 14px;
|
|
359
|
+
font-family: var(--roxy-font-sans);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.planet-glyph {
|
|
363
|
+
fill: var(--roxy-accent, #f59e0b);
|
|
364
|
+
font-size: 14px;
|
|
365
|
+
font-weight: 600;
|
|
366
|
+
font-family: var(--roxy-font-sans);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.house-num {
|
|
370
|
+
fill: var(--roxy-muted, #71717a);
|
|
371
|
+
font-size: 9px;
|
|
372
|
+
font-family: var(--roxy-font-sans);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.aspect {
|
|
376
|
+
stroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 32%, transparent);
|
|
377
|
+
stroke-width: 0.6;
|
|
378
|
+
fill: none;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.legend {
|
|
382
|
+
font-size: var(--roxy-text-xs, 0.75rem);
|
|
383
|
+
color: var(--roxy-muted, #71717a);
|
|
384
|
+
display: flex;
|
|
385
|
+
flex-wrap: wrap;
|
|
386
|
+
gap: var(--roxy-space-md, 1rem);
|
|
387
|
+
}
|
|
388
|
+
`
|
|
389
|
+
];
|
|
390
|
+
__decorateClass([
|
|
391
|
+
property({ attribute: false })
|
|
392
|
+
], RoxyNatalChart.prototype, "data", 2);
|
|
393
|
+
__decorateClass([
|
|
394
|
+
property({ type: String, attribute: "house-system", reflect: true })
|
|
395
|
+
], RoxyNatalChart.prototype, "houseSystem", 2);
|
|
396
|
+
RoxyNatalChart = __decorateClass([
|
|
397
|
+
customElement("roxy-natal-chart")
|
|
398
|
+
], RoxyNatalChart);
|
|
399
|
+
function capitalize(s) {
|
|
400
|
+
if (!s) return "";
|
|
401
|
+
return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
|
|
402
|
+
}
|
|
403
|
+
export {
|
|
404
|
+
RoxyNatalChart,
|
|
405
|
+
longitudeToSignPosition
|
|
406
|
+
};
|
|
407
|
+
//# sourceMappingURL=natal-chart.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/natal-chart.ts", "../../src/tokens/index.ts", "../../src/utils/base-styles.ts", "../../src/utils/degree.ts"],
|
|
4
|
+
"sourcesContent": ["import { css, html, LitElement, nothing, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_GLYPH, SIGN_GLYPH } from '../tokens/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { longitudeToSignPosition, polarToCartesian } from '../utils/degree.js';\n\ninterface PlanetEntry {\n\tname?: string;\n\tplanet?: string;\n\tlongitude?: number;\n\tdegree?: number;\n\tsign?: string;\n\thouse?: number;\n\tretrograde?: boolean;\n\tisRetrograde?: boolean;\n}\n\ninterface AspectEntry {\n\tplanet1?: string;\n\tplanet2?: string;\n\taspect?: string;\n\torb?: number;\n}\n\ninterface HouseEntry {\n\thouse?: number;\n\tnumber?: number;\n\tcusp?: number;\n\tsign?: string;\n}\n\ninterface NatalChartData {\n\tplanets?: PlanetEntry[] | Record<string, PlanetEntry>;\n\thouses?: HouseEntry[];\n\taspects?: AspectEntry[];\n\tascendant?: number | { longitude?: number; sign?: string };\n\tmidheaven?: number | { longitude?: number; sign?: string };\n\tbirthDetails?: {\n\t\tdate?: string;\n\t\ttime?: string;\n\t\tlocation?: string;\n\t};\n}\n\nconst SIZE = 320;\nconst CENTER = SIZE / 2;\nconst OUTER_R = 150;\nconst SIGN_R = 134;\nconst HOUSE_R = 110;\nconst PLANET_R = 88;\n\n/**\n * Western natal chart wheel. Renders the 12 zodiac signs, 12 houses, planet\n * markers, and aspect lines from a /astrology/natal-chart response.\n */\n@customElement('roxy-natal-chart')\nexport class RoxyNatalChart extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\twidth: 100%;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-primary, #0f172a);\n\t\t\t}\n\n\t\t\t.meta {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 360px;\n\t\t\t\theight: auto;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\n\t\t\t.wheel-line {\n\t\t\t\tfill: none;\n\t\t\t\tstroke: var(--roxy-border, #e4e4e7);\n\t\t\t}\n\n\t\t\t.sign-glyph {\n\t\t\t\tfill: var(--roxy-secondary, #475569);\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\n\t\t\t.planet-glyph {\n\t\t\t\tfill: var(--roxy-accent, #f59e0b);\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\n\t\t\t.house-num {\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\n\t\t\t.aspect {\n\t\t\t\tstroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 32%, transparent);\n\t\t\t\tstroke-width: 0.6;\n\t\t\t\tfill: none;\n\t\t\t}\n\n\t\t\t.legend {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: NatalChartData | null = null;\n\n\t@property({ type: String, attribute: 'house-system', reflect: true })\n\thouseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch' = 'placidus';\n\n\tprivate getPlanets(): PlanetEntry[] {\n\t\tconst p = this.data?.planets;\n\t\tif (!p) return [];\n\t\tif (Array.isArray(p)) return p;\n\t\treturn Object.entries(p).map(([name, entry]) => ({ ...entry, name }));\n\t}\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No chart data</div>`;\n\t\tconst planets = this.getPlanets();\n\t\tconst aspects = this.data.aspects ?? [];\n\n\t\treturn html`<div class=\"wrap\">\n\t\t\t<header>\n\t\t\t\t<h2 class=\"title\">Natal chart</h2>\n\t\t\t\t${\n\t\t\t\t\tthis.data.birthDetails\n\t\t\t\t\t\t? html`<div class=\"meta\">\n\t\t\t\t\t\t\t${[\n\t\t\t\t\t\t\t\tthis.data.birthDetails.date,\n\t\t\t\t\t\t\t\tthis.data.birthDetails.time,\n\t\t\t\t\t\t\t\tthis.data.birthDetails.location,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t.join(' \u00B7 ')}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</header>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 ${SIZE} ${SIZE}\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Natal chart wheel with twelve houses, planets, and aspects\"\n\t\t\t>\n\t\t\t\t<title>Natal chart wheel</title>\n\t\t\t\t<desc>\n\t\t\t\t\tTwelve zodiac sign segments around a circular wheel. Planet glyphs are\n\t\t\t\t\tplaced at their ecliptic longitudes. Aspect lines connect related planets.\n\t\t\t\t</desc>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${OUTER_R}\n\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${HOUSE_R}\n\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${PLANET_R - 16}\n\t\t\t\t\tstroke-width=\"0.5\"\n\t\t\t\t/>\n\t\t\t\t${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()}\n\t\t\t\t${this.renderAspects(planets, aspects)} ${this.renderPlanets(planets)}\n\t\t\t</svg>\n\t\t\t<div class=\"legend\">\n\t\t\t\t<span>${planets.length} planets</span>\n\t\t\t\t<span>${aspects.length} aspects</span>\n\t\t\t\t<span>House system: ${this.houseSystem}</span>\n\t\t\t</div>\n\t\t</div>`;\n\t}\n\n\tprivate renderSpokes() {\n\t\treturn Array.from({ length: 12 }, (_, i) => {\n\t\t\tconst angle = i * 30 - 90;\n\t\t\tconst start = polarToCartesian(CENTER, CENTER, HOUSE_R, angle);\n\t\t\tconst end = polarToCartesian(CENTER, CENTER, OUTER_R, angle);\n\t\t\treturn svg`<line class=\"wheel-line\" x1=${start.x} y1=${start.y} x2=${end.x} y2=${end.y} stroke-width=\"0.8\" />`;\n\t\t});\n\t}\n\n\tprivate renderSigns() {\n\t\tconst order = [\n\t\t\t'Aries',\n\t\t\t'Taurus',\n\t\t\t'Gemini',\n\t\t\t'Cancer',\n\t\t\t'Leo',\n\t\t\t'Virgo',\n\t\t\t'Libra',\n\t\t\t'Scorpio',\n\t\t\t'Sagittarius',\n\t\t\t'Capricorn',\n\t\t\t'Aquarius',\n\t\t\t'Pisces',\n\t\t];\n\t\treturn order.map((sign, i) => {\n\t\t\tconst angle = i * 30 + 15 - 90;\n\t\t\tconst pos = polarToCartesian(CENTER, CENTER, SIGN_R, angle);\n\t\t\treturn svg`<text class=\"sign-glyph\" x=${pos.x} y=${pos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${SIGN_GLYPH[sign]}</text>`;\n\t\t});\n\t}\n\n\tprivate renderHouseNumbers() {\n\t\treturn Array.from({ length: 12 }, (_, i) => {\n\t\t\tconst angle = i * 30 + 15 - 90;\n\t\t\tconst pos = polarToCartesian(CENTER, CENTER, HOUSE_R - 12, angle);\n\t\t\treturn svg`<text class=\"house-num\" x=${pos.x} y=${pos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${i + 1}</text>`;\n\t\t});\n\t}\n\n\tprivate renderPlanets(planets: PlanetEntry[]) {\n\t\treturn planets.map((p) => {\n\t\t\tconst lon =\n\t\t\t\ttypeof p.longitude === 'number'\n\t\t\t\t\t? p.longitude\n\t\t\t\t\t: typeof p.degree === 'number'\n\t\t\t\t\t\t? p.degree\n\t\t\t\t\t\t: NaN;\n\t\t\tif (!Number.isFinite(lon)) return nothing;\n\t\t\tconst angle = lon - 90;\n\t\t\tconst pos = polarToCartesian(CENTER, CENTER, PLANET_R, angle);\n\t\t\tconst name = p.name ?? p.planet ?? '';\n\t\t\tconst glyph = PLANET_GLYPH[capitalize(name)] ?? name.slice(0, 2);\n\t\t\tconst retro = p.retrograde || p.isRetrograde ? ' R' : '';\n\t\t\treturn svg`<text class=\"planet-glyph\" x=${pos.x} y=${pos.y} text-anchor=\"middle\" dominant-baseline=\"central\"><title>${name}${retro}</title>${glyph}</text>`;\n\t\t});\n\t}\n\n\tprivate renderAspects(planets: PlanetEntry[], aspects: AspectEntry[]) {\n\t\tconst planetMap = new Map<string, number>();\n\t\tfor (const p of planets) {\n\t\t\tconst lon =\n\t\t\t\ttypeof p.longitude === 'number'\n\t\t\t\t\t? p.longitude\n\t\t\t\t\t: typeof p.degree === 'number'\n\t\t\t\t\t\t? p.degree\n\t\t\t\t\t\t: null;\n\t\t\tif (lon === null) continue;\n\t\t\tconst name = capitalize(p.name ?? p.planet ?? '');\n\t\t\tif (name) planetMap.set(name, lon);\n\t\t}\n\t\treturn aspects.map((a) => {\n\t\t\tconst l1 = planetMap.get(capitalize(a.planet1 ?? ''));\n\t\t\tconst l2 = planetMap.get(capitalize(a.planet2 ?? ''));\n\t\t\tif (l1 === undefined || l2 === undefined) return nothing;\n\t\t\tconst p1 = polarToCartesian(CENTER, CENTER, PLANET_R - 18, l1 - 90);\n\t\t\tconst p2 = polarToCartesian(CENTER, CENTER, PLANET_R - 18, l2 - 90);\n\t\t\treturn svg`<line class=\"aspect\" x1=${p1.x} y1=${p1.y} x2=${p2.x} y2=${p2.y} />`;\n\t\t});\n\t}\n}\n\nfunction capitalize(s: string): string {\n\tif (!s) return '';\n\treturn s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-natal-chart': RoxyNatalChart;\n\t}\n}\n\n// Export for external use\nexport { longitudeToSignPosition };\n", "/**\n * Symbol constants used across components. Single source of truth so chart\n * wheels, card headers, hexagram displays, and panchang tables stay visually\n * consistent.\n */\n\nexport const PLANET_GLYPH: Record<string, string> = {\n\tSun: '\u2609',\n\tMoon: '\u263D',\n\tMercury: '\u263F',\n\tVenus: '\u2640',\n\tEarth: '\u2641',\n\tMars: '\u2642',\n\tJupiter: '\u2643',\n\tSaturn: '\u2644',\n\tUranus: '\u2645',\n\tNeptune: '\u2646',\n\tPluto: '\u2647',\n\tRahu: '\u260A',\n\tKetu: '\u260B',\n\tAscendant: 'Asc',\n\tLagna: 'La',\n\tNorthNode: '\u260A',\n\tSouthNode: '\u260B',\n};\n\nexport const PLANET_ABBR: Record<string, string> = {\n\tSun: 'Su',\n\tMoon: 'Mo',\n\tMercury: 'Me',\n\tVenus: 'Ve',\n\tMars: 'Ma',\n\tJupiter: 'Ju',\n\tSaturn: 'Sa',\n\tUranus: 'Ur',\n\tNeptune: 'Ne',\n\tPluto: 'Pl',\n\tRahu: 'Ra',\n\tKetu: 'Ke',\n\tAscendant: 'Asc',\n\tLagna: 'La',\n};\n\nexport const SIGN_GLYPH: Record<string, string> = {\n\tAries: '\u2648',\n\tTaurus: '\u2649',\n\tGemini: '\u264A',\n\tCancer: '\u264B',\n\tLeo: '\u264C',\n\tVirgo: '\u264D',\n\tLibra: '\u264E',\n\tScorpio: '\u264F',\n\tSagittarius: '\u2650',\n\tCapricorn: '\u2651',\n\tAquarius: '\u2652',\n\tPisces: '\u2653',\n};\n\nexport const SIGN_ABBR: Record<string, string> = {\n\tAries: 'Ar',\n\tTaurus: 'Ta',\n\tGemini: 'Ge',\n\tCancer: 'Cn',\n\tLeo: 'Le',\n\tVirgo: 'Vi',\n\tLibra: 'Li',\n\tScorpio: 'Sc',\n\tSagittarius: 'Sg',\n\tCapricorn: 'Cp',\n\tAquarius: 'Aq',\n\tPisces: 'Pi',\n};\n\nexport const SIGNS_ORDER = [\n\t'Aries',\n\t'Taurus',\n\t'Gemini',\n\t'Cancer',\n\t'Leo',\n\t'Virgo',\n\t'Libra',\n\t'Scorpio',\n\t'Sagittarius',\n\t'Capricorn',\n\t'Aquarius',\n\t'Pisces',\n] as const;\n\n/** Aspect symbols. Used by synastry and natal chart aspect tables. */\nexport const ASPECT_SYMBOL: Record<string, string> = {\n\tconjunction: '\u260C',\n\topposition: '\u260D',\n\ttrine: '\u25B3',\n\tsquare: '\u25A1',\n\tsextile: '\u2731',\n\tquincunx: '\u22BB',\n\tsemisextile: '\u22BC',\n};\n\n/** Trigrams used by I Ching hexagrams. Eight trigrams compose 64 hexagrams. */\nexport const TRIGRAM_GLYPH: Record<string, string> = {\n\theaven: '\u2630',\n\tlake: '\u2631',\n\tfire: '\u2632',\n\tthunder: '\u2633',\n\twind: '\u2634',\n\twater: '\u2635',\n\tmountain: '\u2636',\n\tearth: '\u2637',\n\tHeaven: '\u2630',\n\tLake: '\u2631',\n\tFire: '\u2632',\n\tThunder: '\u2633',\n\tWind: '\u2634',\n\tWater: '\u2635',\n\tMountain: '\u2636',\n\tEarth: '\u2637',\n};\n\n/** Moon phase emoji set. Used by moon phase card. */\nexport const MOON_PHASE_EMOJI: Record<string, string> = {\n\t'new moon': '\uD83C\uDF11',\n\t'waxing crescent': '\uD83C\uDF12',\n\t'first quarter': '\uD83C\uDF13',\n\t'waxing gibbous': '\uD83C\uDF14',\n\t'full moon': '\uD83C\uDF15',\n\t'waning gibbous': '\uD83C\uDF16',\n\t'last quarter': '\uD83C\uDF17',\n\t'waning crescent': '\uD83C\uDF18',\n};\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n", "/**\n * Math helpers for converting raw ecliptic longitude decimals into the\n * sign / degree / minute / second triplet used across chart components.\n */\n\nimport { SIGNS_ORDER } from '../tokens/index.js';\n\nexport interface SignPosition {\n\tsign: string;\n\tsignIndex: number;\n\tdegree: number;\n\tminute: number;\n\tsecond: number;\n}\n\n/**\n * Wrap longitude into [0, 360) so negative or out-of-range values still\n * resolve to a real sign. Robust to wonky upstream data.\n */\nexport function normalizeLongitude(lon: number): number {\n\tconst wrapped = lon % 360;\n\treturn wrapped < 0 ? wrapped + 360 : wrapped;\n}\n\n/**\n * Convert decimal ecliptic longitude (0-360) into sign/degree/minute/second.\n * Used by every chart wheel and aspect table.\n */\nexport function longitudeToSignPosition(longitude: number): SignPosition {\n\tconst lon = normalizeLongitude(longitude);\n\tconst signIndex = Math.floor(lon / 30) % 12;\n\tconst within = lon % 30;\n\tconst degree = Math.floor(within);\n\tconst minuteFloat = (within - degree) * 60;\n\tconst minute = Math.floor(minuteFloat);\n\tconst second = Math.round((minuteFloat - minute) * 60);\n\treturn {\n\t\tsign: SIGNS_ORDER[signIndex] ?? 'Aries',\n\t\tsignIndex,\n\t\tdegree,\n\t\tminute,\n\t\tsecond,\n\t};\n}\n\n/** Compact display string like \"12\u00B0 Leo 34'\". Used in chart labels. */\nexport function formatSignPosition(longitude: number): string {\n\tconst { sign, degree, minute } = longitudeToSignPosition(longitude);\n\treturn `${degree}\u00B0 ${sign} ${String(minute).padStart(2, '0')}'`;\n}\n\n/** Polar to cartesian for SVG wheel positioning. Angle in degrees, 0 at 3 o'clock. */\nexport function polarToCartesian(\n\tcx: number,\n\tcy: number,\n\tradius: number,\n\tangleDeg: number,\n): { x: number; y: number } {\n\tconst angleRad = (angleDeg * Math.PI) / 180;\n\treturn {\n\t\tx: cx + radius * Math.cos(angleRad),\n\t\ty: cy + radius * Math.sin(angleRad),\n\t};\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["css", "css"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
interface NumerologyCommon {
|
|
3
|
+
number?: number;
|
|
4
|
+
calculation?: string;
|
|
5
|
+
type?: 'single' | 'master' | string;
|
|
6
|
+
hasKarmicDebt?: boolean;
|
|
7
|
+
karmicDebtNumber?: number;
|
|
8
|
+
karmicDebtMeaning?: string;
|
|
9
|
+
meaning?: string;
|
|
10
|
+
}
|
|
11
|
+
interface CoreNumber {
|
|
12
|
+
number?: number;
|
|
13
|
+
type?: string;
|
|
14
|
+
meaning?: string;
|
|
15
|
+
calculation?: string;
|
|
16
|
+
}
|
|
17
|
+
interface FullChart {
|
|
18
|
+
profile?: {
|
|
19
|
+
fullName?: string;
|
|
20
|
+
birthDate?: string;
|
|
21
|
+
};
|
|
22
|
+
coreNumbers?: Record<string, CoreNumber | number>;
|
|
23
|
+
additionalInsights?: Record<string, unknown>;
|
|
24
|
+
birthDayProfile?: Record<string, unknown>;
|
|
25
|
+
maturityStatus?: string;
|
|
26
|
+
luckyAssociations?: Record<string, unknown>;
|
|
27
|
+
summary?: string;
|
|
28
|
+
}
|
|
29
|
+
interface PersonalYear {
|
|
30
|
+
year?: number;
|
|
31
|
+
personalYear?: number;
|
|
32
|
+
title?: string;
|
|
33
|
+
theme?: string;
|
|
34
|
+
keywords?: string[];
|
|
35
|
+
meaning?: string;
|
|
36
|
+
advice?: string;
|
|
37
|
+
}
|
|
38
|
+
type NumerologyData = NumerologyCommon & FullChart & PersonalYear;
|
|
39
|
+
/**
|
|
40
|
+
* Numerology card. Renders /numerology/{life-path,expression,personal-year,chart}.
|
|
41
|
+
* Use the `type` attribute to switch the layout.
|
|
42
|
+
*/
|
|
43
|
+
export declare class RoxyNumerologyCard extends LitElement {
|
|
44
|
+
static styles: import("lit").CSSResult[];
|
|
45
|
+
data: NumerologyData | null;
|
|
46
|
+
type: 'life-path' | 'expression' | 'personal-year' | 'chart';
|
|
47
|
+
render(): import("lit").TemplateResult<1>;
|
|
48
|
+
}
|
|
49
|
+
declare global {
|
|
50
|
+
interface HTMLElementTagNameMap {
|
|
51
|
+
'roxy-numerology-card': RoxyNumerologyCard;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=numerology-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numerology-card.d.ts","sourceRoot":"","sources":["../../src/components/numerology-card.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAIrD,UAAU,gBAAgB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,UAAU;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,SAAS;IAClB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAClD,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,cAAc,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,CAAC;AAElE;;;GAGG;AACH,qBACa,kBAAmB,SAAQ,UAAU;IACjD,MAAM,CAAC,MAAM,4BAkGX;IAGF,IAAI,EAAE,cAAc,GAAG,IAAI,CAAQ;IAGnC,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAAe;IAE3E,MAAM;CAmEN;AAgBD,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,sBAAsB,EAAE,kBAAkB,CAAC;KAC3C;CACD"}
|