@roxyapi/ui 0.0.1 → 0.1.1
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/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 +69 -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,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roxy UI design tokens. ~30 CSS custom properties that every component reads
|
|
3
|
+
* via :host selector. Light + dark defaults. Host page overrides at :root or
|
|
4
|
+
* per element. No Tailwind, no class-name overrides, no JS theme switcher.
|
|
5
|
+
*
|
|
6
|
+
* Light is the default. Dark applies under any of:
|
|
7
|
+
* - prefers-color-scheme: dark
|
|
8
|
+
* - [data-theme="dark"] on :root or any ancestor
|
|
9
|
+
* - .dark class on :root or any ancestor
|
|
10
|
+
*
|
|
11
|
+
* Motion gating:
|
|
12
|
+
* - --roxy-motion-duration defaults to 200ms. Set to 0ms to disable.
|
|
13
|
+
* - prefers-reduced-motion: reduce forces 0ms regardless of host overrides.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
:root,
|
|
17
|
+
:host {
|
|
18
|
+
/* Color: brand */
|
|
19
|
+
--roxy-primary: #0f172a;
|
|
20
|
+
--roxy-secondary: #475569;
|
|
21
|
+
--roxy-accent: #f59e0b;
|
|
22
|
+
/* Text-safe accent variant. amber-500 hits 2.14:1 on white which fails
|
|
23
|
+
* WCAG AA for body text. amber-700 hits 4.5:1, used wherever the accent
|
|
24
|
+
* tone is applied to text. Fills (planet glyphs, chart accents, badges
|
|
25
|
+
* with non-text use) keep --roxy-accent. */
|
|
26
|
+
--roxy-accent-fg: #b45309;
|
|
27
|
+
|
|
28
|
+
/* Color: status */
|
|
29
|
+
--roxy-success: #16a34a;
|
|
30
|
+
--roxy-warning: #ea580c;
|
|
31
|
+
--roxy-danger: #dc2626;
|
|
32
|
+
--roxy-info: #0284c7;
|
|
33
|
+
|
|
34
|
+
/* Color: surface */
|
|
35
|
+
--roxy-bg: #ffffff;
|
|
36
|
+
--roxy-fg: #0a0a0a;
|
|
37
|
+
--roxy-muted: #71717a;
|
|
38
|
+
--roxy-border: #e4e4e7;
|
|
39
|
+
--roxy-ring: rgba(245, 158, 11, 0.4);
|
|
40
|
+
|
|
41
|
+
/* Typography */
|
|
42
|
+
--roxy-font-sans:
|
|
43
|
+
"Geist", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
|
44
|
+
sans-serif;
|
|
45
|
+
--roxy-font-mono:
|
|
46
|
+
"Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono",
|
|
47
|
+
monospace;
|
|
48
|
+
|
|
49
|
+
--roxy-text-xs: 0.75rem;
|
|
50
|
+
--roxy-text-sm: 0.875rem;
|
|
51
|
+
--roxy-text-base: 1rem;
|
|
52
|
+
--roxy-text-lg: 1.125rem;
|
|
53
|
+
--roxy-text-xl: 1.5rem;
|
|
54
|
+
|
|
55
|
+
--roxy-weight-normal: 400;
|
|
56
|
+
--roxy-weight-bold: 600;
|
|
57
|
+
|
|
58
|
+
--roxy-leading-tight: 1.2;
|
|
59
|
+
--roxy-leading-normal: 1.5;
|
|
60
|
+
|
|
61
|
+
--roxy-tracking-tight: -0.02em;
|
|
62
|
+
--roxy-tracking-normal: 0em;
|
|
63
|
+
|
|
64
|
+
/* Spacing */
|
|
65
|
+
--roxy-space-xs: 0.25rem;
|
|
66
|
+
--roxy-space-sm: 0.5rem;
|
|
67
|
+
--roxy-space-md: 1rem;
|
|
68
|
+
--roxy-space-lg: 1.5rem;
|
|
69
|
+
--roxy-space-xl: 2.5rem;
|
|
70
|
+
|
|
71
|
+
/* Radius */
|
|
72
|
+
--roxy-radius-sm: 4px;
|
|
73
|
+
--roxy-radius-md: 8px;
|
|
74
|
+
--roxy-radius-lg: 12px;
|
|
75
|
+
--roxy-radius-full: 9999px;
|
|
76
|
+
|
|
77
|
+
/* Shadow */
|
|
78
|
+
--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
79
|
+
--roxy-shadow-md:
|
|
80
|
+
0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06);
|
|
81
|
+
--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.14);
|
|
82
|
+
|
|
83
|
+
/* Motion */
|
|
84
|
+
--roxy-motion-duration: 200ms;
|
|
85
|
+
--roxy-motion-easing: cubic-bezier(0.4, 0, 0.2, 1);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Dark theme via system preference */
|
|
89
|
+
@media (prefers-color-scheme: dark) {
|
|
90
|
+
:root,
|
|
91
|
+
:host {
|
|
92
|
+
--roxy-primary: #f8fafc;
|
|
93
|
+
--roxy-secondary: #94a3b8;
|
|
94
|
+
--roxy-accent: #fbbf24;
|
|
95
|
+
--roxy-accent-fg: #fbbf24;
|
|
96
|
+
|
|
97
|
+
--roxy-success: #22c55e;
|
|
98
|
+
--roxy-warning: #fb923c;
|
|
99
|
+
--roxy-danger: #ef4444;
|
|
100
|
+
--roxy-info: #38bdf8;
|
|
101
|
+
|
|
102
|
+
--roxy-bg: #0a0a0a;
|
|
103
|
+
--roxy-fg: #fafafa;
|
|
104
|
+
--roxy-muted: #a1a1aa;
|
|
105
|
+
--roxy-border: #27272a;
|
|
106
|
+
--roxy-ring: rgba(251, 191, 36, 0.45);
|
|
107
|
+
|
|
108
|
+
--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);
|
|
109
|
+
--roxy-shadow-md:
|
|
110
|
+
0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);
|
|
111
|
+
--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* Dark theme via host opt-in */
|
|
116
|
+
:root[data-theme="dark"],
|
|
117
|
+
:host([data-theme="dark"]),
|
|
118
|
+
.dark :host {
|
|
119
|
+
--roxy-primary: #f8fafc;
|
|
120
|
+
--roxy-secondary: #94a3b8;
|
|
121
|
+
--roxy-accent: #fbbf24;
|
|
122
|
+
--roxy-accent-fg: #fbbf24;
|
|
123
|
+
|
|
124
|
+
--roxy-success: #22c55e;
|
|
125
|
+
--roxy-warning: #fb923c;
|
|
126
|
+
--roxy-danger: #ef4444;
|
|
127
|
+
--roxy-info: #38bdf8;
|
|
128
|
+
|
|
129
|
+
--roxy-bg: #0a0a0a;
|
|
130
|
+
--roxy-fg: #fafafa;
|
|
131
|
+
--roxy-muted: #a1a1aa;
|
|
132
|
+
--roxy-border: #27272a;
|
|
133
|
+
--roxy-ring: rgba(251, 191, 36, 0.45);
|
|
134
|
+
|
|
135
|
+
--roxy-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.5);
|
|
136
|
+
--roxy-shadow-md:
|
|
137
|
+
0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -2px rgba(0, 0, 0, 0.5);
|
|
138
|
+
--roxy-shadow-lg: 0 12px 24px -8px rgba(0, 0, 0, 0.7);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* Reduced motion override */
|
|
142
|
+
@media (prefers-reduced-motion: reduce) {
|
|
143
|
+
:root,
|
|
144
|
+
:host {
|
|
145
|
+
--roxy-motion-duration: 0ms;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol constants used across components. Single source of truth so chart
|
|
3
|
+
* wheels, card headers, hexagram displays, and panchang tables stay visually
|
|
4
|
+
* consistent.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PLANET_GLYPH: Record<string, string>;
|
|
7
|
+
export declare const PLANET_ABBR: Record<string, string>;
|
|
8
|
+
export declare const SIGN_GLYPH: Record<string, string>;
|
|
9
|
+
export declare const SIGN_ABBR: Record<string, string>;
|
|
10
|
+
export declare const SIGNS_ORDER: readonly ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"];
|
|
11
|
+
/** Aspect symbols. Used by synastry and natal chart aspect tables. */
|
|
12
|
+
export declare const ASPECT_SYMBOL: Record<string, string>;
|
|
13
|
+
/** Trigrams used by I Ching hexagrams. Eight trigrams compose 64 hexagrams. */
|
|
14
|
+
export declare const TRIGRAM_GLYPH: Record<string, string>;
|
|
15
|
+
/** Moon phase emoji set. Used by moon phase card. */
|
|
16
|
+
export declare const MOON_PHASE_EMOJI: Record<string, string>;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkB/C,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAe9C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAa7C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAa5C,CAAC;AAEF,eAAO,MAAM,WAAW,wIAad,CAAC;AAEX,sEAAsE;AACtE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQhD,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBhD,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-styles.d.ts","sourceRoot":"","sources":["../../src/utils/base-styles.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,UAAU,yBAkFtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/utils/debounce.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,EAC/D,EAAE,EAAE,CAAC,EACL,IAAI,EAAE,MAAM,GACV,CAAC,CAMH"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Math helpers for converting raw ecliptic longitude decimals into the
|
|
3
|
+
* sign / degree / minute / second triplet used across chart components.
|
|
4
|
+
*/
|
|
5
|
+
export interface SignPosition {
|
|
6
|
+
sign: string;
|
|
7
|
+
signIndex: number;
|
|
8
|
+
degree: number;
|
|
9
|
+
minute: number;
|
|
10
|
+
second: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Wrap longitude into [0, 360) so negative or out-of-range values still
|
|
14
|
+
* resolve to a real sign. Robust to wonky upstream data.
|
|
15
|
+
*/
|
|
16
|
+
export declare function normalizeLongitude(lon: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* Convert decimal ecliptic longitude (0-360) into sign/degree/minute/second.
|
|
19
|
+
* Used by every chart wheel and aspect table.
|
|
20
|
+
*/
|
|
21
|
+
export declare function longitudeToSignPosition(longitude: number): SignPosition;
|
|
22
|
+
/** Compact display string like "12° Leo 34'". Used in chart labels. */
|
|
23
|
+
export declare function formatSignPosition(longitude: number): string;
|
|
24
|
+
/** Polar to cartesian for SVG wheel positioning. Angle in degrees, 0 at 3 o'clock. */
|
|
25
|
+
export declare function polarToCartesian(cx: number, cy: number, radius: number, angleDeg: number): {
|
|
26
|
+
x: number;
|
|
27
|
+
y: number;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=degree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"degree.d.ts","sourceRoot":"","sources":["../../src/utils/degree.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAevE;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAC/B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACd;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAM1B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Motion guard. All component animations honor:
|
|
3
|
+
* 1. --roxy-motion-duration CSS variable (set to 0ms to disable)
|
|
4
|
+
* 2. prefers-reduced-motion: reduce media query (forces 0ms regardless)
|
|
5
|
+
*
|
|
6
|
+
* Components apply transitions and entry animations using the duration var
|
|
7
|
+
* directly. The reduced-motion override is enforced at the tokens.css layer.
|
|
8
|
+
*/
|
|
9
|
+
export declare function prefersReducedMotion(): boolean;
|
|
10
|
+
/** CSS snippet that components paste into their styles to read the motion duration. */
|
|
11
|
+
export declare const MOTION_DURATION = "var(--roxy-motion-duration, 200ms)";
|
|
12
|
+
export declare const MOTION_EASING = "var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1))";
|
|
13
|
+
//# sourceMappingURL=motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../../src/utils/motion.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wBAAgB,oBAAoB,IAAI,OAAO,CAG9C;AAED,uFAAuF;AACvF,eAAO,MAAM,eAAe,uCAAuC,CAAC;AACpE,eAAO,MAAM,aAAa,4DACgC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,74 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roxyapi/ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Web components for the RoxyAPI catalog. Drop-in charts, tables, cards, forms for astrology, tarot, numerology, biorhythm, I Ching, crystals, dreams, angel numbers, and more. One key, beautiful in 30 minutes.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./components/*": {
|
|
16
|
+
"types": "./dist/components/*.d.ts",
|
|
17
|
+
"import": "./dist/components/*.js"
|
|
18
|
+
},
|
|
19
|
+
"./styles/tokens.css": "./dist/styles/tokens.css",
|
|
20
|
+
"./registry/*": "./dist/registry/*.json"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"src",
|
|
25
|
+
"AGENTS.md",
|
|
26
|
+
"THEMING.md"
|
|
27
|
+
],
|
|
28
|
+
"keywords": [
|
|
29
|
+
"web-components",
|
|
30
|
+
"lit",
|
|
31
|
+
"custom-elements",
|
|
32
|
+
"shadow-dom",
|
|
33
|
+
"astrology",
|
|
34
|
+
"vedic",
|
|
35
|
+
"tarot",
|
|
36
|
+
"numerology",
|
|
37
|
+
"horoscope",
|
|
38
|
+
"kundli",
|
|
39
|
+
"natal-chart",
|
|
40
|
+
"birth-chart",
|
|
41
|
+
"iching",
|
|
42
|
+
"crystals",
|
|
43
|
+
"angel-numbers",
|
|
44
|
+
"dreams",
|
|
45
|
+
"biorhythm",
|
|
46
|
+
"shadcn",
|
|
47
|
+
"jsdelivr",
|
|
48
|
+
"roxyapi"
|
|
49
|
+
],
|
|
5
50
|
"license": "MIT",
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "git+https://github.com/RoxyAPI/ui.git",
|
|
54
|
+
"directory": "packages/ui"
|
|
55
|
+
},
|
|
6
56
|
"homepage": "https://roxyapi.com/ui",
|
|
7
|
-
"
|
|
57
|
+
"bugs": {
|
|
58
|
+
"url": "https://github.com/RoxyAPI/ui/issues"
|
|
59
|
+
},
|
|
60
|
+
"sideEffects": [
|
|
61
|
+
"./dist/components/*.js",
|
|
62
|
+
"./dist/cdn/*.js"
|
|
63
|
+
],
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"lit": "^3.0.0"
|
|
66
|
+
},
|
|
67
|
+
"dependencies": {
|
|
68
|
+
"lit": "^3.2.0"
|
|
69
|
+
},
|
|
70
|
+
"publishConfig": {
|
|
71
|
+
"access": "public",
|
|
72
|
+
"provenance": true
|
|
73
|
+
}
|
|
8
74
|
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { css, html, LitElement, nothing, svg } from 'lit';
|
|
2
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
3
|
+
import { baseStyles } from '../utils/base-styles.js';
|
|
4
|
+
|
|
5
|
+
interface DailyBiorhythm {
|
|
6
|
+
birthDate?: string;
|
|
7
|
+
targetDate?: string;
|
|
8
|
+
daysSinceBirth?: number;
|
|
9
|
+
cycles?: Record<string, number>;
|
|
10
|
+
energyRating?: number;
|
|
11
|
+
overallPhase?: string;
|
|
12
|
+
interpretation?: string;
|
|
13
|
+
advice?: string;
|
|
14
|
+
criticalAlerts?: string[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface BiorhythmDay {
|
|
18
|
+
date?: string;
|
|
19
|
+
cycles?: Record<string, number>;
|
|
20
|
+
energyRating?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface BiorhythmForecast {
|
|
24
|
+
birthDate?: string;
|
|
25
|
+
startDate?: string;
|
|
26
|
+
endDate?: string;
|
|
27
|
+
totalDays?: number;
|
|
28
|
+
summary?: {
|
|
29
|
+
bestDay?: string;
|
|
30
|
+
worstDay?: string;
|
|
31
|
+
criticalDayCount?: number;
|
|
32
|
+
averageEnergy?: number;
|
|
33
|
+
periodAdvice?: string;
|
|
34
|
+
};
|
|
35
|
+
days?: BiorhythmDay[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface CriticalDay {
|
|
39
|
+
date?: string;
|
|
40
|
+
cycle?: string;
|
|
41
|
+
period?: string;
|
|
42
|
+
direction?: string;
|
|
43
|
+
severity?: string;
|
|
44
|
+
advisory?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface CriticalDays {
|
|
48
|
+
birthDate?: string;
|
|
49
|
+
startDate?: string;
|
|
50
|
+
endDate?: string;
|
|
51
|
+
totalCriticalDays?: number;
|
|
52
|
+
criticalDays?: CriticalDay[];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
type BiorhythmData = DailyBiorhythm & BiorhythmForecast & CriticalDays;
|
|
56
|
+
|
|
57
|
+
const CYCLE_COLOR: Record<string, string> = {
|
|
58
|
+
physical: '#dc2626',
|
|
59
|
+
emotional: '#0284c7',
|
|
60
|
+
intellectual: '#16a34a',
|
|
61
|
+
intuitive: '#a855f7',
|
|
62
|
+
aesthetic: '#f59e0b',
|
|
63
|
+
awareness: '#ec4899',
|
|
64
|
+
spiritual: '#14b8a6',
|
|
65
|
+
passion: '#ef4444',
|
|
66
|
+
mastery: '#6366f1',
|
|
67
|
+
wisdom: '#475569',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Biorhythm chart. Renders /biorhythm/{daily,forecast,critical-days}.
|
|
72
|
+
*/
|
|
73
|
+
@customElement('roxy-biorhythm-chart')
|
|
74
|
+
export class RoxyBiorhythmChart extends LitElement {
|
|
75
|
+
static styles = [
|
|
76
|
+
baseStyles,
|
|
77
|
+
css`
|
|
78
|
+
.wrap {
|
|
79
|
+
display: grid;
|
|
80
|
+
gap: var(--roxy-space-md, 1rem);
|
|
81
|
+
}
|
|
82
|
+
.head {
|
|
83
|
+
display: flex;
|
|
84
|
+
justify-content: space-between;
|
|
85
|
+
align-items: center;
|
|
86
|
+
flex-wrap: wrap;
|
|
87
|
+
gap: var(--roxy-space-sm, 0.5rem);
|
|
88
|
+
}
|
|
89
|
+
.title {
|
|
90
|
+
margin: 0;
|
|
91
|
+
font-size: var(--roxy-text-lg, 1.125rem);
|
|
92
|
+
font-weight: var(--roxy-weight-bold, 600);
|
|
93
|
+
}
|
|
94
|
+
.energy {
|
|
95
|
+
font-variant-numeric: tabular-nums;
|
|
96
|
+
color: var(--roxy-accent-fg, #b45309);
|
|
97
|
+
font-weight: var(--roxy-weight-bold, 600);
|
|
98
|
+
}
|
|
99
|
+
.bars {
|
|
100
|
+
display: grid;
|
|
101
|
+
gap: var(--roxy-space-xs, 0.25rem);
|
|
102
|
+
}
|
|
103
|
+
.bar {
|
|
104
|
+
display: grid;
|
|
105
|
+
grid-template-columns: 8rem 1fr 3.5rem;
|
|
106
|
+
gap: var(--roxy-space-sm, 0.5rem);
|
|
107
|
+
align-items: center;
|
|
108
|
+
font-size: var(--roxy-text-sm, 0.875rem);
|
|
109
|
+
}
|
|
110
|
+
.track {
|
|
111
|
+
height: 14px;
|
|
112
|
+
background: var(--roxy-border, #e4e4e7);
|
|
113
|
+
border-radius: var(--roxy-radius-full, 9999px);
|
|
114
|
+
overflow: hidden;
|
|
115
|
+
position: relative;
|
|
116
|
+
}
|
|
117
|
+
.fill {
|
|
118
|
+
display: block;
|
|
119
|
+
height: 100%;
|
|
120
|
+
transition:
|
|
121
|
+
width var(--roxy-motion-duration, 200ms)
|
|
122
|
+
var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));
|
|
123
|
+
}
|
|
124
|
+
.value {
|
|
125
|
+
font-variant-numeric: tabular-nums;
|
|
126
|
+
text-align: right;
|
|
127
|
+
color: var(--roxy-muted, #71717a);
|
|
128
|
+
}
|
|
129
|
+
.advice {
|
|
130
|
+
color: var(--roxy-fg, #0a0a0a);
|
|
131
|
+
}
|
|
132
|
+
.alert {
|
|
133
|
+
background: color-mix(in srgb, var(--roxy-warning, #ea580c) 12%, transparent);
|
|
134
|
+
border: 1px solid color-mix(in srgb, var(--roxy-warning, #ea580c) 32%, transparent);
|
|
135
|
+
border-radius: var(--roxy-radius-md, 8px);
|
|
136
|
+
padding: var(--roxy-space-sm, 0.5rem);
|
|
137
|
+
font-size: var(--roxy-text-sm, 0.875rem);
|
|
138
|
+
margin: 0;
|
|
139
|
+
}
|
|
140
|
+
svg {
|
|
141
|
+
display: block;
|
|
142
|
+
width: 100%;
|
|
143
|
+
height: auto;
|
|
144
|
+
}
|
|
145
|
+
.crit {
|
|
146
|
+
background: color-mix(in srgb, var(--roxy-danger, #dc2626) 12%, transparent);
|
|
147
|
+
border-radius: var(--roxy-radius-sm, 4px);
|
|
148
|
+
padding: 4px 8px;
|
|
149
|
+
font-size: var(--roxy-text-xs, 0.75rem);
|
|
150
|
+
display: inline-block;
|
|
151
|
+
margin: 2px;
|
|
152
|
+
}
|
|
153
|
+
`,
|
|
154
|
+
];
|
|
155
|
+
|
|
156
|
+
@property({ attribute: false })
|
|
157
|
+
data: BiorhythmData | null = null;
|
|
158
|
+
|
|
159
|
+
@property({ type: String, reflect: true })
|
|
160
|
+
mode: 'daily' | 'forecast' | 'critical-days' = 'daily';
|
|
161
|
+
|
|
162
|
+
render() {
|
|
163
|
+
const d = this.data;
|
|
164
|
+
if (!d)
|
|
165
|
+
return html`<div class="roxy-empty" role="status">No biorhythm data</div>`;
|
|
166
|
+
|
|
167
|
+
if (this.mode === 'critical-days' && d.criticalDays?.length) {
|
|
168
|
+
return this.renderCritical(d);
|
|
169
|
+
}
|
|
170
|
+
if (this.mode === 'forecast' && d.days?.length) {
|
|
171
|
+
return this.renderForecast(d);
|
|
172
|
+
}
|
|
173
|
+
return this.renderDaily(d);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
private renderDaily(d: DailyBiorhythm) {
|
|
177
|
+
const cycles = d.cycles ?? {};
|
|
178
|
+
const entries = Object.entries(cycles);
|
|
179
|
+
return html`<section class="wrap" aria-label="Daily biorhythm">
|
|
180
|
+
<header class="head">
|
|
181
|
+
<h2 class="title">Biorhythm</h2>
|
|
182
|
+
${
|
|
183
|
+
typeof d.energyRating === 'number'
|
|
184
|
+
? html`<span class="energy">Energy ${d.energyRating}/10</span>`
|
|
185
|
+
: nothing
|
|
186
|
+
}
|
|
187
|
+
</header>
|
|
188
|
+
<div class="bars" role="list">
|
|
189
|
+
${entries.map(([cycle, value]) => {
|
|
190
|
+
const v = typeof value === 'number' ? value : 0;
|
|
191
|
+
const pct = ((v + 1) / 2) * 100; // -1..1 -> 0..100
|
|
192
|
+
const color = CYCLE_COLOR[cycle] ?? 'var(--roxy-accent, #f59e0b)';
|
|
193
|
+
return html`<div class="bar" role="listitem">
|
|
194
|
+
<span style="text-transform: capitalize">${cycle}</span>
|
|
195
|
+
<span class="track">
|
|
196
|
+
<span
|
|
197
|
+
class="fill"
|
|
198
|
+
style="width: ${pct}%; background: ${color}"
|
|
199
|
+
></span>
|
|
200
|
+
</span>
|
|
201
|
+
<span class="value">${(v * 100).toFixed(0)}%</span>
|
|
202
|
+
</div>`;
|
|
203
|
+
})}
|
|
204
|
+
</div>
|
|
205
|
+
${d.interpretation ? html`<p class="advice">${d.interpretation}</p>` : nothing}
|
|
206
|
+
${d.advice ? html`<p class="advice">${d.advice}</p>` : nothing}
|
|
207
|
+
${
|
|
208
|
+
d.criticalAlerts?.length
|
|
209
|
+
? html`<div>
|
|
210
|
+
${d.criticalAlerts.map((a) => html`<p class="alert">${a}</p>`)}
|
|
211
|
+
</div>`
|
|
212
|
+
: nothing
|
|
213
|
+
}
|
|
214
|
+
</section>`;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
private renderForecast(d: BiorhythmForecast) {
|
|
218
|
+
const days = d.days ?? [];
|
|
219
|
+
if (days.length === 0)
|
|
220
|
+
return html`<div class="roxy-empty" role="status">No forecast</div>`;
|
|
221
|
+
const w = 600;
|
|
222
|
+
const h = 160;
|
|
223
|
+
const xStep = w / Math.max(days.length - 1, 1);
|
|
224
|
+
const cycles = Object.keys(days[0]?.cycles ?? {});
|
|
225
|
+
return html`<section class="wrap" aria-label="Biorhythm forecast">
|
|
226
|
+
<header class="head">
|
|
227
|
+
<h2 class="title">Forecast</h2>
|
|
228
|
+
<span class="energy"
|
|
229
|
+
>${d.startDate ?? ''} - ${d.endDate ?? ''}</span
|
|
230
|
+
>
|
|
231
|
+
</header>
|
|
232
|
+
<svg
|
|
233
|
+
viewBox="0 0 ${w} ${h}"
|
|
234
|
+
role="img"
|
|
235
|
+
aria-label="Biorhythm cycle lines across the forecast window"
|
|
236
|
+
>
|
|
237
|
+
<title>Biorhythm forecast</title>
|
|
238
|
+
<line
|
|
239
|
+
x1="0"
|
|
240
|
+
y1=${h / 2}
|
|
241
|
+
x2=${w}
|
|
242
|
+
y2=${h / 2}
|
|
243
|
+
stroke="var(--roxy-border, #e4e4e7)"
|
|
244
|
+
stroke-width="1"
|
|
245
|
+
/>
|
|
246
|
+
${cycles.map((cycle) => {
|
|
247
|
+
const points = days
|
|
248
|
+
.map((day, i) => {
|
|
249
|
+
const v = day.cycles?.[cycle] ?? 0;
|
|
250
|
+
const x = i * xStep;
|
|
251
|
+
const y = h / 2 - v * (h / 2 - 8);
|
|
252
|
+
return `${x.toFixed(2)},${y.toFixed(2)}`;
|
|
253
|
+
})
|
|
254
|
+
.join(' ');
|
|
255
|
+
const color = CYCLE_COLOR[cycle] ?? '#475569';
|
|
256
|
+
return svg`<polyline points=${points} fill="none" stroke=${color} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`;
|
|
257
|
+
})}
|
|
258
|
+
</svg>
|
|
259
|
+
${
|
|
260
|
+
d.summary?.periodAdvice
|
|
261
|
+
? html`<p class="advice">${d.summary.periodAdvice}</p>`
|
|
262
|
+
: nothing
|
|
263
|
+
}
|
|
264
|
+
</section>`;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private renderCritical(d: CriticalDays) {
|
|
268
|
+
return html`<section class="wrap" aria-label="Critical days">
|
|
269
|
+
<header class="head">
|
|
270
|
+
<h2 class="title">Critical days</h2>
|
|
271
|
+
<span class="energy"
|
|
272
|
+
>${d.totalCriticalDays ?? d.criticalDays?.length ?? 0} total</span
|
|
273
|
+
>
|
|
274
|
+
</header>
|
|
275
|
+
<div>
|
|
276
|
+
${(d.criticalDays ?? []).map(
|
|
277
|
+
(day) => html`<span class="crit"
|
|
278
|
+
>${day.date} · ${day.cycle ?? ''} ${day.severity ?? ''}</span
|
|
279
|
+
>`,
|
|
280
|
+
)}
|
|
281
|
+
</div>
|
|
282
|
+
</section>`;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
declare global {
|
|
287
|
+
interface HTMLElementTagNameMap {
|
|
288
|
+
'roxy-biorhythm-chart': RoxyBiorhythmChart;
|
|
289
|
+
}
|
|
290
|
+
}
|