@roxyapi/ui-react 0.1.1 → 0.1.3

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 +2 -2
  2. package/LICENSE +21 -0
  3. package/README.md +499 -0
  4. package/dist/components/biorhythm-chart.d.ts +8 -5
  5. package/dist/components/biorhythm-chart.d.ts.map +1 -1
  6. package/dist/components/biorhythm-chart.js +35 -9
  7. package/dist/components/biorhythm-chart.js.map +2 -2
  8. package/dist/components/compatibility-card.d.ts +8 -5
  9. package/dist/components/compatibility-card.d.ts.map +1 -1
  10. package/dist/components/compatibility-card.js +35 -9
  11. package/dist/components/compatibility-card.js.map +2 -2
  12. package/dist/components/dasha-timeline.d.ts +8 -5
  13. package/dist/components/dasha-timeline.d.ts.map +1 -1
  14. package/dist/components/dasha-timeline.js +35 -9
  15. package/dist/components/dasha-timeline.js.map +2 -2
  16. package/dist/components/data.d.ts +6 -4
  17. package/dist/components/data.d.ts.map +1 -1
  18. package/dist/components/data.js +35 -9
  19. package/dist/components/data.js.map +2 -2
  20. package/dist/components/dosha-card.d.ts +8 -5
  21. package/dist/components/dosha-card.d.ts.map +1 -1
  22. package/dist/components/dosha-card.js +35 -9
  23. package/dist/components/dosha-card.js.map +2 -2
  24. package/dist/components/endpoint-form.d.ts +20 -4
  25. package/dist/components/endpoint-form.d.ts.map +1 -1
  26. package/dist/components/endpoint-form.js +59 -9
  27. package/dist/components/endpoint-form.js.map +2 -2
  28. package/dist/components/guna-milan.d.ts +8 -5
  29. package/dist/components/guna-milan.d.ts.map +1 -1
  30. package/dist/components/guna-milan.js +35 -9
  31. package/dist/components/guna-milan.js.map +2 -2
  32. package/dist/components/hexagram.d.ts +8 -5
  33. package/dist/components/hexagram.d.ts.map +1 -1
  34. package/dist/components/hexagram.js +35 -9
  35. package/dist/components/hexagram.js.map +2 -2
  36. package/dist/components/horoscope-card.d.ts +8 -5
  37. package/dist/components/horoscope-card.d.ts.map +1 -1
  38. package/dist/components/horoscope-card.js +35 -9
  39. package/dist/components/horoscope-card.js.map +2 -2
  40. package/dist/components/kp-planets-table.d.ts +8 -5
  41. package/dist/components/kp-planets-table.d.ts.map +1 -1
  42. package/dist/components/kp-planets-table.js +35 -9
  43. package/dist/components/kp-planets-table.js.map +2 -2
  44. package/dist/components/location-search.d.ts +22 -4
  45. package/dist/components/location-search.d.ts.map +1 -1
  46. package/dist/components/location-search.js +51 -9
  47. package/dist/components/location-search.js.map +2 -2
  48. package/dist/components/moon-phase.d.ts +8 -5
  49. package/dist/components/moon-phase.d.ts.map +1 -1
  50. package/dist/components/moon-phase.js +35 -9
  51. package/dist/components/moon-phase.js.map +2 -2
  52. package/dist/components/natal-chart.d.ts +8 -5
  53. package/dist/components/natal-chart.d.ts.map +1 -1
  54. package/dist/components/natal-chart.js +35 -9
  55. package/dist/components/natal-chart.js.map +2 -2
  56. package/dist/components/numerology-card.d.ts +8 -5
  57. package/dist/components/numerology-card.d.ts.map +1 -1
  58. package/dist/components/numerology-card.js +35 -9
  59. package/dist/components/numerology-card.js.map +2 -2
  60. package/dist/components/panchang-table.d.ts +8 -5
  61. package/dist/components/panchang-table.d.ts.map +1 -1
  62. package/dist/components/panchang-table.js +35 -9
  63. package/dist/components/panchang-table.js.map +2 -2
  64. package/dist/components/synastry-chart.d.ts +15 -5
  65. package/dist/components/synastry-chart.d.ts.map +1 -1
  66. package/dist/components/synastry-chart.js +35 -9
  67. package/dist/components/synastry-chart.js.map +2 -2
  68. package/dist/components/tarot-card.d.ts +8 -5
  69. package/dist/components/tarot-card.d.ts.map +1 -1
  70. package/dist/components/tarot-card.js +35 -9
  71. package/dist/components/tarot-card.js.map +2 -2
  72. package/dist/components/tarot-spread.d.ts +8 -5
  73. package/dist/components/tarot-spread.d.ts.map +1 -1
  74. package/dist/components/tarot-spread.js +35 -9
  75. package/dist/components/tarot-spread.js.map +2 -2
  76. package/dist/components/vedic-kundli.d.ts +8 -5
  77. package/dist/components/vedic-kundli.d.ts.map +1 -1
  78. package/dist/components/vedic-kundli.js +35 -9
  79. package/dist/components/vedic-kundli.js.map +2 -2
  80. package/dist/index.cjs +545 -99
  81. package/dist/index.cjs.map +2 -2
  82. package/dist/index.d.ts +20 -20
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +545 -99
  85. package/dist/index.js.map +2 -2
  86. package/dist/load-ui.d.ts +2 -0
  87. package/dist/load-ui.d.ts.map +1 -1
  88. package/dist/load-ui.js +13 -4
  89. package/dist/load-ui.js.map +2 -2
  90. package/package.json +29 -7
  91. package/src/components/biorhythm-chart.d.ts +0 -12
  92. package/src/components/biorhythm-chart.d.ts.map +0 -1
  93. package/src/components/biorhythm-chart.tsx +0 -35
  94. package/src/components/compatibility-card.d.ts +0 -12
  95. package/src/components/compatibility-card.d.ts.map +0 -1
  96. package/src/components/compatibility-card.tsx +0 -35
  97. package/src/components/dasha-timeline.d.ts +0 -12
  98. package/src/components/dasha-timeline.d.ts.map +0 -1
  99. package/src/components/dasha-timeline.tsx +0 -35
  100. package/src/components/data.d.ts +0 -11
  101. package/src/components/data.d.ts.map +0 -1
  102. package/src/components/data.tsx +0 -35
  103. package/src/components/dosha-card.d.ts +0 -12
  104. package/src/components/dosha-card.d.ts.map +0 -1
  105. package/src/components/dosha-card.tsx +0 -35
  106. package/src/components/endpoint-form.d.ts +0 -12
  107. package/src/components/endpoint-form.d.ts.map +0 -1
  108. package/src/components/endpoint-form.tsx +0 -35
  109. package/src/components/guna-milan.d.ts +0 -12
  110. package/src/components/guna-milan.d.ts.map +0 -1
  111. package/src/components/guna-milan.tsx +0 -35
  112. package/src/components/hexagram.d.ts +0 -12
  113. package/src/components/hexagram.d.ts.map +0 -1
  114. package/src/components/hexagram.tsx +0 -35
  115. package/src/components/horoscope-card.d.ts +0 -12
  116. package/src/components/horoscope-card.d.ts.map +0 -1
  117. package/src/components/horoscope-card.tsx +0 -35
  118. package/src/components/kp-planets-table.d.ts +0 -12
  119. package/src/components/kp-planets-table.d.ts.map +0 -1
  120. package/src/components/kp-planets-table.tsx +0 -35
  121. package/src/components/location-search.d.ts +0 -12
  122. package/src/components/location-search.d.ts.map +0 -1
  123. package/src/components/location-search.tsx +0 -35
  124. package/src/components/moon-phase.d.ts +0 -12
  125. package/src/components/moon-phase.d.ts.map +0 -1
  126. package/src/components/moon-phase.tsx +0 -35
  127. package/src/components/natal-chart.d.ts +0 -12
  128. package/src/components/natal-chart.d.ts.map +0 -1
  129. package/src/components/natal-chart.tsx +0 -35
  130. package/src/components/numerology-card.d.ts +0 -12
  131. package/src/components/numerology-card.d.ts.map +0 -1
  132. package/src/components/numerology-card.tsx +0 -35
  133. package/src/components/panchang-table.d.ts +0 -12
  134. package/src/components/panchang-table.d.ts.map +0 -1
  135. package/src/components/panchang-table.tsx +0 -35
  136. package/src/components/synastry-chart.d.ts +0 -12
  137. package/src/components/synastry-chart.d.ts.map +0 -1
  138. package/src/components/synastry-chart.tsx +0 -35
  139. package/src/components/tarot-card.d.ts +0 -12
  140. package/src/components/tarot-card.d.ts.map +0 -1
  141. package/src/components/tarot-card.tsx +0 -35
  142. package/src/components/tarot-spread.d.ts +0 -12
  143. package/src/components/tarot-spread.d.ts.map +0 -1
  144. package/src/components/tarot-spread.tsx +0 -35
  145. package/src/components/vedic-kundli.d.ts +0 -12
  146. package/src/components/vedic-kundli.d.ts.map +0 -1
  147. package/src/components/vedic-kundli.tsx +0 -35
  148. package/src/index.d.ts +0 -21
  149. package/src/index.d.ts.map +0 -1
  150. package/src/index.ts +0 -20
  151. package/src/load-ui.d.ts +0 -2
  152. package/src/load-ui.d.ts.map +0 -1
  153. package/src/load-ui.ts +0 -41
