@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.
Files changed (166) hide show
  1. package/AGENTS.md +169 -0
  2. package/THEMING.md +129 -0
  3. package/dist/cdn/components/biorhythm-chart.js +261 -0
  4. package/dist/cdn/components/biorhythm-chart.js.map +7 -0
  5. package/dist/cdn/components/compatibility-card.js +257 -0
  6. package/dist/cdn/components/compatibility-card.js.map +7 -0
  7. package/dist/cdn/components/dasha-timeline.js +244 -0
  8. package/dist/cdn/components/dasha-timeline.js.map +7 -0
  9. package/dist/cdn/components/data.js +258 -0
  10. package/dist/cdn/components/data.js.map +7 -0
  11. package/dist/cdn/components/dosha-card.js +254 -0
  12. package/dist/cdn/components/dosha-card.js.map +7 -0
  13. package/dist/cdn/components/endpoint-form.js +253 -0
  14. package/dist/cdn/components/endpoint-form.js.map +7 -0
  15. package/dist/cdn/components/guna-milan.js +256 -0
  16. package/dist/cdn/components/guna-milan.js.map +7 -0
  17. package/dist/cdn/components/hexagram.js +275 -0
  18. package/dist/cdn/components/hexagram.js.map +7 -0
  19. package/dist/cdn/components/horoscope-card.js +302 -0
  20. package/dist/cdn/components/horoscope-card.js.map +7 -0
  21. package/dist/cdn/components/kp-planets-table.js +224 -0
  22. package/dist/cdn/components/kp-planets-table.js.map +7 -0
  23. package/dist/cdn/components/location-search.js +267 -0
  24. package/dist/cdn/components/location-search.js.map +7 -0
  25. package/dist/cdn/components/moon-phase.js +251 -0
  26. package/dist/cdn/components/moon-phase.js.map +7 -0
  27. package/dist/cdn/components/natal-chart.js +237 -0
  28. package/dist/cdn/components/natal-chart.js.map +7 -0
  29. package/dist/cdn/components/numerology-card.js +252 -0
  30. package/dist/cdn/components/numerology-card.js.map +7 -0
  31. package/dist/cdn/components/panchang-table.js +234 -0
  32. package/dist/cdn/components/panchang-table.js.map +7 -0
  33. package/dist/cdn/components/synastry-chart.js +303 -0
  34. package/dist/cdn/components/synastry-chart.js.map +7 -0
  35. package/dist/cdn/components/tarot-card.js +260 -0
  36. package/dist/cdn/components/tarot-card.js.map +7 -0
  37. package/dist/cdn/components/tarot-spread.js +261 -0
  38. package/dist/cdn/components/tarot-spread.js.map +7 -0
  39. package/dist/cdn/components/vedic-kundli.js +189 -0
  40. package/dist/cdn/components/vedic-kundli.js.map +7 -0
  41. package/dist/cdn/roxy-ui.js +2552 -0
  42. package/dist/cdn/roxy-ui.js.map +7 -0
  43. package/dist/cdn/widgets.js +114 -0
  44. package/dist/components/biorhythm-chart.d.ts +66 -0
  45. package/dist/components/biorhythm-chart.d.ts.map +1 -0
  46. package/dist/components/biorhythm-chart.js +318 -0
  47. package/dist/components/biorhythm-chart.js.map +7 -0
  48. package/dist/components/compatibility-card.d.ts +46 -0
  49. package/dist/components/compatibility-card.d.ts.map +1 -0
  50. package/dist/components/compatibility-card.js +279 -0
  51. package/dist/components/compatibility-card.js.map +7 -0
  52. package/dist/components/dasha-timeline.d.ts +53 -0
  53. package/dist/components/dasha-timeline.d.ts.map +1 -0
  54. package/dist/components/dasha-timeline.js +269 -0
  55. package/dist/components/dasha-timeline.js.map +7 -0
  56. package/dist/components/data.d.ts +40 -0
  57. package/dist/components/data.d.ts.map +1 -0
  58. package/dist/components/data.js +339 -0
  59. package/dist/components/data.js.map +7 -0
  60. package/dist/components/dosha-card.d.ts +35 -0
  61. package/dist/components/dosha-card.d.ts.map +1 -0
  62. package/dist/components/dosha-card.js +278 -0
  63. package/dist/components/dosha-card.js.map +7 -0
  64. package/dist/components/endpoint-form.d.ts +39 -0
  65. package/dist/components/endpoint-form.d.ts.map +1 -0
  66. package/dist/components/endpoint-form.js +432 -0
  67. package/dist/components/endpoint-form.js.map +7 -0
  68. package/dist/components/guna-milan.d.ts +35 -0
  69. package/dist/components/guna-milan.d.ts.map +1 -0
  70. package/dist/components/guna-milan.js +302 -0
  71. package/dist/components/guna-milan.js.map +7 -0
  72. package/dist/components/hexagram.d.ts +47 -0
  73. package/dist/components/hexagram.d.ts.map +1 -0
  74. package/dist/components/hexagram.js +334 -0
  75. package/dist/components/hexagram.js.map +7 -0
  76. package/dist/components/horoscope-card.d.ts +38 -0
  77. package/dist/components/horoscope-card.d.ts.map +1 -0
  78. package/dist/components/horoscope-card.js +332 -0
  79. package/dist/components/horoscope-card.js.map +7 -0
  80. package/dist/components/kp-planets-table.d.ts +36 -0
  81. package/dist/components/kp-planets-table.d.ts.map +1 -0
  82. package/dist/components/kp-planets-table.js +227 -0
  83. package/dist/components/kp-planets-table.js.map +7 -0
  84. package/dist/components/location-search.d.ts +56 -0
  85. package/dist/components/location-search.d.ts.map +1 -0
  86. package/dist/components/location-search.js +401 -0
  87. package/dist/components/location-search.js.map +7 -0
  88. package/dist/components/moon-phase.d.ts +38 -0
  89. package/dist/components/moon-phase.d.ts.map +1 -0
  90. package/dist/components/moon-phase.js +284 -0
  91. package/dist/components/moon-phase.js.map +7 -0
  92. package/dist/components/natal-chart.d.ts +65 -0
  93. package/dist/components/natal-chart.d.ts.map +1 -0
  94. package/dist/components/natal-chart.js +407 -0
  95. package/dist/components/natal-chart.js.map +7 -0
  96. package/dist/components/numerology-card.d.ts +55 -0
  97. package/dist/components/numerology-card.d.ts.map +1 -0
  98. package/dist/components/numerology-card.js +274 -0
  99. package/dist/components/numerology-card.js.map +7 -0
  100. package/dist/components/panchang-table.d.ts +77 -0
  101. package/dist/components/panchang-table.d.ts.map +1 -0
  102. package/dist/components/panchang-table.js +285 -0
  103. package/dist/components/panchang-table.js.map +7 -0
  104. package/dist/components/synastry-chart.d.ts +52 -0
  105. package/dist/components/synastry-chart.d.ts.map +1 -0
  106. package/dist/components/synastry-chart.js +415 -0
  107. package/dist/components/synastry-chart.js.map +7 -0
  108. package/dist/components/tarot-card.d.ts +47 -0
  109. package/dist/components/tarot-card.d.ts.map +1 -0
  110. package/dist/components/tarot-card.js +281 -0
  111. package/dist/components/tarot-card.js.map +7 -0
  112. package/dist/components/tarot-spread.d.ts +42 -0
  113. package/dist/components/tarot-spread.d.ts.map +1 -0
  114. package/dist/components/tarot-spread.js +271 -0
  115. package/dist/components/tarot-spread.js.map +7 -0
  116. package/dist/components/vedic-kundli.d.ts +45 -0
  117. package/dist/components/vedic-kundli.d.ts.map +1 -0
  118. package/dist/components/vedic-kundli.js +325 -0
  119. package/dist/components/vedic-kundli.js.map +7 -0
  120. package/dist/index.cjs +4174 -0
  121. package/dist/index.cjs.map +7 -0
  122. package/dist/index.d.ts +30 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +4154 -0
  125. package/dist/index.js.map +7 -0
  126. package/dist/manifest.json +24 -0
  127. package/dist/styles/tokens.css +147 -0
  128. package/dist/tokens/index.d.ts +17 -0
  129. package/dist/tokens/index.d.ts.map +1 -0
  130. package/dist/utils/base-styles.d.ts +6 -0
  131. package/dist/utils/base-styles.d.ts.map +1 -0
  132. package/dist/utils/debounce.d.ts +5 -0
  133. package/dist/utils/debounce.d.ts.map +1 -0
  134. package/dist/utils/degree.d.ts +29 -0
  135. package/dist/utils/degree.d.ts.map +1 -0
  136. package/dist/utils/motion.d.ts +13 -0
  137. package/dist/utils/motion.d.ts.map +1 -0
  138. package/package.json +69 -3
  139. package/src/components/biorhythm-chart.ts +290 -0
  140. package/src/components/compatibility-card.ts +231 -0
  141. package/src/components/dasha-timeline.ts +251 -0
  142. package/src/components/data.ts +287 -0
  143. package/src/components/dosha-card.ts +215 -0
  144. package/src/components/endpoint-form.ts +433 -0
  145. package/src/components/guna-milan.ts +245 -0
  146. package/src/components/hexagram.ts +279 -0
  147. package/src/components/horoscope-card.ts +291 -0
  148. package/src/components/kp-planets-table.ts +156 -0
  149. package/src/components/location-search.ts +335 -0
  150. package/src/components/moon-phase.ts +221 -0
  151. package/src/components/natal-chart.ts +298 -0
  152. package/src/components/numerology-card.ts +243 -0
  153. package/src/components/panchang-table.ts +265 -0
  154. package/src/components/synastry-chart.ts +341 -0
  155. package/src/components/tarot-card.ts +235 -0
  156. package/src/components/tarot-spread.ts +224 -0
  157. package/src/components/vedic-kundli.ts +257 -0
  158. package/src/index.ts +61 -0
  159. package/src/styles/tokens.css +147 -0
  160. package/src/tokens/index.ts +130 -0
  161. package/src/types/index.ts +3 -0
  162. package/src/types/types.gen.ts +28526 -0
  163. package/src/utils/base-styles.ts +89 -0
  164. package/src/utils/debounce.ts +13 -0
  165. package/src/utils/degree.ts +64 -0
  166. 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,6 @@
1
+ /**
2
+ * Shared host styles every component pulls in. Sets default font, color,
3
+ * container query support, and the entry fade-in.
4
+ */
5
+ export declare const baseStyles: import("lit").CSSResult;
6
+ //# sourceMappingURL=base-styles.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Lightweight debounce for input handlers. Used by location search.
3
+ */
4
+ export declare function debounce<F extends (...args: never[]) => unknown>(fn: F, wait: number): F;
5
+ //# sourceMappingURL=debounce.d.ts.map
@@ -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.0.1",
4
- "description": "Open source web components for the RoxyAPI catalog. One key, 10 spiritual domains, beautiful charts and forms in 30 minutes. Real release coming soon.",
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
- "repository": { "type": "git", "url": "https://github.com/RoxyAPI/ui.git" }
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
+ }