@roxyapi/ui-react 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.
Files changed (153) hide show
  1. package/AGENTS.md +169 -0
  2. package/LICENSE +21 -0
  3. package/README.md +198 -0
  4. package/dist/components/biorhythm-chart.d.ts +9 -0
  5. package/dist/components/biorhythm-chart.d.ts.map +1 -0
  6. package/dist/components/biorhythm-chart.js +65 -0
  7. package/dist/components/biorhythm-chart.js.map +7 -0
  8. package/dist/components/compatibility-card.d.ts +9 -0
  9. package/dist/components/compatibility-card.d.ts.map +1 -0
  10. package/dist/components/compatibility-card.js +65 -0
  11. package/dist/components/compatibility-card.js.map +7 -0
  12. package/dist/components/dasha-timeline.d.ts +9 -0
  13. package/dist/components/dasha-timeline.d.ts.map +1 -0
  14. package/dist/components/dasha-timeline.js +65 -0
  15. package/dist/components/dasha-timeline.js.map +7 -0
  16. package/dist/components/data.d.ts +9 -0
  17. package/dist/components/data.d.ts.map +1 -0
  18. package/dist/components/data.js +65 -0
  19. package/dist/components/data.js.map +7 -0
  20. package/dist/components/dosha-card.d.ts +9 -0
  21. package/dist/components/dosha-card.d.ts.map +1 -0
  22. package/dist/components/dosha-card.js +65 -0
  23. package/dist/components/dosha-card.js.map +7 -0
  24. package/dist/components/endpoint-form.d.ts +9 -0
  25. package/dist/components/endpoint-form.d.ts.map +1 -0
  26. package/dist/components/endpoint-form.js +65 -0
  27. package/dist/components/endpoint-form.js.map +7 -0
  28. package/dist/components/guna-milan.d.ts +9 -0
  29. package/dist/components/guna-milan.d.ts.map +1 -0
  30. package/dist/components/guna-milan.js +65 -0
  31. package/dist/components/guna-milan.js.map +7 -0
  32. package/dist/components/hexagram.d.ts +9 -0
  33. package/dist/components/hexagram.d.ts.map +1 -0
  34. package/dist/components/hexagram.js +65 -0
  35. package/dist/components/hexagram.js.map +7 -0
  36. package/dist/components/horoscope-card.d.ts +9 -0
  37. package/dist/components/horoscope-card.d.ts.map +1 -0
  38. package/dist/components/horoscope-card.js +65 -0
  39. package/dist/components/horoscope-card.js.map +7 -0
  40. package/dist/components/kp-planets-table.d.ts +9 -0
  41. package/dist/components/kp-planets-table.d.ts.map +1 -0
  42. package/dist/components/kp-planets-table.js +65 -0
  43. package/dist/components/kp-planets-table.js.map +7 -0
  44. package/dist/components/location-search.d.ts +9 -0
  45. package/dist/components/location-search.d.ts.map +1 -0
  46. package/dist/components/location-search.js +65 -0
  47. package/dist/components/location-search.js.map +7 -0
  48. package/dist/components/moon-phase.d.ts +9 -0
  49. package/dist/components/moon-phase.d.ts.map +1 -0
  50. package/dist/components/moon-phase.js +65 -0
  51. package/dist/components/moon-phase.js.map +7 -0
  52. package/dist/components/natal-chart.d.ts +9 -0
  53. package/dist/components/natal-chart.d.ts.map +1 -0
  54. package/dist/components/natal-chart.js +65 -0
  55. package/dist/components/natal-chart.js.map +7 -0
  56. package/dist/components/numerology-card.d.ts +9 -0
  57. package/dist/components/numerology-card.d.ts.map +1 -0
  58. package/dist/components/numerology-card.js +65 -0
  59. package/dist/components/numerology-card.js.map +7 -0
  60. package/dist/components/panchang-table.d.ts +9 -0
  61. package/dist/components/panchang-table.d.ts.map +1 -0
  62. package/dist/components/panchang-table.js +65 -0
  63. package/dist/components/panchang-table.js.map +7 -0
  64. package/dist/components/synastry-chart.d.ts +9 -0
  65. package/dist/components/synastry-chart.d.ts.map +1 -0
  66. package/dist/components/synastry-chart.js +65 -0
  67. package/dist/components/synastry-chart.js.map +7 -0
  68. package/dist/components/tarot-card.d.ts +9 -0
  69. package/dist/components/tarot-card.d.ts.map +1 -0
  70. package/dist/components/tarot-card.js +65 -0
  71. package/dist/components/tarot-card.js.map +7 -0
  72. package/dist/components/tarot-spread.d.ts +9 -0
  73. package/dist/components/tarot-spread.d.ts.map +1 -0
  74. package/dist/components/tarot-spread.js +65 -0
  75. package/dist/components/tarot-spread.js.map +7 -0
  76. package/dist/components/vedic-kundli.d.ts +9 -0
  77. package/dist/components/vedic-kundli.d.ts.map +1 -0
  78. package/dist/components/vedic-kundli.js +65 -0
  79. package/dist/components/vedic-kundli.js.map +7 -0
  80. package/dist/index.cjs +565 -0
  81. package/dist/index.cjs.map +7 -0
  82. package/dist/index.d.ts +21 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +532 -0
  85. package/dist/index.js.map +7 -0
  86. package/dist/load-ui.d.ts +2 -0
  87. package/dist/load-ui.d.ts.map +1 -0
  88. package/dist/load-ui.js +38 -0
  89. package/dist/load-ui.js.map +7 -0
  90. package/package.json +49 -3
  91. package/src/components/biorhythm-chart.d.ts +12 -0
  92. package/src/components/biorhythm-chart.d.ts.map +1 -0
  93. package/src/components/biorhythm-chart.tsx +35 -0
  94. package/src/components/compatibility-card.d.ts +12 -0
  95. package/src/components/compatibility-card.d.ts.map +1 -0
  96. package/src/components/compatibility-card.tsx +35 -0
  97. package/src/components/dasha-timeline.d.ts +12 -0
  98. package/src/components/dasha-timeline.d.ts.map +1 -0
  99. package/src/components/dasha-timeline.tsx +35 -0
  100. package/src/components/data.d.ts +11 -0
  101. package/src/components/data.d.ts.map +1 -0
  102. package/src/components/data.tsx +35 -0
  103. package/src/components/dosha-card.d.ts +12 -0
  104. package/src/components/dosha-card.d.ts.map +1 -0
  105. package/src/components/dosha-card.tsx +35 -0
  106. package/src/components/endpoint-form.d.ts +12 -0
  107. package/src/components/endpoint-form.d.ts.map +1 -0
  108. package/src/components/endpoint-form.tsx +35 -0
  109. package/src/components/guna-milan.d.ts +12 -0
  110. package/src/components/guna-milan.d.ts.map +1 -0
  111. package/src/components/guna-milan.tsx +35 -0
  112. package/src/components/hexagram.d.ts +12 -0
  113. package/src/components/hexagram.d.ts.map +1 -0
  114. package/src/components/hexagram.tsx +35 -0
  115. package/src/components/horoscope-card.d.ts +12 -0
  116. package/src/components/horoscope-card.d.ts.map +1 -0
  117. package/src/components/horoscope-card.tsx +35 -0
  118. package/src/components/kp-planets-table.d.ts +12 -0
  119. package/src/components/kp-planets-table.d.ts.map +1 -0
  120. package/src/components/kp-planets-table.tsx +35 -0
  121. package/src/components/location-search.d.ts +12 -0
  122. package/src/components/location-search.d.ts.map +1 -0
  123. package/src/components/location-search.tsx +35 -0
  124. package/src/components/moon-phase.d.ts +12 -0
  125. package/src/components/moon-phase.d.ts.map +1 -0
  126. package/src/components/moon-phase.tsx +35 -0
  127. package/src/components/natal-chart.d.ts +12 -0
  128. package/src/components/natal-chart.d.ts.map +1 -0
  129. package/src/components/natal-chart.tsx +35 -0
  130. package/src/components/numerology-card.d.ts +12 -0
  131. package/src/components/numerology-card.d.ts.map +1 -0
  132. package/src/components/numerology-card.tsx +35 -0
  133. package/src/components/panchang-table.d.ts +12 -0
  134. package/src/components/panchang-table.d.ts.map +1 -0
  135. package/src/components/panchang-table.tsx +35 -0
  136. package/src/components/synastry-chart.d.ts +12 -0
  137. package/src/components/synastry-chart.d.ts.map +1 -0
  138. package/src/components/synastry-chart.tsx +35 -0
  139. package/src/components/tarot-card.d.ts +12 -0
  140. package/src/components/tarot-card.d.ts.map +1 -0
  141. package/src/components/tarot-card.tsx +35 -0
  142. package/src/components/tarot-spread.d.ts +12 -0
  143. package/src/components/tarot-spread.d.ts.map +1 -0
  144. package/src/components/tarot-spread.tsx +35 -0
  145. package/src/components/vedic-kundli.d.ts +12 -0
  146. package/src/components/vedic-kundli.d.ts.map +1 -0
  147. package/src/components/vedic-kundli.tsx +35 -0
  148. package/src/index.d.ts +21 -0
  149. package/src/index.d.ts.map +1 -0
  150. package/src/index.ts +20 -0
  151. package/src/load-ui.d.ts +2 -0
  152. package/src/load-ui.d.ts.map +1 -0
  153. package/src/load-ui.ts +41 -0