@@ -3,14 +3,19 @@ import * as React from "react";
3
3
 
4
4
  // packages/ui-react/src/load-ui.ts
5
5
  var SCRIPT_ID = "roxyapi-ui-loader";
6
- var CDN_BASE = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn";
6
+ var CDN_BASE_LATEST = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn";
7
+ var CDN_BASE_PREFIX = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@";
8
+ var CDN_BASE_SUFFIX = "/dist/cdn";
7
9
  var loaded = null;
8
- function ensureScriptLoaded(version = "0.1.0") {
10
+ function buildBase(version) {
11
+ if (!version || version === "latest") return CDN_BASE_LATEST;
12
+ return `${CDN_BASE_PREFIX}${version}${CDN_BASE_SUFFIX}`;
13
+ }
14
+ function ensureScriptLoaded(version = "latest") {
9
15
  if (typeof document === "undefined") return Promise.resolve();
10
16
  if (loaded) return loaded;
11
17
  loaded = new Promise((resolve, reject) => {
12
- const major = version.split(".")[0];
13
- const url = `${CDN_BASE.replace("@0", "@" + major)}/roxy-ui.js`;
18
+ const url = `${buildBase(version)}/roxy-ui.js`;
14
19
  let existing = document.getElementById(SCRIPT_ID);
15
20
  if (existing) {
16
21
  if (existing.dataset.loaded === "true") {
@@ -38,25 +43,46 @@ function ensureScriptLoaded(version = "0.1.0") {
38
43
 
39
44
  // packages/ui-react/src/components/numerology-card.tsx
40
45
  var RoxyNumerologyCard = React.forwardRef(
41
- function RoxyNumerologyCard2({ data, ...rest }, ref) {
46
+ function RoxyNumerologyCard2({ data, className, style, ...rest }, ref) {
42
47
  const internal = React.useRef(null);
43
- React.useImperativeHandle(ref, () => internal.current);
48
+ React.useImperativeHandle(
49
+ ref,
50
+ () => internal.current,
51
+ []
52
+ );
44
53
  const [loaded2, setLoaded] = React.useState(false);
54
+ const [error, setError] = React.useState(null);
45
55
  React.useEffect(() => {
46
56
  let active = true;
47
57
  ensureScriptLoaded().then(() => {
48
58
  if (active) setLoaded(true);
59
+ }).catch((err) => {
60
+ if (!active) return;
61
+ setError(err instanceof Error ? err : new Error(String(err)));
49
62
  });
50
63
  return () => {
51
64
  active = false;
52
65
  };
53
66
  }, []);
54
67
  React.useEffect(() => {
55
- if (internal.current && data !== void 0) {
56
- internal.current.data = data;
68
+ const el = internal.current;
69
+ if (el && data !== void 0) {
70
+ el.data = data;
57
71
  }
58
72
  }, [data, loaded2]);
59
- return React.createElement("roxy-numerology-card", { ref: internal, ...rest });
73
+ if (error) {
74
+ return React.createElement(
75
+ "div",
76
+ { role: "alert", className, style },
77
+ `Roxy UI script load failed: ${error.message}`
78
+ );
79
+ }
80
+ return React.createElement("roxy-numerology-card", {
81
+ ref: internal,
82
+ className,
83
+ style,
84
+ ...rest
85
+ });
60
86
  }
61
87
  );
62
88
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/numerology-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 RoxyNumerologyCardProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyNumerologyCard = React.forwardRef<HTMLElement, RoxyNumerologyCardProps>(\n\tfunction RoxyNumerologyCard({ 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-numerology-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,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;",
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\nimport type { CalculateExpressionResponse, CalculateLifePathResponse, CalculatePersonalYearResponse, GenerateNumerologyChartResponse } from '@roxyapi/ui/types';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children' | 'data'\n>;\n\nexport interface RoxyNumerologyCardProps extends ElementAttrs {\n\t/** Spec-derived response payload. Pass the raw RoxyAPI response. */\n\tdata?: CalculateLifePathResponse | CalculateExpressionResponse | CalculatePersonalYearResponse | GenerateNumerologyChartResponse;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\n}\n\nexport const RoxyNumerologyCard = React.forwardRef<HTMLElement | null, RoxyNumerologyCardProps>(\n\tfunction RoxyNumerologyCard({ data, className, style, ...rest }, ref) {\n\t\tconst internal = React.useRef<HTMLElement | null>(null);\n\t\tReact.useImperativeHandle<HTMLElement | null, HTMLElement | null>(\n\t\t\tref,\n\t\t\t() => internal.current,\n\t\t\t[],\n\t\t);\n\t\tconst [loaded, setLoaded] = React.useState(false);\n\t\tconst [error, setError] = React.useState<Error | null>(null);\n\n\t\tReact.useEffect(() => {\n\t\t\tlet active = true;\n\t\t\tensureScriptLoaded()\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (active) setLoaded(true);\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tsetError(err instanceof Error ? err : new Error(String(err)));\n\t\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\tconst el = internal.current;\n\t\t\tif (el && data !== undefined) {\n\t\t\t\t(el as unknown as { data: unknown }).data = data;\n\t\t\t}\n\t\t}, [data, loaded]);\n\n\t\tif (error) {\n\t\t\treturn React.createElement(\n\t\t\t\t'div',\n\t\t\t\t{ role: 'alert', className, style },\n\t\t\t\t`Roxy UI script load failed: ${error.message}`,\n\t\t\t);\n\t\t}\n\n\t\treturn React.createElement('roxy-numerology-card', {\n\t\t\tref: internal,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...rest,\n\t\t});\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 *\n * Pass an explicit `version` (e.g. `'0.1.5'`) to pin the loaded bundle to a\n * specific @roxyapi/ui release; the default ('latest') tracks the marketing\n * snippets and resolves to whatever jsDelivr has cached for @latest.\n */\nconst SCRIPT_ID = 'roxyapi-ui-loader';\nconst CDN_BASE_LATEST = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn\";\nconst CDN_BASE_PREFIX = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@\";\nconst CDN_BASE_SUFFIX = \"/dist/cdn\";\n\nlet loaded: Promise<void> | null = null;\n\nfunction buildBase(version: string): string {\n\tif (!version || version === 'latest') return CDN_BASE_LATEST;\n\treturn `${CDN_BASE_PREFIX}${version}${CDN_BASE_SUFFIX}`;\n}\n\nexport function ensureScriptLoaded(version: string = 'latest'): 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 url = `${buildBase(version)}/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\n// Default export retained for convenience; matches the named export.\nexport default ensureScriptLoaded;\n// Surfaces the embedded @roxyapi/ui version this build of @roxyapi/ui-react\n// was generated against. Useful for diagnostics; not load-bearing.\nexport const ROXY_UI_VERSION = \"0.1.3\";\n"],
5
+ "mappings": ";AAAA,YAAY,WAAW;;;ACSvB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAExB,IAAI,SAA+B;AAEnC,SAAS,UAAU,SAAyB;AAC3C,MAAI,CAAC,WAAW,YAAY,SAAU,QAAO;AAC7C,SAAO,GAAG,eAAe,GAAG,OAAO,GAAG,eAAe;AACtD;AAEO,SAAS,mBAAmB,UAAkB,UAAyB;AAC7E,MAAI,OAAO,aAAa,YAAa,QAAO,QAAQ,QAAQ;AAC5D,MAAI,OAAQ,QAAO;AAEnB,WAAS,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,UAAM,MAAM,GAAG,UAAU,OAAO,CAAC;AACjC,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;;;ADjCO,IAAM,qBAA2B;AAAA,EACvC,SAASA,oBAAmB,EAAE,MAAM,WAAW,OAAO,GAAG,KAAK,GAAG,KAAK;AACrE,UAAM,WAAiB,aAA2B,IAAI;AACtD,IAAM;AAAA,MACL;AAAA,MACA,MAAM,SAAS;AAAA,MACf,CAAC;AAAA,IACF;AACA,UAAM,CAACC,SAAQ,SAAS,IAAU,eAAS,KAAK;AAChD,UAAM,CAAC,OAAO,QAAQ,IAAU,eAAuB,IAAI;AAE3D,IAAM,gBAAU,MAAM;AACrB,UAAI,SAAS;AACb,yBAAmB,EACjB,KAAK,MAAM;AACX,YAAI,OAAQ,WAAU,IAAI;AAAA,MAC3B,CAAC,EACA,MAAM,CAAC,QAAiB;AACxB,YAAI,CAAC,OAAQ;AACb,iBAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,MAC7D,CAAC;AACF,aAAO,MAAM;AACZ,iBAAS;AAAA,MACV;AAAA,IACD,GAAG,CAAC,CAAC;AAEL,IAAM,gBAAU,MAAM;AACrB,YAAM,KAAK,SAAS;AACpB,UAAI,MAAM,SAAS,QAAW;AAC7B,QAAC,GAAoC,OAAO;AAAA,MAC7C;AAAA,IACD,GAAG,CAAC,MAAMA,OAAM,CAAC;AAEjB,QAAI,OAAO;AACV,aAAa;AAAA,QACZ;AAAA,QACA,EAAE,MAAM,SAAS,WAAW,MAAM;AAAA,QAClC,+BAA+B,MAAM,OAAO;AAAA,MAC7C;AAAA,IACD;AAEA,WAAa,oBAAc,wBAAwB;AAAA,MAClD,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACJ,CAAC;AAAA,EACF;AACD;",
6
6
  "names": ["RoxyNumerologyCard", "loaded"]
7
7
  }
@@ -1,9 +1,12 @@
1
1
  import * as React from 'react';
2
- type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
- export interface RoxyPanchangTableProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
- data?: unknown;
5
- [attr: string]: unknown;
2
+ import type { GetBasicPanchangResponse, GetDetailedPanchangResponse } from '@roxyapi/ui/types';
3
+ type ElementAttrs = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'data'>;
4
+ export interface RoxyPanchangTableProps extends ElementAttrs {
5
+ /** Spec-derived response payload. Pass the raw RoxyAPI response. */
6
+ data?: GetBasicPanchangResponse | GetDetailedPanchangResponse;
7
+ className?: string;
8
+ style?: React.CSSProperties;
6
9
  }
7
- export declare const RoxyPanchangTable: React.ForwardRefExoticComponent<Omit<RoxyPanchangTableProps, "ref"> & React.RefAttributes<HTMLElement>>;
10
+ export declare const RoxyPanchangTable: React.ForwardRefExoticComponent<RoxyPanchangTableProps & React.RefAttributes<HTMLElement | null>>;
8
11
  export {};
9
12
  //# sourceMappingURL=panchang-table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"panchang-table.d.ts","sourceRoot":"","sources":["../../src/components/panchang-table.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"}
1
+ {"version":3,"file":"panchang-table.d.ts","sourceRoot":"","sources":["../../src/components/panchang-table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAE/F,KAAK,YAAY,GAAG,IAAI,CACvB,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EACjC,UAAU,GAAG,MAAM,CACnB,CAAC;AAEF,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC3D,oEAAoE;IACpE,IAAI,CAAC,EAAE,wBAAwB,GAAG,2BAA2B,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAE5B;AAED,eAAO,MAAM,iBAAiB,mGAgD7B,CAAC"}
@@ -3,14 +3,19 @@ import * as React from "react";
3
3
 
4
4
  // packages/ui-react/src/load-ui.ts
5
5
  var SCRIPT_ID = "roxyapi-ui-loader";
6
- var CDN_BASE = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn";
6
+ var CDN_BASE_LATEST = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn";
7
+ var CDN_BASE_PREFIX = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@";
8
+ var CDN_BASE_SUFFIX = "/dist/cdn";
7
9
  var loaded = null;
8
- function ensureScriptLoaded(version = "0.1.0") {
10
+ function buildBase(version) {
11
+ if (!version || version === "latest") return CDN_BASE_LATEST;
12
+ return `${CDN_BASE_PREFIX}${version}${CDN_BASE_SUFFIX}`;
13
+ }
14
+ function ensureScriptLoaded(version = "latest") {
9
15
  if (typeof document === "undefined") return Promise.resolve();
10
16
  if (loaded) return loaded;
11
17
  loaded = new Promise((resolve, reject) => {
12
- const major = version.split(".")[0];
13
- const url = `${CDN_BASE.replace("@0", "@" + major)}/roxy-ui.js`;
18
+ const url = `${buildBase(version)}/roxy-ui.js`;
14
19
  let existing = document.getElementById(SCRIPT_ID);
15
20
  if (existing) {
16
21
  if (existing.dataset.loaded === "true") {
@@ -38,25 +43,46 @@ function ensureScriptLoaded(version = "0.1.0") {
38
43
 
39
44
  // packages/ui-react/src/components/panchang-table.tsx
40
45
  var RoxyPanchangTable = React.forwardRef(
41
- function RoxyPanchangTable2({ data, ...rest }, ref) {
46
+ function RoxyPanchangTable2({ data, className, style, ...rest }, ref) {
42
47
  const internal = React.useRef(null);
43
- React.useImperativeHandle(ref, () => internal.current);
48
+ React.useImperativeHandle(
49
+ ref,
50
+ () => internal.current,
51
+ []
52
+ );
44
53
  const [loaded2, setLoaded] = React.useState(false);
54
+ const [error, setError] = React.useState(null);
45
55
  React.useEffect(() => {
46
56
  let active = true;
47
57
  ensureScriptLoaded().then(() => {
48
58
  if (active) setLoaded(true);
59
+ }).catch((err) => {
60
+ if (!active) return;
61
+ setError(err instanceof Error ? err : new Error(String(err)));
49
62
  });
50
63
  return () => {
51
64
  active = false;
52
65
  };
53
66
  }, []);
54
67
  React.useEffect(() => {
55
- if (internal.current && data !== void 0) {
56
- internal.current.data = data;
68
+ const el = internal.current;
69
+ if (el && data !== void 0) {
70
+ el.data = data;
57
71
  }
58
72
  }, [data, loaded2]);
59
- return React.createElement("roxy-panchang-table", { ref: internal, ...rest });
73
+ if (error) {
74
+ return React.createElement(
75
+ "div",
76
+ { role: "alert", className, style },
77
+ `Roxy UI script load failed: ${error.message}`
78
+ );
79
+ }
80
+ return React.createElement("roxy-panchang-table", {
81
+ ref: internal,
82
+ className,
83
+ style,
84
+ ...rest
85
+ });
60
86
  }
61
87
  );
62
88
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/panchang-table.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 RoxyPanchangTableProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyPanchangTable = React.forwardRef<HTMLElement, RoxyPanchangTableProps>(\n\tfunction RoxyPanchangTable({ 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-panchang-table', { 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,oBAA0B;AAAA,EACtC,SAASA,mBAAkB,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK;AAClD,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,uBAAuB,EAAE,KAAK,UAAU,GAAG,KAAK,CAAC;AAAA,EAC7E;AACD;",
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\nimport type { GetBasicPanchangResponse, GetDetailedPanchangResponse } from '@roxyapi/ui/types';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children' | 'data'\n>;\n\nexport interface RoxyPanchangTableProps extends ElementAttrs {\n\t/** Spec-derived response payload. Pass the raw RoxyAPI response. */\n\tdata?: GetBasicPanchangResponse | GetDetailedPanchangResponse;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\n}\n\nexport const RoxyPanchangTable = React.forwardRef<HTMLElement | null, RoxyPanchangTableProps>(\n\tfunction RoxyPanchangTable({ data, className, style, ...rest }, ref) {\n\t\tconst internal = React.useRef<HTMLElement | null>(null);\n\t\tReact.useImperativeHandle<HTMLElement | null, HTMLElement | null>(\n\t\t\tref,\n\t\t\t() => internal.current,\n\t\t\t[],\n\t\t);\n\t\tconst [loaded, setLoaded] = React.useState(false);\n\t\tconst [error, setError] = React.useState<Error | null>(null);\n\n\t\tReact.useEffect(() => {\n\t\t\tlet active = true;\n\t\t\tensureScriptLoaded()\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (active) setLoaded(true);\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tsetError(err instanceof Error ? err : new Error(String(err)));\n\t\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\tconst el = internal.current;\n\t\t\tif (el && data !== undefined) {\n\t\t\t\t(el as unknown as { data: unknown }).data = data;\n\t\t\t}\n\t\t}, [data, loaded]);\n\n\t\tif (error) {\n\t\t\treturn React.createElement(\n\t\t\t\t'div',\n\t\t\t\t{ role: 'alert', className, style },\n\t\t\t\t`Roxy UI script load failed: ${error.message}`,\n\t\t\t);\n\t\t}\n\n\t\treturn React.createElement('roxy-panchang-table', {\n\t\t\tref: internal,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...rest,\n\t\t});\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 *\n * Pass an explicit `version` (e.g. `'0.1.5'`) to pin the loaded bundle to a\n * specific @roxyapi/ui release; the default ('latest') tracks the marketing\n * snippets and resolves to whatever jsDelivr has cached for @latest.\n */\nconst SCRIPT_ID = 'roxyapi-ui-loader';\nconst CDN_BASE_LATEST = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn\";\nconst CDN_BASE_PREFIX = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@\";\nconst CDN_BASE_SUFFIX = \"/dist/cdn\";\n\nlet loaded: Promise<void> | null = null;\n\nfunction buildBase(version: string): string {\n\tif (!version || version === 'latest') return CDN_BASE_LATEST;\n\treturn `${CDN_BASE_PREFIX}${version}${CDN_BASE_SUFFIX}`;\n}\n\nexport function ensureScriptLoaded(version: string = 'latest'): 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 url = `${buildBase(version)}/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\n// Default export retained for convenience; matches the named export.\nexport default ensureScriptLoaded;\n// Surfaces the embedded @roxyapi/ui version this build of @roxyapi/ui-react\n// was generated against. Useful for diagnostics; not load-bearing.\nexport const ROXY_UI_VERSION = \"0.1.3\";\n"],
5
+ "mappings": ";AAAA,YAAY,WAAW;;;ACSvB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAExB,IAAI,SAA+B;AAEnC,SAAS,UAAU,SAAyB;AAC3C,MAAI,CAAC,WAAW,YAAY,SAAU,QAAO;AAC7C,SAAO,GAAG,eAAe,GAAG,OAAO,GAAG,eAAe;AACtD;AAEO,SAAS,mBAAmB,UAAkB,UAAyB;AAC7E,MAAI,OAAO,aAAa,YAAa,QAAO,QAAQ,QAAQ;AAC5D,MAAI,OAAQ,QAAO;AAEnB,WAAS,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,UAAM,MAAM,GAAG,UAAU,OAAO,CAAC;AACjC,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;;;ADjCO,IAAM,oBAA0B;AAAA,EACtC,SAASA,mBAAkB,EAAE,MAAM,WAAW,OAAO,GAAG,KAAK,GAAG,KAAK;AACpE,UAAM,WAAiB,aAA2B,IAAI;AACtD,IAAM;AAAA,MACL;AAAA,MACA,MAAM,SAAS;AAAA,MACf,CAAC;AAAA,IACF;AACA,UAAM,CAACC,SAAQ,SAAS,IAAU,eAAS,KAAK;AAChD,UAAM,CAAC,OAAO,QAAQ,IAAU,eAAuB,IAAI;AAE3D,IAAM,gBAAU,MAAM;AACrB,UAAI,SAAS;AACb,yBAAmB,EACjB,KAAK,MAAM;AACX,YAAI,OAAQ,WAAU,IAAI;AAAA,MAC3B,CAAC,EACA,MAAM,CAAC,QAAiB;AACxB,YAAI,CAAC,OAAQ;AACb,iBAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,MAC7D,CAAC;AACF,aAAO,MAAM;AACZ,iBAAS;AAAA,MACV;AAAA,IACD,GAAG,CAAC,CAAC;AAEL,IAAM,gBAAU,MAAM;AACrB,YAAM,KAAK,SAAS;AACpB,UAAI,MAAM,SAAS,QAAW;AAC7B,QAAC,GAAoC,OAAO;AAAA,MAC7C;AAAA,IACD,GAAG,CAAC,MAAMA,OAAM,CAAC;AAEjB,QAAI,OAAO;AACV,aAAa;AAAA,QACZ;AAAA,QACA,EAAE,MAAM,SAAS,WAAW,MAAM;AAAA,QAClC,+BAA+B,MAAM,OAAO;AAAA,MAC7C;AAAA,IACD;AAEA,WAAa,oBAAc,uBAAuB;AAAA,MACjD,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACJ,CAAC;AAAA,EACF;AACD;",
6
6
  "names": ["RoxyPanchangTable", "loaded"]
7
7
  }
@@ -1,9 +1,19 @@
1
1
  import * as React from 'react';
2
- type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
- export interface RoxySynastryChartProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
- data?: unknown;
5
- [attr: string]: unknown;
2
+ import type { CalculateSynastryResponse, NatalChartResponse } from '@roxyapi/ui/types';
3
+ type ElementAttrs = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'data'>;
4
+ export interface RoxySynastryChartProps extends ElementAttrs {
5
+ /** Spec-derived response payload. Pass the raw RoxyAPI response. */
6
+ data?: CalculateSynastryResponse & {
7
+ person1?: {
8
+ planets?: NatalChartResponse['planets'];
9
+ };
10
+ person2?: {
11
+ planets?: NatalChartResponse['planets'];
12
+ };
13
+ };
14
+ className?: string;
15
+ style?: React.CSSProperties;
6
16
  }
7
- export declare const RoxySynastryChart: React.ForwardRefExoticComponent<Omit<RoxySynastryChartProps, "ref"> & React.RefAttributes<HTMLElement>>;
17
+ export declare const RoxySynastryChart: React.ForwardRefExoticComponent<RoxySynastryChartProps & React.RefAttributes<HTMLElement | null>>;
8
18
  export {};
9
19
  //# sourceMappingURL=synastry-chart.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"synastry-chart.d.ts","sourceRoot":"","sources":["../../src/components/synastry-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,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"}
1
+ {"version":3,"file":"synastry-chart.d.ts","sourceRoot":"","sources":["../../src/components/synastry-chart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvF,KAAK,YAAY,GAAG,IAAI,CACvB,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EACjC,UAAU,GAAG,MAAM,CACnB,CAAC;AAEF,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC3D,oEAAoE;IACpE,IAAI,CAAC,EAAE,yBAAyB,GAAG;QAAE,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;SAAE,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;IACpJ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAE5B;AAED,eAAO,MAAM,iBAAiB,mGAgD7B,CAAC"}
@@ -3,14 +3,19 @@ import * as React from "react";
3
3
 
4
4
  // packages/ui-react/src/load-ui.ts
5
5
  var SCRIPT_ID = "roxyapi-ui-loader";
6
- var CDN_BASE = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn";
6
+ var CDN_BASE_LATEST = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn";
7
+ var CDN_BASE_PREFIX = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@";
8
+ var CDN_BASE_SUFFIX = "/dist/cdn";
7
9
  var loaded = null;
8
- function ensureScriptLoaded(version = "0.1.0") {
10
+ function buildBase(version) {
11
+ if (!version || version === "latest") return CDN_BASE_LATEST;
12
+ return `${CDN_BASE_PREFIX}${version}${CDN_BASE_SUFFIX}`;
13
+ }
14
+ function ensureScriptLoaded(version = "latest") {
9
15
  if (typeof document === "undefined") return Promise.resolve();
10
16
  if (loaded) return loaded;
11
17
  loaded = new Promise((resolve, reject) => {
12
- const major = version.split(".")[0];
13
- const url = `${CDN_BASE.replace("@0", "@" + major)}/roxy-ui.js`;
18
+ const url = `${buildBase(version)}/roxy-ui.js`;
14
19
  let existing = document.getElementById(SCRIPT_ID);
15
20
  if (existing) {
16
21
  if (existing.dataset.loaded === "true") {
@@ -38,25 +43,46 @@ function ensureScriptLoaded(version = "0.1.0") {
38
43
 
39
44
  // packages/ui-react/src/components/synastry-chart.tsx
40
45
  var RoxySynastryChart = React.forwardRef(
41
- function RoxySynastryChart2({ data, ...rest }, ref) {
46
+ function RoxySynastryChart2({ data, className, style, ...rest }, ref) {
42
47
  const internal = React.useRef(null);
43
- React.useImperativeHandle(ref, () => internal.current);
48
+ React.useImperativeHandle(
49
+ ref,
50
+ () => internal.current,
51
+ []
52
+ );
44
53
  const [loaded2, setLoaded] = React.useState(false);
54
+ const [error, setError] = React.useState(null);
45
55
  React.useEffect(() => {
46
56
  let active = true;
47
57
  ensureScriptLoaded().then(() => {
48
58
  if (active) setLoaded(true);
59
+ }).catch((err) => {
60
+ if (!active) return;
61
+ setError(err instanceof Error ? err : new Error(String(err)));
49
62
  });
50
63
  return () => {
51
64
  active = false;
52
65
  };
53
66
  }, []);
54
67
  React.useEffect(() => {
55
- if (internal.current && data !== void 0) {
56
- internal.current.data = data;
68
+ const el = internal.current;
69
+ if (el && data !== void 0) {
70
+ el.data = data;
57
71
  }
58
72
  }, [data, loaded2]);
59
- return React.createElement("roxy-synastry-chart", { ref: internal, ...rest });
73
+ if (error) {
74
+ return React.createElement(
75
+ "div",
76
+ { role: "alert", className, style },
77
+ `Roxy UI script load failed: ${error.message}`
78
+ );
79
+ }
80
+ return React.createElement("roxy-synastry-chart", {
81
+ ref: internal,
82
+ className,
83
+ style,
84
+ ...rest
85
+ });
60
86
  }
61
87
  );
62
88
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/synastry-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 RoxySynastryChartProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxySynastryChart = React.forwardRef<HTMLElement, RoxySynastryChartProps>(\n\tfunction RoxySynastryChart({ 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-synastry-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,oBAA0B;AAAA,EACtC,SAASA,mBAAkB,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK;AAClD,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,uBAAuB,EAAE,KAAK,UAAU,GAAG,KAAK,CAAC;AAAA,EAC7E;AACD;",
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\nimport type { CalculateSynastryResponse, NatalChartResponse } from '@roxyapi/ui/types';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children' | 'data'\n>;\n\nexport interface RoxySynastryChartProps extends ElementAttrs {\n\t/** Spec-derived response payload. Pass the raw RoxyAPI response. */\n\tdata?: CalculateSynastryResponse & { person1?: { planets?: NatalChartResponse['planets'] }; person2?: { planets?: NatalChartResponse['planets'] } };\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\n}\n\nexport const RoxySynastryChart = React.forwardRef<HTMLElement | null, RoxySynastryChartProps>(\n\tfunction RoxySynastryChart({ data, className, style, ...rest }, ref) {\n\t\tconst internal = React.useRef<HTMLElement | null>(null);\n\t\tReact.useImperativeHandle<HTMLElement | null, HTMLElement | null>(\n\t\t\tref,\n\t\t\t() => internal.current,\n\t\t\t[],\n\t\t);\n\t\tconst [loaded, setLoaded] = React.useState(false);\n\t\tconst [error, setError] = React.useState<Error | null>(null);\n\n\t\tReact.useEffect(() => {\n\t\t\tlet active = true;\n\t\t\tensureScriptLoaded()\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (active) setLoaded(true);\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tsetError(err instanceof Error ? err : new Error(String(err)));\n\t\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\tconst el = internal.current;\n\t\t\tif (el && data !== undefined) {\n\t\t\t\t(el as unknown as { data: unknown }).data = data;\n\t\t\t}\n\t\t}, [data, loaded]);\n\n\t\tif (error) {\n\t\t\treturn React.createElement(\n\t\t\t\t'div',\n\t\t\t\t{ role: 'alert', className, style },\n\t\t\t\t`Roxy UI script load failed: ${error.message}`,\n\t\t\t);\n\t\t}\n\n\t\treturn React.createElement('roxy-synastry-chart', {\n\t\t\tref: internal,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...rest,\n\t\t});\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 *\n * Pass an explicit `version` (e.g. `'0.1.5'`) to pin the loaded bundle to a\n * specific @roxyapi/ui release; the default ('latest') tracks the marketing\n * snippets and resolves to whatever jsDelivr has cached for @latest.\n */\nconst SCRIPT_ID = 'roxyapi-ui-loader';\nconst CDN_BASE_LATEST = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn\";\nconst CDN_BASE_PREFIX = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@\";\nconst CDN_BASE_SUFFIX = \"/dist/cdn\";\n\nlet loaded: Promise<void> | null = null;\n\nfunction buildBase(version: string): string {\n\tif (!version || version === 'latest') return CDN_BASE_LATEST;\n\treturn `${CDN_BASE_PREFIX}${version}${CDN_BASE_SUFFIX}`;\n}\n\nexport function ensureScriptLoaded(version: string = 'latest'): 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 url = `${buildBase(version)}/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\n// Default export retained for convenience; matches the named export.\nexport default ensureScriptLoaded;\n// Surfaces the embedded @roxyapi/ui version this build of @roxyapi/ui-react\n// was generated against. Useful for diagnostics; not load-bearing.\nexport const ROXY_UI_VERSION = \"0.1.3\";\n"],
5
+ "mappings": ";AAAA,YAAY,WAAW;;;ACSvB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAExB,IAAI,SAA+B;AAEnC,SAAS,UAAU,SAAyB;AAC3C,MAAI,CAAC,WAAW,YAAY,SAAU,QAAO;AAC7C,SAAO,GAAG,eAAe,GAAG,OAAO,GAAG,eAAe;AACtD;AAEO,SAAS,mBAAmB,UAAkB,UAAyB;AAC7E,MAAI,OAAO,aAAa,YAAa,QAAO,QAAQ,QAAQ;AAC5D,MAAI,OAAQ,QAAO;AAEnB,WAAS,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,UAAM,MAAM,GAAG,UAAU,OAAO,CAAC;AACjC,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;;;ADjCO,IAAM,oBAA0B;AAAA,EACtC,SAASA,mBAAkB,EAAE,MAAM,WAAW,OAAO,GAAG,KAAK,GAAG,KAAK;AACpE,UAAM,WAAiB,aAA2B,IAAI;AACtD,IAAM;AAAA,MACL;AAAA,MACA,MAAM,SAAS;AAAA,MACf,CAAC;AAAA,IACF;AACA,UAAM,CAACC,SAAQ,SAAS,IAAU,eAAS,KAAK;AAChD,UAAM,CAAC,OAAO,QAAQ,IAAU,eAAuB,IAAI;AAE3D,IAAM,gBAAU,MAAM;AACrB,UAAI,SAAS;AACb,yBAAmB,EACjB,KAAK,MAAM;AACX,YAAI,OAAQ,WAAU,IAAI;AAAA,MAC3B,CAAC,EACA,MAAM,CAAC,QAAiB;AACxB,YAAI,CAAC,OAAQ;AACb,iBAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,MAC7D,CAAC;AACF,aAAO,MAAM;AACZ,iBAAS;AAAA,MACV;AAAA,IACD,GAAG,CAAC,CAAC;AAEL,IAAM,gBAAU,MAAM;AACrB,YAAM,KAAK,SAAS;AACpB,UAAI,MAAM,SAAS,QAAW;AAC7B,QAAC,GAAoC,OAAO;AAAA,MAC7C;AAAA,IACD,GAAG,CAAC,MAAMA,OAAM,CAAC;AAEjB,QAAI,OAAO;AACV,aAAa;AAAA,QACZ;AAAA,QACA,EAAE,MAAM,SAAS,WAAW,MAAM;AAAA,QAClC,+BAA+B,MAAM,OAAO;AAAA,MAC7C;AAAA,IACD;AAEA,WAAa,oBAAc,uBAAuB;AAAA,MACjD,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACJ,CAAC;AAAA,EACF;AACD;",
6
6
  "names": ["RoxySynastryChart", "loaded"]
7
7
  }
@@ -1,9 +1,12 @@
1
1
  import * as React from 'react';
2
- type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
- export interface RoxyTarotCardProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
- data?: unknown;
5
- [attr: string]: unknown;
2
+ import type { GetCardResponse, GetDailyCardResponse } from '@roxyapi/ui/types';
3
+ type ElementAttrs = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'data'>;
4
+ export interface RoxyTarotCardProps extends ElementAttrs {
5
+ /** Spec-derived response payload. Pass the raw RoxyAPI response. */
6
+ data?: GetCardResponse | GetDailyCardResponse;
7
+ className?: string;
8
+ style?: React.CSSProperties;
6
9
  }
7
- export declare const RoxyTarotCard: React.ForwardRefExoticComponent<Omit<RoxyTarotCardProps, "ref"> & React.RefAttributes<HTMLElement>>;
10
+ export declare const RoxyTarotCard: React.ForwardRefExoticComponent<RoxyTarotCardProps & React.RefAttributes<HTMLElement | null>>;
8
11
  export {};
9
12
  //# sourceMappingURL=tarot-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tarot-card.d.ts","sourceRoot":"","sources":["../../src/components/tarot-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,kBAAmB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,aAAa,qGAwBzB,CAAC"}
1
+ {"version":3,"file":"tarot-card.d.ts","sourceRoot":"","sources":["../../src/components/tarot-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE/E,KAAK,YAAY,GAAG,IAAI,CACvB,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EACjC,UAAU,GAAG,MAAM,CACnB,CAAC;AAEF,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD,oEAAoE;IACpE,IAAI,CAAC,EAAE,eAAe,GAAG,oBAAoB,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAE5B;AAED,eAAO,MAAM,aAAa,+FAgDzB,CAAC"}
@@ -3,14 +3,19 @@ import * as React from "react";
3
3
 
4
4
  // packages/ui-react/src/load-ui.ts
5
5
  var SCRIPT_ID = "roxyapi-ui-loader";
6
- var CDN_BASE = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@0/dist/cdn";
6
+ var CDN_BASE_LATEST = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn";
7
+ var CDN_BASE_PREFIX = "https://cdn.jsdelivr.net/npm/@roxyapi/ui@";
8
+ var CDN_BASE_SUFFIX = "/dist/cdn";
7
9
  var loaded = null;
8
- function ensureScriptLoaded(version = "0.1.0") {
10
+ function buildBase(version) {
11
+ if (!version || version === "latest") return CDN_BASE_LATEST;
12
+ return `${CDN_BASE_PREFIX}${version}${CDN_BASE_SUFFIX}`;
13
+ }
14
+ function ensureScriptLoaded(version = "latest") {
9
15
  if (typeof document === "undefined") return Promise.resolve();
10
16
  if (loaded) return loaded;
11
17
  loaded = new Promise((resolve, reject) => {
12
- const major = version.split(".")[0];
13
- const url = `${CDN_BASE.replace("@0", "@" + major)}/roxy-ui.js`;
18
+ const url = `${buildBase(version)}/roxy-ui.js`;
14
19
  let existing = document.getElementById(SCRIPT_ID);
15
20
  if (existing) {
16
21
  if (existing.dataset.loaded === "true") {
@@ -38,25 +43,46 @@ function ensureScriptLoaded(version = "0.1.0") {
38
43
 
39
44
  // packages/ui-react/src/components/tarot-card.tsx
40
45
  var RoxyTarotCard = React.forwardRef(
41
- function RoxyTarotCard2({ data, ...rest }, ref) {
46
+ function RoxyTarotCard2({ data, className, style, ...rest }, ref) {
42
47
  const internal = React.useRef(null);
43
- React.useImperativeHandle(ref, () => internal.current);
48
+ React.useImperativeHandle(
49
+ ref,
50
+ () => internal.current,
51
+ []
52
+ );
44
53
  const [loaded2, setLoaded] = React.useState(false);
54
+ const [error, setError] = React.useState(null);
45
55
  React.useEffect(() => {
46
56
  let active = true;
47
57
  ensureScriptLoaded().then(() => {
48
58
  if (active) setLoaded(true);
59
+ }).catch((err) => {
60
+ if (!active) return;
61
+ setError(err instanceof Error ? err : new Error(String(err)));
49
62
  });
50
63
  return () => {
51
64
  active = false;
52
65
  };
53
66
  }, []);
54
67
  React.useEffect(() => {
55
- if (internal.current && data !== void 0) {
56
- internal.current.data = data;
68
+ const el = internal.current;
69
+ if (el && data !== void 0) {
70
+ el.data = data;
57
71
  }
58
72
  }, [data, loaded2]);
59
- return React.createElement("roxy-tarot-card", { ref: internal, ...rest });
73
+ if (error) {
74
+ return React.createElement(
75
+ "div",
76
+ { role: "alert", className, style },
77
+ `Roxy UI script load failed: ${error.message}`
78
+ );
79
+ }
80
+ return React.createElement("roxy-tarot-card", {
81
+ ref: internal,
82
+ className,
83
+ style,
84
+ ...rest
85
+ });
60
86
  }
61
87
  );
62
88
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/tarot-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 RoxyTarotCardProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyTarotCard = React.forwardRef<HTMLElement, RoxyTarotCardProps>(\n\tfunction RoxyTarotCard({ 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-tarot-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,gBAAsB;AAAA,EAClC,SAASA,eAAc,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK;AAC9C,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,mBAAmB,EAAE,KAAK,UAAU,GAAG,KAAK,CAAC;AAAA,EACzE;AACD;",
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\nimport type { GetCardResponse, GetDailyCardResponse } from '@roxyapi/ui/types';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children' | 'data'\n>;\n\nexport interface RoxyTarotCardProps extends ElementAttrs {\n\t/** Spec-derived response payload. Pass the raw RoxyAPI response. */\n\tdata?: GetCardResponse | GetDailyCardResponse;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\n}\n\nexport const RoxyTarotCard = React.forwardRef<HTMLElement | null, RoxyTarotCardProps>(\n\tfunction RoxyTarotCard({ data, className, style, ...rest }, ref) {\n\t\tconst internal = React.useRef<HTMLElement | null>(null);\n\t\tReact.useImperativeHandle<HTMLElement | null, HTMLElement | null>(\n\t\t\tref,\n\t\t\t() => internal.current,\n\t\t\t[],\n\t\t);\n\t\tconst [loaded, setLoaded] = React.useState(false);\n\t\tconst [error, setError] = React.useState<Error | null>(null);\n\n\t\tReact.useEffect(() => {\n\t\t\tlet active = true;\n\t\t\tensureScriptLoaded()\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (active) setLoaded(true);\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tsetError(err instanceof Error ? err : new Error(String(err)));\n\t\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\tconst el = internal.current;\n\t\t\tif (el && data !== undefined) {\n\t\t\t\t(el as unknown as { data: unknown }).data = data;\n\t\t\t}\n\t\t}, [data, loaded]);\n\n\t\tif (error) {\n\t\t\treturn React.createElement(\n\t\t\t\t'div',\n\t\t\t\t{ role: 'alert', className, style },\n\t\t\t\t`Roxy UI script load failed: ${error.message}`,\n\t\t\t);\n\t\t}\n\n\t\treturn React.createElement('roxy-tarot-card', {\n\t\t\tref: internal,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...rest,\n\t\t});\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 *\n * Pass an explicit `version` (e.g. `'0.1.5'`) to pin the loaded bundle to a\n * specific @roxyapi/ui release; the default ('latest') tracks the marketing\n * snippets and resolves to whatever jsDelivr has cached for @latest.\n */\nconst SCRIPT_ID = 'roxyapi-ui-loader';\nconst CDN_BASE_LATEST = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn\";\nconst CDN_BASE_PREFIX = \"https://cdn.jsdelivr.net/npm/@roxyapi/ui@\";\nconst CDN_BASE_SUFFIX = \"/dist/cdn\";\n\nlet loaded: Promise<void> | null = null;\n\nfunction buildBase(version: string): string {\n\tif (!version || version === 'latest') return CDN_BASE_LATEST;\n\treturn `${CDN_BASE_PREFIX}${version}${CDN_BASE_SUFFIX}`;\n}\n\nexport function ensureScriptLoaded(version: string = 'latest'): 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 url = `${buildBase(version)}/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\n// Default export retained for convenience; matches the named export.\nexport default ensureScriptLoaded;\n// Surfaces the embedded @roxyapi/ui version this build of @roxyapi/ui-react\n// was generated against. Useful for diagnostics; not load-bearing.\nexport const ROXY_UI_VERSION = \"0.1.3\";\n"],
5
+ "mappings": ";AAAA,YAAY,WAAW;;;ACSvB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAExB,IAAI,SAA+B;AAEnC,SAAS,UAAU,SAAyB;AAC3C,MAAI,CAAC,WAAW,YAAY,SAAU,QAAO;AAC7C,SAAO,GAAG,eAAe,GAAG,OAAO,GAAG,eAAe;AACtD;AAEO,SAAS,mBAAmB,UAAkB,UAAyB;AAC7E,MAAI,OAAO,aAAa,YAAa,QAAO,QAAQ,QAAQ;AAC5D,MAAI,OAAQ,QAAO;AAEnB,WAAS,IAAI,QAAc,CAAC,SAAS,WAAW;AAC/C,UAAM,MAAM,GAAG,UAAU,OAAO,CAAC;AACjC,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;;;ADjCO,IAAM,gBAAsB;AAAA,EAClC,SAASA,eAAc,EAAE,MAAM,WAAW,OAAO,GAAG,KAAK,GAAG,KAAK;AAChE,UAAM,WAAiB,aAA2B,IAAI;AACtD,IAAM;AAAA,MACL;AAAA,MACA,MAAM,SAAS;AAAA,MACf,CAAC;AAAA,IACF;AACA,UAAM,CAACC,SAAQ,SAAS,IAAU,eAAS,KAAK;AAChD,UAAM,CAAC,OAAO,QAAQ,IAAU,eAAuB,IAAI;AAE3D,IAAM,gBAAU,MAAM;AACrB,UAAI,SAAS;AACb,yBAAmB,EACjB,KAAK,MAAM;AACX,YAAI,OAAQ,WAAU,IAAI;AAAA,MAC3B,CAAC,EACA,MAAM,CAAC,QAAiB;AACxB,YAAI,CAAC,OAAQ;AACb,iBAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,MAC7D,CAAC;AACF,aAAO,MAAM;AACZ,iBAAS;AAAA,MACV;AAAA,IACD,GAAG,CAAC,CAAC;AAEL,IAAM,gBAAU,MAAM;AACrB,YAAM,KAAK,SAAS;AACpB,UAAI,MAAM,SAAS,QAAW;AAC7B,QAAC,GAAoC,OAAO;AAAA,MAC7C;AAAA,IACD,GAAG,CAAC,MAAMA,OAAM,CAAC;AAEjB,QAAI,OAAO;AACV,aAAa;AAAA,QACZ;AAAA,QACA,EAAE,MAAM,SAAS,WAAW,MAAM;AAAA,QAClC,+BAA+B,MAAM,OAAO;AAAA,MAC7C;AAAA,IACD;AAEA,WAAa,oBAAc,mBAAmB;AAAA,MAC7C,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACJ,CAAC;AAAA,EACF;AACD;",
6
6
  "names": ["RoxyTarotCard", "loaded"]
7
7
  }
@@ -1,9 +1,12 @@
1
1
  import * as React from 'react';
2
- type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
- export interface RoxyTarotSpreadProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
- data?: unknown;
5
- [attr: string]: unknown;
2
+ import type { CastCelticCrossResponse, CastLoveSpreadResponse, CastReadingResponse, CastThreeCardResponse, CastYesNoResponse, DrawCardsResponse } from '@roxyapi/ui/types';
3
+ type ElementAttrs = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'data'>;
4
+ export interface RoxyTarotSpreadProps extends ElementAttrs {
5
+ /** Spec-derived response payload. Pass the raw RoxyAPI response. */
6
+ data?: CastThreeCardResponse | CastCelticCrossResponse | CastLoveSpreadResponse | CastYesNoResponse | CastReadingResponse | DrawCardsResponse;
7
+ className?: string;
8
+ style?: React.CSSProperties;
6
9
  }
7
- export declare const RoxyTarotSpread: React.ForwardRefExoticComponent<Omit<RoxyTarotSpreadProps, "ref"> & React.RefAttributes<HTMLElement>>;
10
+ export declare const RoxyTarotSpread: React.ForwardRefExoticComponent<RoxyTarotSpreadProps & React.RefAttributes<HTMLElement | null>>;
8
11
  export {};
9
12
  //# sourceMappingURL=tarot-spread.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tarot-spread.d.ts","sourceRoot":"","sources":["../../src/components/tarot-spread.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,oBAAqB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IACpF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,uGAwB3B,CAAC"}
1
+ {"version":3,"file":"tarot-spread.d.ts","sourceRoot":"","sources":["../../src/components/tarot-spread.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3K,KAAK,YAAY,GAAG,IAAI,CACvB,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EACjC,UAAU,GAAG,MAAM,CACnB,CAAC;AAEF,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACzD,oEAAoE;IACpE,IAAI,CAAC,EAAE,qBAAqB,GAAG,uBAAuB,GAAG,sBAAsB,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;IAC9I,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAE5B;AAED,eAAO,MAAM,eAAe,iGAgD3B,CAAC"}