package/AGENTS.md ADDED
@@ -0,0 +1,169 @@
1
+ # AGENTS.md
2
+
3
+ This file teaches AI coding agents (Claude Code, Cursor, Copilot, Codex, Gemini CLI) how to use Roxy UI when integrating RoxyAPI into a project.
4
+
5
+ ## Identity
6
+
7
+ Roxy UI is the official web component library for the RoxyAPI catalog. Components and helpers cover Western astrology, Vedic astrology, numerology, tarot, biorhythm, I Ching, crystals, dreams, angel numbers, with the location helper for geocoding. New endpoints regenerate component types automatically.
8
+
9
+ ## Decision tree for picking a component
10
+
11
+ Use the table below. Match the user request against the endpoint, render the matching component.
12
+
13
+ <!-- BEGIN:COMPONENTS -->
14
+ | Element | Domain | Endpoint(s) | What it renders |
15
+ |---|---|---|---|
16
+ | `<roxy-natal-chart>` | Western | POST /astrology/natal-chart | Natal chart wheel with planet glyphs and aspect lines |
17
+ | `<roxy-horoscope-card>` | Western | GET /astrology/horoscope/{sign}/{daily,weekly,monthly} | Daily, weekly, or monthly horoscope card |
18
+ | `<roxy-synastry-chart>` | Western | POST /astrology/synastry | Dual-wheel synastry with inter-aspects table |
19
+ | `<roxy-compatibility-card>` | Cross | POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility | Score card with category breakdown |
20
+ | `<roxy-moon-phase>` | Western | GET /astrology/moon-phase/{current,upcoming,calendar/...} | Moon phase card and calendar |
21
+ | `<roxy-vedic-kundli>` | Vedic | POST /vedic-astrology/birth-chart | South or North Indian kundli |
22
+ | `<roxy-panchang-table>` | Vedic | POST /vedic-astrology/panchang/{basic,detailed} | 15+ muhurtas in detailed mode |
23
+ | `<roxy-dasha-timeline>` | Vedic | POST /vedic-astrology/dasha/{current,major,sub/...} | Vimshottari mahadasha + antardasha + pratyantardasha |
24
+ | `<roxy-dosha-card>` | Vedic | POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati} | Presence, severity, remedies, scoped effects |
25
+ | `<roxy-guna-milan>` | Vedic | POST /vedic-astrology/compatibility | 36-point Ashtakoota with eight sub-scores |
26
+ | `<roxy-kp-planets-table>` | Vedic (KP) | POST /vedic-astrology/kp/planets | Sub-lord and sub-sub-lord columns |
27
+ | `<roxy-numerology-card>` | Numerology | POST /numerology/{life-path,expression,personal-year,chart} | Life path, expression, personal year, full chart |
28
+ | `<roxy-tarot-card>` | Tarot | GET /tarot/cards/{id}, POST /tarot/daily | Single card with upright and reversed flip |
29
+ | `<roxy-tarot-spread>` | Tarot | POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw | Spreads with positions and reading |
30
+ | `<roxy-biorhythm-chart>` | Biorhythm | POST /biorhythm/{daily,forecast,critical-days} | Daily bars, forecast cycle lines, critical days |
31
+ | `<roxy-hexagram>` | I Ching | GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast | Hexagram with trigrams, judgment, image, changing lines |
32
+ | `<roxy-endpoint-form>` | Helper | Any endpoint via x-roxy-ui hints | Schema-driven form, emits roxy-submit |
33
+ | `<roxy-location-search>` | Helper | GET /location/search | Debounced city search input, emits roxy-location-select |
34
+ | `<roxy-data>` | Helper | Any response shape | Generic fallback renderer for unknown shapes |
35
+ <!-- END:COMPONENTS -->
36
+
37
+ ## Integration patterns
38
+
39
+ ### Pattern 1: vanilla HTML, no build step
40
+
41
+ ```html
42
+ <script
43
+ src="https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js"
44
+ crossorigin="anonymous"
45
+ ></script>
46
+
47
+ <roxy-natal-chart id="chart"></roxy-natal-chart>
48
+
49
+ <script type="module">
50
+ const res = await fetch('https://roxyapi.com/api/v2/astrology/natal-chart', {
51
+ method: 'POST',
52
+ headers: { 'Content-Type': 'application/json', 'X-API-Key': 'roxy_xxx' },
53
+ body: JSON.stringify({
54
+ date: '1990-01-15',
55
+ time: '14:30:00',
56
+ latitude: 28.6139,
57
+ longitude: 77.209,
58
+ timezone: 5.5,
59
+ }),
60
+ });
61
+ const data = await res.json();
62
+ document.getElementById('chart').data = data;
63
+ </script>
64
+ ```
65
+
66
+ ### Pattern 2: React, with the typed SDK
67
+
68
+ ```tsx
69
+ import { createRoxy } from '@roxyapi/sdk';
70
+ import { RoxyNatalChart, RoxyLocationSearch } from '@roxyapi/ui-react';
71
+ import { useState } from 'react';
72
+
73
+ const roxy = createRoxy(process.env.NEXT_PUBLIC_ROXY_API_KEY!);
74
+
75
+ export function BirthChartView() {
76
+ const [chart, setChart] = useState(null);
77
+
78
+ const onLocationSelect = async (e: CustomEvent<{ latitude: number; longitude: number; timezone: string }>) => {
79
+ const { data } = await roxy.astrology.generateNatalChart({
80
+ body: { date: '1990-01-15', time: '14:30:00', ...e.detail },
81
+ });
82
+ setChart(data);
83
+ };
84
+
85
+ return (
86
+ <div>
87
+ <RoxyLocationSearch onroxy-location-select={onLocationSelect} />
88
+ {chart && <RoxyNatalChart data={chart} />}
89
+ </div>
90
+ );
91
+ }
92
+ ```
93
+
94
+ ### Pattern 3: schema-driven form
95
+
96
+ `<roxy-endpoint-form>` reads the OpenAPI spec and renders the inputs for any endpoint. Listen for the `roxy-submit` event with the validated payload.
97
+
98
+ ```html
99
+ <roxy-endpoint-form
100
+ data-endpoint="vedic-astrology/birth-chart"
101
+ method="POST"
102
+ submit-label="Generate kundli"
103
+ ></roxy-endpoint-form>
104
+
105
+ <script type="module">
106
+ const form = document.querySelector('roxy-endpoint-form');
107
+ form.addEventListener('roxy-submit', async (e) => {
108
+ const { endpoint, values } = e.detail;
109
+ const res = await fetch(`https://roxyapi.com/api/v2/${endpoint}`, {
110
+ method: 'POST',
111
+ headers: { 'Content-Type': 'application/json', 'X-API-Key': 'roxy_xxx' },
112
+ body: JSON.stringify(values),
113
+ });
114
+ const kundli = await res.json();
115
+ document.querySelector('roxy-vedic-kundli').data = kundli;
116
+ });
117
+ </script>
118
+ ```
119
+
120
+ ### Pattern 4: widgets auto-mount (no JavaScript wiring)
121
+
122
+ Use the publishable key flow for vibecoder embeds.
123
+
124
+ ```html
125
+ <script
126
+ src="https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js"
127
+ defer
128
+ ></script>
129
+
130
+ <div
131
+ data-roxy-widget="natal-chart"
132
+ data-publishable-key="pk_live_xxx"
133
+ data-date="1990-01-15"
134
+ data-time="14:30:00"
135
+ data-latitude="28.6139"
136
+ data-longitude="77.209"
137
+ data-timezone="5.5"
138
+ ></div>
139
+ ```
140
+
141
+ The auto-mount script reads `data-*` attributes, calls the matching endpoint, and renders the matching component.
142
+
143
+ ## Rules every agent must follow
144
+
145
+ - Always call `/location/search` first before any chart endpoint that takes latitude, longitude, or timezone. Use `<roxy-location-search>` for the input UI.
146
+ - Pass the response object directly. Components are stateless; they do not fetch internally except for `<roxy-location-search>`, `<roxy-endpoint-form>`, and the widgets auto-mount script.
147
+ - Use the typed SDK from `@roxyapi/sdk` so prop shapes match the spec automatically.
148
+ - Theming is CSS custom properties on `:root` or per element. Do not write Tailwind classes inside the components; the shadow DOM ignores them.
149
+ - Honor reduced motion. The library already respects `prefers-reduced-motion: reduce` and the `--roxy-motion-duration` variable.
150
+ - A11y violations are CI failures. Do not paste over `role` or `aria-*` attributes; the components emit them correctly already.
151
+
152
+ ## Domain ordering
153
+
154
+ When listing domains in user-visible copy, use the canonical order: Western astrology, Vedic astrology, numerology, tarot, biorhythm, I Ching, crystals, dreams, angel numbers. Location is utility, not a selling domain.
155
+
156
+ ## What not to ship
157
+
158
+ - Do not bundle `@roxyapi/ui` and `@roxyapi/ui-react` together; they are decoupled by design.
159
+ - Use `@roxyapi/ui-react` for React projects. Use `@roxyapi/ui` directly elsewhere.
160
+ - Do not write your own kundli component. The lifted layout in `<roxy-vedic-kundli>` is the canonical RoxyAPI render path.
161
+ - Do not call astrology endpoints with hardcoded coordinates. Always geocode first via `<roxy-location-search>` or `roxy.location.searchCities()`.
162
+
163
+ ## Where to look next
164
+
165
+ - Component source: `packages/ui/src/components/`
166
+ - Sample data for every component: `apps/docs/sample-data.js`
167
+ - Token reference: `packages/ui/THEMING.md`
168
+ - Live preview: `bun run preview` then open `http://localhost:3001`
169
+ - Money endpoints reference: see the RoxyAPI methodology page at `roxyapi.com/methodology`
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Roxy Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,198 @@
1
+ <p align="center">
2
+ <a href="https://roxyapi.com/ui">
3
+ <img src="https://raw.githubusercontent.com/RoxyAPI/ui/main/assets/banner.png" alt="Roxy UI. Beautiful spiritual components in 30 minutes." width="100%">
4
+ </a>
5
+ </p>
6
+
7
+ # @roxyapi/ui
8
+
9
+ [![npm](https://img.shields.io/npm/v/@roxyapi/ui)](https://www.npmjs.com/package/@roxyapi/ui)
10
+ [![Docs](https://img.shields.io/badge/docs-roxyapi.com-blue)](https://roxyapi.com/ui)
11
+ [![API Reference](https://img.shields.io/badge/api%20reference-roxyapi.com-blue)](https://roxyapi.com/api-reference)
12
+ [![Pricing](https://img.shields.io/badge/pricing-roxyapi.com-blue)](https://roxyapi.com/pricing)
13
+
14
+ Web components for the RoxyAPI catalog. Drop astrology, tarot, numerology, and every other RoxyAPI domain into any framework with one script tag or one npm install. Stateless components, typed responses, beautiful defaults in 30 minutes.
15
+
16
+ ## Why developers use Roxy UI
17
+
18
+ - One API key. Charts, tables, cards, forms for every domain in the catalog.
19
+ - Works in React, Vue, Svelte, Angular, Solid, vanilla HTML, WordPress.
20
+ - Stateless. Caller fetches via `@roxyapi/sdk`, passes the response as `data`.
21
+ - Theming via CSS custom properties. No Tailwind required, no class-name overrides.
22
+ - A11y zero violations under axe-core. Keyboard navigation. Reduced-motion honored.
23
+ - Tree-shake friendly. Tight bundle budget enforced in CI.
24
+
25
+ ## Start with one component
26
+
27
+ Vanilla HTML. Three lines. No build step.
28
+
29
+ ```html
30
+ <script
31
+ src="https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js"
32
+ crossorigin="anonymous"
33
+ defer
34
+ ></script>
35
+ <roxy-natal-chart id="chart"></roxy-natal-chart>
36
+ <script type="module">
37
+ import { createRoxy } from 'https://cdn.jsdelivr.net/npm/@roxyapi/sdk@1/dist/factory.js';
38
+ const roxy = createRoxy(import.meta.env?.ROXY_API_KEY);
39
+ const { data } = await roxy.astrology.generateNatalChart({
40
+ body: { date: '1990-01-15', time: '14:30:00', latitude: 28.6139, longitude: 77.209, timezone: 5.5 },
41
+ });
42
+ document.getElementById('chart').data = data;
43
+ </script>
44
+ ```
45
+
46
+ Then add the kundli, the panchang, the dasha timeline, the tarot spread.
47
+
48
+ ## Install
49
+
50
+ ```bash
51
+ npm install @roxyapi/ui
52
+ # or
53
+ bun add @roxyapi/ui
54
+ ```
55
+
56
+ ```ts
57
+ import '@roxyapi/ui';
58
+ // or per component
59
+ import '@roxyapi/ui/components/natal-chart';
60
+ ```
61
+
62
+ React users get a typed package with the same components.
63
+
64
+ ```bash
65
+ npm install @roxyapi/ui-react
66
+ ```
67
+
68
+ ```tsx
69
+ import { RoxyNatalChart } from '@roxyapi/ui-react';
70
+
71
+ export function Chart({ data }: { data: NatalChart }) {
72
+ return <RoxyNatalChart data={data} />;
73
+ }
74
+ ```
75
+
76
+ ## Quick start
77
+
78
+ ```ts
79
+ import { createRoxy } from '@roxyapi/sdk';
80
+ import '@roxyapi/ui';
81
+
82
+ const roxy = createRoxy(process.env.ROXY_API_KEY!);
83
+
84
+ const { data: cities } = await roxy.location.searchCities({ query: { q: 'Mumbai' } });
85
+ const { latitude, longitude, timezone } = cities.cities[0];
86
+
87
+ const { data: kundli } = await roxy.vedicAstrology.generateBirthChart({
88
+ body: { date: '1990-01-15', time: '14:30:00', latitude, longitude, timezone },
89
+ });
90
+
91
+ document.querySelector('roxy-vedic-kundli')!.data = kundli;
92
+ ```
93
+
94
+ Always call `/location/search` first. Every chart endpoint expects latitude, longitude, and timezone.
95
+
96
+ ## Distribution
97
+
98
+ | Surface | URL |
99
+ |---|---|
100
+ | npm `@roxyapi/ui` | `npmjs.com/package/@roxyapi/ui` |
101
+ | npm `@roxyapi/ui-react` | `npmjs.com/package/@roxyapi/ui-react` |
102
+ | jsdelivr full UMD | `cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/roxy-ui.js` |
103
+ | jsdelivr per-component UMD | `cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/components/{name}.js` |
104
+ | Widgets auto-mount | `cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn/widgets.js` |
105
+ | shadcn registry | `bunx shadcn add https://cdn.jsdelivr.net/gh/RoxyAPI/ui@main/registry/{name}.json` |
106
+
107
+ ## Phase 1 components
108
+
109
+ <!-- BEGIN:COMPONENTS -->
110
+ | Element | Domain | Endpoint(s) | What it renders |
111
+ |---|---|---|---|
112
+ | `<roxy-natal-chart>` | Western | POST /astrology/natal-chart | Natal chart wheel with planet glyphs and aspect lines |
113
+ | `<roxy-horoscope-card>` | Western | GET /astrology/horoscope/{sign}/{daily,weekly,monthly} | Daily, weekly, or monthly horoscope card |
114
+ | `<roxy-synastry-chart>` | Western | POST /astrology/synastry | Dual-wheel synastry with inter-aspects table |
115
+ | `<roxy-compatibility-card>` | Cross | POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility | Score card with category breakdown |
116
+ | `<roxy-moon-phase>` | Western | GET /astrology/moon-phase/{current,upcoming,calendar/...} | Moon phase card and calendar |
117
+ | `<roxy-vedic-kundli>` | Vedic | POST /vedic-astrology/birth-chart | South or North Indian kundli |
118
+ | `<roxy-panchang-table>` | Vedic | POST /vedic-astrology/panchang/{basic,detailed} | 15+ muhurtas in detailed mode |
119
+ | `<roxy-dasha-timeline>` | Vedic | POST /vedic-astrology/dasha/{current,major,sub/...} | Vimshottari mahadasha + antardasha + pratyantardasha |
120
+ | `<roxy-dosha-card>` | Vedic | POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati} | Presence, severity, remedies, scoped effects |
121
+ | `<roxy-guna-milan>` | Vedic | POST /vedic-astrology/compatibility | 36-point Ashtakoota with eight sub-scores |
122
+ | `<roxy-kp-planets-table>` | Vedic (KP) | POST /vedic-astrology/kp/planets | Sub-lord and sub-sub-lord columns |
123
+ | `<roxy-numerology-card>` | Numerology | POST /numerology/{life-path,expression,personal-year,chart} | Life path, expression, personal year, full chart |
124
+ | `<roxy-tarot-card>` | Tarot | GET /tarot/cards/{id}, POST /tarot/daily | Single card with upright and reversed flip |
125
+ | `<roxy-tarot-spread>` | Tarot | POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw | Spreads with positions and reading |
126
+ | `<roxy-biorhythm-chart>` | Biorhythm | POST /biorhythm/{daily,forecast,critical-days} | Daily bars, forecast cycle lines, critical days |
127
+ | `<roxy-hexagram>` | I Ching | GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast | Hexagram with trigrams, judgment, image, changing lines |
128
+ | `<roxy-endpoint-form>` | Helper | Any endpoint via x-roxy-ui hints | Schema-driven form, emits roxy-submit |
129
+ | `<roxy-location-search>` | Helper | GET /location/search | Debounced city search input, emits roxy-location-select |
130
+ | `<roxy-data>` | Helper | Any response shape | Generic fallback renderer for unknown shapes |
131
+ <!-- END:COMPONENTS -->
132
+
133
+ ## What you can build
134
+
135
+ - Astrology dating apps with synastry charts and compatibility scores.
136
+ - Kundli matching platforms with Guna Milan and Mangal Dosha checks.
137
+ - Daily horoscope embeds for wellness, news, and lifestyle apps.
138
+ - Tarot reading apps with daily pulls, three-card spreads, and Celtic Cross.
139
+ - Numerology calculators with full-chart breakdowns and personal year forecasts.
140
+ - Biorhythm dashboards with critical-day alerts.
141
+ - I Ching apps with hexagram lookup and three-coin casting.
142
+ - Founder hosted-app surfaces consuming the same components under brand themes.
143
+
144
+ ## Theming
145
+
146
+ Every component reads from `--roxy-*` CSS custom properties. Override globally on `:root` or per element. Light + dark defaults, container queries for responsive layouts at 320px and up. See [THEMING.md](packages/ui/THEMING.md) for the full token reference.
147
+
148
+ ```css
149
+ :root {
150
+ --roxy-accent: #6d28d9;
151
+ --roxy-radius-md: 12px;
152
+ }
153
+
154
+ roxy-natal-chart {
155
+ --roxy-accent: #ec4899;
156
+ }
157
+ ```
158
+
159
+ ## Reliability
160
+
161
+ - Verified astronomical calculations from Roxy Ephemeris, verified against NASA JPL Horizons.
162
+ - Stable, versioned API. New endpoints regenerate component types automatically.
163
+ - Consistent response formats across every domain in the catalog.
164
+ - A11y zero violations enforced in CI.
165
+ - Tight per-component bundle budget enforced in CI.
166
+ - Coverage of the highest-demand endpoints across Western astrology, Vedic astrology, numerology, tarot, biorhythm, I Ching, plus helpers for location search and schema-driven forms.
167
+
168
+ ## Built for AI agents
169
+
170
+ - Works with Claude Code, Cursor, Copilot, Codex, Gemini CLI.
171
+ - Ships with `AGENTS.md` so agents know which component to render for which response.
172
+ - Combines with the `@roxyapi/sdk` for typed prop shapes that match the OpenAPI spec.
173
+ - Remote MCP servers per domain at `roxyapi.com/mcp/{domain}`. No local setup, runs in seconds.
174
+
175
+ ## Build anything, fast
176
+
177
+ ```bash
178
+ git clone https://github.com/RoxyAPI/ui.git
179
+ cd ui
180
+ bun install
181
+ bun run build
182
+ bun run preview
183
+ # http://localhost:3001
184
+ ```
185
+
186
+ Three steps. Thirty minutes. See [examples](examples/) for a full vanilla HTML, React, Vue, and WordPress integration.
187
+
188
+ ## License
189
+
190
+ MIT. See [LICENSE](LICENSE).
191
+
192
+ ## Links
193
+
194
+ - [Documentation](https://roxyapi.com/ui)
195
+ - [API reference](https://roxyapi.com/api-reference)
196
+ - [Methodology](https://roxyapi.com/methodology)
197
+ - [Pricing](https://roxyapi.com/pricing)
198
+ - [Support](https://roxyapi.com/contact)
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
+ export interface RoxyBiorhythmChartProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
+ data?: unknown;
5
+ [attr: string]: unknown;
6
+ }
7
+ export declare const RoxyBiorhythmChart: React.ForwardRefExoticComponent<Omit<RoxyBiorhythmChartProps, "ref"> & React.RefAttributes<HTMLElement>>;
8
+ export {};
9
+ //# sourceMappingURL=biorhythm-chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biorhythm-chart.d.ts","sourceRoot":"","sources":["../../src/components/biorhythm-chart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAElD,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IACvF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,kBAAkB,0GAwB9B,CAAC"}
@@ -0,0 +1,65 @@
1
+ // packages/ui-react/src/components/biorhythm-chart.tsx
2
+ import * as React from "react";
3
+
4
+ // packages/ui-react/src/load-ui.ts
5
+ var SCRIPT_ID = "roxyapi-ui-loader";
6
+ var CDN_BASE = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn";
7
+ var loaded = null;
8
+ function ensureScriptLoaded(version = "0.1.0") {
9
+ if (typeof document === "undefined") return Promise.resolve();
10
+ if (loaded) return loaded;
11
+ loaded = new Promise((resolve, reject) => {
12
+ const major = version.split(".")[0];
13
+ const url = `${CDN_BASE.replace("@0", "@" + major)}/roxy-ui.js`;
14
+ let existing = document.getElementById(SCRIPT_ID);
15
+ if (existing) {
16
+ if (existing.dataset.loaded === "true") {
17
+ resolve();
18
+ } else {
19
+ existing.addEventListener("load", () => resolve());
20
+ existing.addEventListener("error", () => reject(new Error("roxy-ui load failed")));
21
+ }
22
+ return;
23
+ }
24
+ existing = document.createElement("script");
25
+ existing.id = SCRIPT_ID;
26
+ existing.src = url;
27
+ existing.async = true;
28
+ existing.crossOrigin = "anonymous";
29
+ existing.addEventListener("load", () => {
30
+ existing.dataset.loaded = "true";
31
+ resolve();
32
+ });
33
+ existing.addEventListener("error", () => reject(new Error("roxy-ui load failed")));
34
+ document.head.appendChild(existing);
35
+ });
36
+ return loaded;
37
+ }
38
+
39
+ // packages/ui-react/src/components/biorhythm-chart.tsx
40
+ var RoxyBiorhythmChart = React.forwardRef(
41
+ function RoxyBiorhythmChart2({ data, ...rest }, ref) {
42
+ const internal = React.useRef(null);
43
+ React.useImperativeHandle(ref, () => internal.current);
44
+ const [loaded2, setLoaded] = React.useState(false);
45
+ React.useEffect(() => {
46
+ let active = true;
47
+ ensureScriptLoaded().then(() => {
48
+ if (active) setLoaded(true);
49
+ });
50
+ return () => {
51
+ active = false;
52
+ };
53
+ }, []);
54
+ React.useEffect(() => {
55
+ if (internal.current && data !== void 0) {
56
+ internal.current.data = data;
57
+ }
58
+ }, [data, loaded2]);
59
+ return React.createElement("roxy-biorhythm-chart", { ref: internal, ...rest });
60
+ }
61
+ );
62
+ export {
63
+ RoxyBiorhythmChart
64
+ };
65
+ //# sourceMappingURL=biorhythm-chart.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/biorhythm-chart.tsx", "../../src/load-ui.ts"],
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\n\ntype DivAttrs = React.HTMLAttributes<HTMLElement>;\n\nexport interface RoxyBiorhythmChartProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyBiorhythmChart = React.forwardRef<HTMLElement, RoxyBiorhythmChartProps>(\n\tfunction RoxyBiorhythmChart({ data, ...rest }, ref) {\n\t\tconst internal = React.useRef<HTMLElement | null>(null);\n\t\tReact.useImperativeHandle(ref, () => internal.current as HTMLElement);\n\t\tconst [loaded, setLoaded] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tlet active = true;\n\t\t\tensureScriptLoaded().then(() => {\n\t\t\t\tif (active) setLoaded(true);\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t}, []);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (internal.current && data !== undefined) {\n\t\t\t\t(internal.current as unknown as { data: unknown }).data = data;\n\t\t\t}\n\t\t}, [data, loaded]);\n\n\t\treturn React.createElement('roxy-biorhythm-chart', { ref: internal, ...rest });\n\t},\n);\n", "/**\n * Loads the matching component bundle on first mount. Idempotent across\n * many components on the same page. Skips on the server (no document) so\n * React server components and Next.js SSR work without a flash.\n */\nconst SCRIPT_ID = 'roxyapi-ui-loader';\nconst CDN_BASE = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn\";\n\nlet loaded: Promise<void> | null = null;\n\nexport function ensureScriptLoaded(version: string = '0.1.0'): Promise<void> {\n\tif (typeof document === 'undefined') return Promise.resolve();\n\tif (loaded) return loaded;\n\n\tloaded = new Promise<void>((resolve, reject) => {\n\t\tconst major = version.split('.')[0];\n\t\tconst url = `${CDN_BASE.replace('@0', '@' + major)}/roxy-ui.js`;\n\t\tlet existing = document.getElementById(SCRIPT_ID) as HTMLScriptElement | null;\n\t\tif (existing) {\n\t\t\tif (existing.dataset.loaded === 'true') {\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\texisting.addEventListener('load', () => resolve());\n\t\t\t\texisting.addEventListener('error', () => reject(new Error('roxy-ui load failed')));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\texisting = document.createElement('script');\n\t\texisting.id = SCRIPT_ID;\n\t\texisting.src = url;\n\t\texisting.async = true;\n\t\texisting.crossOrigin = 'anonymous';\n\t\texisting.addEventListener('load', () => {\n\t\t\texisting!.dataset.loaded = 'true';\n\t\t\tresolve();\n\t\t});\n\t\texisting.addEventListener('error', () => reject(new Error('roxy-ui load failed')));\n\t\tdocument.head.appendChild(existing);\n\t});\n\treturn loaded;\n}\n"],
5
+ "mappings": ";AAAA,YAAY,WAAW;;;ACKvB,IAAM,YAAY;AAClB,IAAM,WAAW;AAEjB,IAAI,SAA+B;AAE5B,SAAS,mBAAmB,UAAkB,SAAwB;AAC5E,MAAI,OAAO,aAAa,YAAa,QAAO,QAAQ,QAAQ;AAC5D,MAAI,OAAQ,QAAO;AAEnB,WAAS,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,CAAC;AAClC,UAAM,MAAM,GAAG,SAAS,QAAQ,MAAM,MAAM,KAAK,CAAC;AAClD,QAAI,WAAW,SAAS,eAAe,SAAS;AAChD,QAAI,UAAU;AACb,UAAI,SAAS,QAAQ,WAAW,QAAQ;AACvC,gBAAQ;AAAA,MACT,OAAO;AACN,iBAAS,iBAAiB,QAAQ,MAAM,QAAQ,CAAC;AACjD,iBAAS,iBAAiB,SAAS,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC,CAAC;AAAA,MAClF;AACA;AAAA,IACD;AACA,eAAW,SAAS,cAAc,QAAQ;AAC1C,aAAS,KAAK;AACd,aAAS,MAAM;AACf,aAAS,QAAQ;AACjB,aAAS,cAAc;AACvB,aAAS,iBAAiB,QAAQ,MAAM;AACvC,eAAU,QAAQ,SAAS;AAC3B,cAAQ;AAAA,IACT,CAAC;AACD,aAAS,iBAAiB,SAAS,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC,CAAC;AACjF,aAAS,KAAK,YAAY,QAAQ;AAAA,EACnC,CAAC;AACD,SAAO;AACR;;;AD9BO,IAAM,qBAA2B;AAAA,EACvC,SAASA,oBAAmB,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK;AACnD,UAAM,WAAiB,aAA2B,IAAI;AACtD,IAAM,0BAAoB,KAAK,MAAM,SAAS,OAAsB;AACpE,UAAM,CAACC,SAAQ,SAAS,IAAU,eAAS,KAAK;AAEhD,IAAM,gBAAU,MAAM;AACrB,UAAI,SAAS;AACb,yBAAmB,EAAE,KAAK,MAAM;AAC/B,YAAI,OAAQ,WAAU,IAAI;AAAA,MAC3B,CAAC;AACD,aAAO,MAAM;AACZ,iBAAS;AAAA,MACV;AAAA,IACD,GAAG,CAAC,CAAC;AAEL,IAAM,gBAAU,MAAM;AACrB,UAAI,SAAS,WAAW,SAAS,QAAW;AAC3C,QAAC,SAAS,QAAyC,OAAO;AAAA,MAC3D;AAAA,IACD,GAAG,CAAC,MAAMA,OAAM,CAAC;AAEjB,WAAa,oBAAc,wBAAwB,EAAE,KAAK,UAAU,GAAG,KAAK,CAAC;AAAA,EAC9E;AACD;",
6
+ "names": ["RoxyBiorhythmChart", "loaded"]
7
+ }
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
+ export interface RoxyCompatibilityCardProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
+ data?: unknown;
5
+ [attr: string]: unknown;
6
+ }
7
+ export declare const RoxyCompatibilityCard: React.ForwardRefExoticComponent<Omit<RoxyCompatibilityCardProps, "ref"> & React.RefAttributes<HTMLElement>>;
8
+ export {};
9
+ //# sourceMappingURL=compatibility-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility-card.d.ts","sourceRoot":"","sources":["../../src/components/compatibility-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAElD,MAAM,WAAW,0BAA2B,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAC1F,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,qBAAqB,6GAwBjC,CAAC"}
@@ -0,0 +1,65 @@
1
+ // packages/ui-react/src/components/compatibility-card.tsx
2
+ import * as React from "react";
3
+
4
+ // packages/ui-react/src/load-ui.ts
5
+ var SCRIPT_ID = "roxyapi-ui-loader";
6
+ var CDN_BASE = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn";
7
+ var loaded = null;
8
+ function ensureScriptLoaded(version = "0.1.0") {
9
+ if (typeof document === "undefined") return Promise.resolve();
10
+ if (loaded) return loaded;
11
+ loaded = new Promise((resolve, reject) => {
12
+ const major = version.split(".")[0];
13
+ const url = `${CDN_BASE.replace("@0", "@" + major)}/roxy-ui.js`;
14
+ let existing = document.getElementById(SCRIPT_ID);
15
+ if (existing) {
16
+ if (existing.dataset.loaded === "true") {
17
+ resolve();
18
+ } else {
19
+ existing.addEventListener("load", () => resolve());
20
+ existing.addEventListener("error", () => reject(new Error("roxy-ui load failed")));
21
+ }
22
+ return;
23
+ }
24
+ existing = document.createElement("script");
25
+ existing.id = SCRIPT_ID;
26
+ existing.src = url;
27
+ existing.async = true;
28
+ existing.crossOrigin = "anonymous";
29
+ existing.addEventListener("load", () => {
30
+ existing.dataset.loaded = "true";
31
+ resolve();
32
+ });
33
+ existing.addEventListener("error", () => reject(new Error("roxy-ui load failed")));
34
+ document.head.appendChild(existing);
35
+ });
36
+ return loaded;
37
+ }
38
+
39
+ // packages/ui-react/src/components/compatibility-card.tsx
40
+ var RoxyCompatibilityCard = React.forwardRef(
41
+ function RoxyCompatibilityCard2({ data, ...rest }, ref) {
42
+ const internal = React.useRef(null);
43
+ React.useImperativeHandle(ref, () => internal.current);
44
+ const [loaded2, setLoaded] = React.useState(false);
45
+ React.useEffect(() => {
46
+ let active = true;
47
+ ensureScriptLoaded().then(() => {
48
+ if (active) setLoaded(true);
49
+ });
50
+ return () => {
51
+ active = false;
52
+ };
53
+ }, []);
54
+ React.useEffect(() => {
55
+ if (internal.current && data !== void 0) {
56
+ internal.current.data = data;
57
+ }
58
+ }, [data, loaded2]);
59
+ return React.createElement("roxy-compatibility-card", { ref: internal, ...rest });
60
+ }
61
+ );
62
+ export {
63
+ RoxyCompatibilityCard
64
+ };
65
+ //# sourceMappingURL=compatibility-card.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/compatibility-card.tsx", "../../src/load-ui.ts"],
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\n\ntype DivAttrs = React.HTMLAttributes<HTMLElement>;\n\nexport interface RoxyCompatibilityCardProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyCompatibilityCard = React.forwardRef<HTMLElement, RoxyCompatibilityCardProps>(\n\tfunction RoxyCompatibilityCard({ data, ...rest }, ref) {\n\t\tconst internal = React.useRef<HTMLElement | null>(null);\n\t\tReact.useImperativeHandle(ref, () => internal.current as HTMLElement);\n\t\tconst [loaded, setLoaded] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tlet active = true;\n\t\t\tensureScriptLoaded().then(() => {\n\t\t\t\tif (active) setLoaded(true);\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t}, []);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (internal.current && data !== undefined) {\n\t\t\t\t(internal.current as unknown as { data: unknown }).data = data;\n\t\t\t}\n\t\t}, [data, loaded]);\n\n\t\treturn React.createElement('roxy-compatibility-card', { ref: internal, ...rest });\n\t},\n);\n", "/**\n * Loads the matching component bundle on first mount. Idempotent across\n * many components on the same page. Skips on the server (no document) so\n * React server components and Next.js SSR work without a flash.\n */\nconst SCRIPT_ID = 'roxyapi-ui-loader';\nconst CDN_BASE = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn\";\n\nlet loaded: Promise<void> | null = null;\n\nexport function ensureScriptLoaded(version: string = '0.1.0'): Promise<void> {\n\tif (typeof document === 'undefined') return Promise.resolve();\n\tif (loaded) return loaded;\n\n\tloaded = new Promise<void>((resolve, reject) => {\n\t\tconst major = version.split('.')[0];\n\t\tconst url = `${CDN_BASE.replace('@0', '@' + major)}/roxy-ui.js`;\n\t\tlet existing = document.getElementById(SCRIPT_ID) as HTMLScriptElement | null;\n\t\tif (existing) {\n\t\t\tif (existing.dataset.loaded === 'true') {\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\texisting.addEventListener('load', () => resolve());\n\t\t\t\texisting.addEventListener('error', () => reject(new Error('roxy-ui load failed')));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\texisting = document.createElement('script');\n\t\texisting.id = SCRIPT_ID;\n\t\texisting.src = url;\n\t\texisting.async = true;\n\t\texisting.crossOrigin = 'anonymous';\n\t\texisting.addEventListener('load', () => {\n\t\t\texisting!.dataset.loaded = 'true';\n\t\t\tresolve();\n\t\t});\n\t\texisting.addEventListener('error', () => reject(new Error('roxy-ui load failed')));\n\t\tdocument.head.appendChild(existing);\n\t});\n\treturn loaded;\n}\n"],
5
+ "mappings": ";AAAA,YAAY,WAAW;;;ACKvB,IAAM,YAAY;AAClB,IAAM,WAAW;AAEjB,IAAI,SAA+B;AAE5B,SAAS,mBAAmB,UAAkB,SAAwB;AAC5E,MAAI,OAAO,aAAa,YAAa,QAAO,QAAQ,QAAQ;AAC5D,MAAI,OAAQ,QAAO;AAEnB,WAAS,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,CAAC;AAClC,UAAM,MAAM,GAAG,SAAS,QAAQ,MAAM,MAAM,KAAK,CAAC;AAClD,QAAI,WAAW,SAAS,eAAe,SAAS;AAChD,QAAI,UAAU;AACb,UAAI,SAAS,QAAQ,WAAW,QAAQ;AACvC,gBAAQ;AAAA,MACT,OAAO;AACN,iBAAS,iBAAiB,QAAQ,MAAM,QAAQ,CAAC;AACjD,iBAAS,iBAAiB,SAAS,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC,CAAC;AAAA,MAClF;AACA;AAAA,IACD;AACA,eAAW,SAAS,cAAc,QAAQ;AAC1C,aAAS,KAAK;AACd,aAAS,MAAM;AACf,aAAS,QAAQ;AACjB,aAAS,cAAc;AACvB,aAAS,iBAAiB,QAAQ,MAAM;AACvC,eAAU,QAAQ,SAAS;AAC3B,cAAQ;AAAA,IACT,CAAC;AACD,aAAS,iBAAiB,SAAS,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC,CAAC;AACjF,aAAS,KAAK,YAAY,QAAQ;AAAA,EACnC,CAAC;AACD,SAAO;AACR;;;AD9BO,IAAM,wBAA8B;AAAA,EAC1C,SAASA,uBAAsB,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK;AACtD,UAAM,WAAiB,aAA2B,IAAI;AACtD,IAAM,0BAAoB,KAAK,MAAM,SAAS,OAAsB;AACpE,UAAM,CAACC,SAAQ,SAAS,IAAU,eAAS,KAAK;AAEhD,IAAM,gBAAU,MAAM;AACrB,UAAI,SAAS;AACb,yBAAmB,EAAE,KAAK,MAAM;AAC/B,YAAI,OAAQ,WAAU,IAAI;AAAA,MAC3B,CAAC;AACD,aAAO,MAAM;AACZ,iBAAS;AAAA,MACV;AAAA,IACD,GAAG,CAAC,CAAC;AAEL,IAAM,gBAAU,MAAM;AACrB,UAAI,SAAS,WAAW,SAAS,QAAW;AAC3C,QAAC,SAAS,QAAyC,OAAO;AAAA,MAC3D;AAAA,IACD,GAAG,CAAC,MAAMA,OAAM,CAAC;AAEjB,WAAa,oBAAc,2BAA2B,EAAE,KAAK,UAAU,GAAG,KAAK,CAAC;AAAA,EACjF;AACD;",
6
+ "names": ["RoxyCompatibilityCard", "loaded"]
7
+ }
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
+ export interface RoxyDashaTimelineProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
+ data?: unknown;
5
+ [attr: string]: unknown;
6
+ }
7
+ export declare const RoxyDashaTimeline: React.ForwardRefExoticComponent<Omit<RoxyDashaTimelineProps, "ref"> & React.RefAttributes<HTMLElement>>;
8
+ export {};
9
+ //# sourceMappingURL=dasha-timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dasha-timeline.d.ts","sourceRoot":"","sources":["../../src/components/dasha-timeline.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,KAAK,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAElD,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IACtF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,iBAAiB,yGAwB7B,CAAC"}
@@ -0,0 +1,65 @@
1
+ // packages/ui-react/src/components/dasha-timeline.tsx
2
+ import * as React from "react";
3
+
4
+ // packages/ui-react/src/load-ui.ts
5
+ var SCRIPT_ID = "roxyapi-ui-loader";
6
+ var CDN_BASE = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn";
7
+ var loaded = null;
8
+ function ensureScriptLoaded(version = "0.1.0") {
9
+ if (typeof document === "undefined") return Promise.resolve();
10
+ if (loaded) return loaded;
11
+ loaded = new Promise((resolve, reject) => {
12
+ const major = version.split(".")[0];
13
+ const url = `${CDN_BASE.replace("@0", "@" + major)}/roxy-ui.js`;
14
+ let existing = document.getElementById(SCRIPT_ID);
15
+ if (existing) {
16
+ if (existing.dataset.loaded === "true") {
17
+ resolve();
18
+ } else {
19
+ existing.addEventListener("load", () => resolve());
20
+ existing.addEventListener("error", () => reject(new Error("roxy-ui load failed")));
21
+ }
22
+ return;
23
+ }
24
+ existing = document.createElement("script");
25
+ existing.id = SCRIPT_ID;
26
+ existing.src = url;
27
+ existing.async = true;
28
+ existing.crossOrigin = "anonymous";
29
+ existing.addEventListener("load", () => {
30
+ existing.dataset.loaded = "true";
31
+ resolve();
32
+ });
33
+ existing.addEventListener("error", () => reject(new Error("roxy-ui load failed")));
34
+ document.head.appendChild(existing);
35
+ });
36
+ return loaded;
37
+ }
38
+
39
+ // packages/ui-react/src/components/dasha-timeline.tsx
40
+ var RoxyDashaTimeline = React.forwardRef(
41
+ function RoxyDashaTimeline2({ data, ...rest }, ref) {
42
+ const internal = React.useRef(null);
43
+ React.useImperativeHandle(ref, () => internal.current);
44
+ const [loaded2, setLoaded] = React.useState(false);
45
+ React.useEffect(() => {
46
+ let active = true;
47
+ ensureScriptLoaded().then(() => {
48
+ if (active) setLoaded(true);
49
+ });
50
+ return () => {
51
+ active = false;
52
+ };
53
+ }, []);
54
+ React.useEffect(() => {
55
+ if (internal.current && data !== void 0) {
56
+ internal.current.data = data;
57
+ }
58
+ }, [data, loaded2]);
59
+ return React.createElement("roxy-dasha-timeline", { ref: internal, ...rest });
60
+ }
61
+ );
62
+ export {
63
+ RoxyDashaTimeline
64
+ };
65
+ //# sourceMappingURL=dasha-timeline.js.map