@roxyapi/ui-react 0.1.2 → 0.2.0

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 (175) hide show
  1. package/README.md +336 -29
  2. package/dist/components/ashtakavarga-grid.d.ts +12 -0
  3. package/dist/components/ashtakavarga-grid.d.ts.map +1 -0
  4. package/dist/components/ashtakavarga-grid.js +91 -0
  5. package/dist/components/ashtakavarga-grid.js.map +7 -0
  6. package/dist/components/biorhythm-chart.d.ts +8 -5
  7. package/dist/components/biorhythm-chart.d.ts.map +1 -1
  8. package/dist/components/biorhythm-chart.js +35 -9
  9. package/dist/components/biorhythm-chart.js.map +2 -2
  10. package/dist/components/choghadiya-grid.d.ts +12 -0
  11. package/dist/components/choghadiya-grid.d.ts.map +1 -0
  12. package/dist/components/choghadiya-grid.js +91 -0
  13. package/dist/components/choghadiya-grid.js.map +7 -0
  14. package/dist/components/compatibility-card.d.ts +8 -5
  15. package/dist/components/compatibility-card.d.ts.map +1 -1
  16. package/dist/components/compatibility-card.js +35 -9
  17. package/dist/components/compatibility-card.js.map +2 -2
  18. package/dist/components/dasha-timeline.d.ts +8 -5
  19. package/dist/components/dasha-timeline.d.ts.map +1 -1
  20. package/dist/components/dasha-timeline.js +35 -9
  21. package/dist/components/dasha-timeline.js.map +2 -2
  22. package/dist/components/data.d.ts +5 -5
  23. package/dist/components/data.d.ts.map +1 -1
  24. package/dist/components/data.js +32 -12
  25. package/dist/components/data.js.map +2 -2
  26. package/dist/components/divisional-chart.d.ts +12 -0
  27. package/dist/components/divisional-chart.d.ts.map +1 -0
  28. package/dist/components/divisional-chart.js +91 -0
  29. package/dist/components/divisional-chart.js.map +7 -0
  30. package/dist/components/dosha-card.d.ts +8 -5
  31. package/dist/components/dosha-card.d.ts.map +1 -1
  32. package/dist/components/dosha-card.js +35 -9
  33. package/dist/components/dosha-card.js.map +2 -2
  34. package/dist/components/endpoint-form.d.ts +19 -5
  35. package/dist/components/endpoint-form.d.ts.map +1 -1
  36. package/dist/components/endpoint-form.js +55 -11
  37. package/dist/components/endpoint-form.js.map +2 -2
  38. package/dist/components/guna-milan.d.ts +8 -5
  39. package/dist/components/guna-milan.d.ts.map +1 -1
  40. package/dist/components/guna-milan.js +35 -9
  41. package/dist/components/guna-milan.js.map +2 -2
  42. package/dist/components/hexagram.d.ts +8 -5
  43. package/dist/components/hexagram.d.ts.map +1 -1
  44. package/dist/components/hexagram.js +35 -9
  45. package/dist/components/hexagram.js.map +2 -2
  46. package/dist/components/horoscope-card.d.ts +8 -5
  47. package/dist/components/horoscope-card.d.ts.map +1 -1
  48. package/dist/components/horoscope-card.js +35 -9
  49. package/dist/components/horoscope-card.js.map +2 -2
  50. package/dist/components/kp-planets-table.d.ts +8 -5
  51. package/dist/components/kp-planets-table.d.ts.map +1 -1
  52. package/dist/components/kp-planets-table.js +35 -9
  53. package/dist/components/kp-planets-table.js.map +2 -2
  54. package/dist/components/location-search.d.ts +21 -5
  55. package/dist/components/location-search.d.ts.map +1 -1
  56. package/dist/components/location-search.js +47 -11
  57. package/dist/components/location-search.js.map +2 -2
  58. package/dist/components/moon-phase.d.ts +8 -5
  59. package/dist/components/moon-phase.d.ts.map +1 -1
  60. package/dist/components/moon-phase.js +35 -9
  61. package/dist/components/moon-phase.js.map +2 -2
  62. package/dist/components/natal-chart.d.ts +8 -5
  63. package/dist/components/natal-chart.d.ts.map +1 -1
  64. package/dist/components/natal-chart.js +35 -9
  65. package/dist/components/natal-chart.js.map +2 -2
  66. package/dist/components/numerology-card.d.ts +8 -5
  67. package/dist/components/numerology-card.d.ts.map +1 -1
  68. package/dist/components/numerology-card.js +35 -9
  69. package/dist/components/numerology-card.js.map +2 -2
  70. package/dist/components/panchang-table.d.ts +8 -5
  71. package/dist/components/panchang-table.d.ts.map +1 -1
  72. package/dist/components/panchang-table.js +35 -9
  73. package/dist/components/panchang-table.js.map +2 -2
  74. package/dist/components/shadbala-table.d.ts +12 -0
  75. package/dist/components/shadbala-table.d.ts.map +1 -0
  76. package/dist/components/shadbala-table.js +91 -0
  77. package/dist/components/shadbala-table.js.map +7 -0
  78. package/dist/components/synastry-chart.d.ts +15 -5
  79. package/dist/components/synastry-chart.d.ts.map +1 -1
  80. package/dist/components/synastry-chart.js +35 -9
  81. package/dist/components/synastry-chart.js.map +2 -2
  82. package/dist/components/tarot-card.d.ts +8 -5
  83. package/dist/components/tarot-card.d.ts.map +1 -1
  84. package/dist/components/tarot-card.js +35 -9
  85. package/dist/components/tarot-card.js.map +2 -2
  86. package/dist/components/tarot-spread.d.ts +8 -5
  87. package/dist/components/tarot-spread.d.ts.map +1 -1
  88. package/dist/components/tarot-spread.js +35 -9
  89. package/dist/components/tarot-spread.js.map +2 -2
  90. package/dist/components/transits-table.d.ts +12 -0
  91. package/dist/components/transits-table.d.ts.map +1 -0
  92. package/dist/components/transits-table.js +91 -0
  93. package/dist/components/transits-table.js.map +7 -0
  94. package/dist/components/vedic-kundli.d.ts +8 -5
  95. package/dist/components/vedic-kundli.d.ts.map +1 -1
  96. package/dist/components/vedic-kundli.js +35 -9
  97. package/dist/components/vedic-kundli.js.map +2 -2
  98. package/dist/components/yoga-list.d.ts +14 -0
  99. package/dist/components/yoga-list.d.ts.map +1 -0
  100. package/dist/components/yoga-list.js +91 -0
  101. package/dist/components/yoga-list.js.map +7 -0
  102. package/dist/index.cjs +825 -115
  103. package/dist/index.cjs.map +4 -4
  104. package/dist/index.d.ts +26 -20
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +825 -115
  107. package/dist/index.js.map +4 -4
  108. package/dist/load-ui.d.ts +2 -0
  109. package/dist/load-ui.d.ts.map +1 -1
  110. package/dist/load-ui.js +13 -4
  111. package/dist/load-ui.js.map +2 -2
  112. package/package.json +27 -7
  113. package/src/components/biorhythm-chart.d.ts +0 -12
  114. package/src/components/biorhythm-chart.d.ts.map +0 -1
  115. package/src/components/biorhythm-chart.tsx +0 -35
  116. package/src/components/compatibility-card.d.ts +0 -12
  117. package/src/components/compatibility-card.d.ts.map +0 -1
  118. package/src/components/compatibility-card.tsx +0 -35
  119. package/src/components/dasha-timeline.d.ts +0 -12
  120. package/src/components/dasha-timeline.d.ts.map +0 -1
  121. package/src/components/dasha-timeline.tsx +0 -35
  122. package/src/components/data.d.ts +0 -11
  123. package/src/components/data.d.ts.map +0 -1
  124. package/src/components/data.tsx +0 -35
  125. package/src/components/dosha-card.d.ts +0 -12
  126. package/src/components/dosha-card.d.ts.map +0 -1
  127. package/src/components/dosha-card.tsx +0 -35
  128. package/src/components/endpoint-form.d.ts +0 -12
  129. package/src/components/endpoint-form.d.ts.map +0 -1
  130. package/src/components/endpoint-form.tsx +0 -35
  131. package/src/components/guna-milan.d.ts +0 -12
  132. package/src/components/guna-milan.d.ts.map +0 -1
  133. package/src/components/guna-milan.tsx +0 -35
  134. package/src/components/hexagram.d.ts +0 -12
  135. package/src/components/hexagram.d.ts.map +0 -1
  136. package/src/components/hexagram.tsx +0 -35
  137. package/src/components/horoscope-card.d.ts +0 -12
  138. package/src/components/horoscope-card.d.ts.map +0 -1
  139. package/src/components/horoscope-card.tsx +0 -35
  140. package/src/components/kp-planets-table.d.ts +0 -12
  141. package/src/components/kp-planets-table.d.ts.map +0 -1
  142. package/src/components/kp-planets-table.tsx +0 -35
  143. package/src/components/location-search.d.ts +0 -12
  144. package/src/components/location-search.d.ts.map +0 -1
  145. package/src/components/location-search.tsx +0 -35
  146. package/src/components/moon-phase.d.ts +0 -12
  147. package/src/components/moon-phase.d.ts.map +0 -1
  148. package/src/components/moon-phase.tsx +0 -35
  149. package/src/components/natal-chart.d.ts +0 -12
  150. package/src/components/natal-chart.d.ts.map +0 -1
  151. package/src/components/natal-chart.tsx +0 -35
  152. package/src/components/numerology-card.d.ts +0 -12
  153. package/src/components/numerology-card.d.ts.map +0 -1
  154. package/src/components/numerology-card.tsx +0 -35
  155. package/src/components/panchang-table.d.ts +0 -12
  156. package/src/components/panchang-table.d.ts.map +0 -1
  157. package/src/components/panchang-table.tsx +0 -35
  158. package/src/components/synastry-chart.d.ts +0 -12
  159. package/src/components/synastry-chart.d.ts.map +0 -1
  160. package/src/components/synastry-chart.tsx +0 -35
  161. package/src/components/tarot-card.d.ts +0 -12
  162. package/src/components/tarot-card.d.ts.map +0 -1
  163. package/src/components/tarot-card.tsx +0 -35
  164. package/src/components/tarot-spread.d.ts +0 -12
  165. package/src/components/tarot-spread.d.ts.map +0 -1
  166. package/src/components/tarot-spread.tsx +0 -35
  167. package/src/components/vedic-kundli.d.ts +0 -12
  168. package/src/components/vedic-kundli.d.ts.map +0 -1
  169. package/src/components/vedic-kundli.tsx +0 -35
  170. package/src/index.d.ts +0 -21
  171. package/src/index.d.ts.map +0 -1
  172. package/src/index.ts +0 -20
  173. package/src/load-ui.d.ts +0 -2
  174. package/src/load-ui.d.ts.map +0 -1
  175. package/src/load-ui.ts +0 -41
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/data.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 RoxyDataProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyData = React.forwardRef<HTMLElement, RoxyDataProps>(\n\tfunction RoxyData({ 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-data', { 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,WAAiB;AAAA,EAC7B,SAASA,UAAS,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK;AACzC,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,aAAa,EAAE,KAAK,UAAU,GAAG,KAAK,CAAC;AAAA,EACnE;AACD;",
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children'\n>;\n\nexport interface RoxyDataProps extends ElementAttrs {\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\n}\n\nexport const RoxyData = React.forwardRef<HTMLElement | null, RoxyDataProps>(\n\tfunction RoxyData({ 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\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-data', {\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') resolves to whatever\n * the CDN currently serves 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.2.0\";\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;;;ADpCO,IAAM,WAAiB;AAAA,EAC7B,SAASA,UAAS,EAAE,WAAW,OAAO,GAAG,KAAK,GAAG,KAAK;AACrD,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,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,aAAa;AAAA,MACvC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACJ,CAAC;AAAA,EACF;AACD;",
6
6
  "names": ["RoxyData", "loaded"]
7
7
  }
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import type { DivisionalChartResponse } from '@roxyapi/ui/types';
3
+ type ElementAttrs = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'data'>;
4
+ export interface RoxyDivisionalChartProps extends ElementAttrs {
5
+ /** Spec-derived response payload. Pass the raw RoxyAPI response. */
6
+ data?: DivisionalChartResponse;
7
+ className?: string;
8
+ style?: React.CSSProperties;
9
+ }
10
+ export declare const RoxyDivisionalChart: React.ForwardRefExoticComponent<RoxyDivisionalChartProps & React.RefAttributes<HTMLElement | null>>;
11
+ export {};
12
+ //# sourceMappingURL=divisional-chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divisional-chart.d.ts","sourceRoot":"","sources":["../../src/components/divisional-chart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,KAAK,YAAY,GAAG,IAAI,CACvB,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EACjC,UAAU,GAAG,MAAM,CACnB,CAAC;AAEF,MAAM,WAAW,wBAAyB,SAAQ,YAAY;IAC7D,oEAAoE;IACpE,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAE5B;AAED,eAAO,MAAM,mBAAmB,qGAgD/B,CAAC"}
@@ -0,0 +1,91 @@
1
+ // packages/ui-react/src/components/divisional-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_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";
9
+ var loaded = null;
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") {
15
+ if (typeof document === "undefined") return Promise.resolve();
16
+ if (loaded) return loaded;
17
+ loaded = new Promise((resolve, reject) => {
18
+ const url = `${buildBase(version)}/roxy-ui.js`;
19
+ let existing = document.getElementById(SCRIPT_ID);
20
+ if (existing) {
21
+ if (existing.dataset.loaded === "true") {
22
+ resolve();
23
+ } else {
24
+ existing.addEventListener("load", () => resolve());
25
+ existing.addEventListener("error", () => reject(new Error("roxy-ui load failed")));
26
+ }
27
+ return;
28
+ }
29
+ existing = document.createElement("script");
30
+ existing.id = SCRIPT_ID;
31
+ existing.src = url;
32
+ existing.async = true;
33
+ existing.crossOrigin = "anonymous";
34
+ existing.addEventListener("load", () => {
35
+ existing.dataset.loaded = "true";
36
+ resolve();
37
+ });
38
+ existing.addEventListener("error", () => reject(new Error("roxy-ui load failed")));
39
+ document.head.appendChild(existing);
40
+ });
41
+ return loaded;
42
+ }
43
+
44
+ // packages/ui-react/src/components/divisional-chart.tsx
45
+ var RoxyDivisionalChart = React.forwardRef(
46
+ function RoxyDivisionalChart2({ data, className, style, ...rest }, ref) {
47
+ const internal = React.useRef(null);
48
+ React.useImperativeHandle(
49
+ ref,
50
+ () => internal.current,
51
+ []
52
+ );
53
+ const [loaded2, setLoaded] = React.useState(false);
54
+ const [error, setError] = React.useState(null);
55
+ React.useEffect(() => {
56
+ let active = true;
57
+ ensureScriptLoaded().then(() => {
58
+ if (active) setLoaded(true);
59
+ }).catch((err) => {
60
+ if (!active) return;
61
+ setError(err instanceof Error ? err : new Error(String(err)));
62
+ });
63
+ return () => {
64
+ active = false;
65
+ };
66
+ }, []);
67
+ React.useEffect(() => {
68
+ const el = internal.current;
69
+ if (el && data !== void 0) {
70
+ el.data = data;
71
+ }
72
+ }, [data, loaded2]);
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-divisional-chart", {
81
+ ref: internal,
82
+ className,
83
+ style,
84
+ ...rest
85
+ });
86
+ }
87
+ );
88
+ export {
89
+ RoxyDivisionalChart
90
+ };
91
+ //# sourceMappingURL=divisional-chart.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/divisional-chart.tsx", "../../src/load-ui.ts"],
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\nimport type { DivisionalChartResponse } from '@roxyapi/ui/types';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children' | 'data'\n>;\n\nexport interface RoxyDivisionalChartProps extends ElementAttrs {\n\t/** Spec-derived response payload. Pass the raw RoxyAPI response. */\n\tdata?: DivisionalChartResponse;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\n}\n\nexport const RoxyDivisionalChart = React.forwardRef<HTMLElement | null, RoxyDivisionalChartProps>(\n\tfunction RoxyDivisionalChart({ 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-divisional-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') resolves to whatever\n * the CDN currently serves 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.2.0\";\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,sBAA4B;AAAA,EACxC,SAASA,qBAAoB,EAAE,MAAM,WAAW,OAAO,GAAG,KAAK,GAAG,KAAK;AACtE,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,yBAAyB;AAAA,MACnD,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACJ,CAAC;AAAA,EACF;AACD;",
6
+ "names": ["RoxyDivisionalChart", "loaded"]
7
+ }
@@ -1,9 +1,12 @@
1
1
  import * as React from 'react';
2
- type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
- export interface RoxyDoshaCardProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
- data?: unknown;
5
- [attr: string]: unknown;
2
+ import type { KalsarpaResponse, ManglikResponse, SadhesatiResponse } from '@roxyapi/ui/types';
3
+ type ElementAttrs = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'data'>;
4
+ export interface RoxyDoshaCardProps extends ElementAttrs {
5
+ /** Spec-derived response payload. Pass the raw RoxyAPI response. */
6
+ data?: ManglikResponse | KalsarpaResponse | SadhesatiResponse;
7
+ className?: string;
8
+ style?: React.CSSProperties;
6
9
  }
7
- export declare const RoxyDoshaCard: React.ForwardRefExoticComponent<Omit<RoxyDoshaCardProps, "ref"> & React.RefAttributes<HTMLElement>>;
10
+ export declare const RoxyDoshaCard: React.ForwardRefExoticComponent<RoxyDoshaCardProps & React.RefAttributes<HTMLElement | null>>;
8
11
  export {};
9
12
  //# sourceMappingURL=dosha-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dosha-card.d.ts","sourceRoot":"","sources":["../../src/components/dosha-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":"dosha-card.d.ts","sourceRoot":"","sources":["../../src/components/dosha-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE9F,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,gBAAgB,GAAG,iBAAiB,CAAC;IAC9D,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/dosha-card.tsx
40
45
  var RoxyDoshaCard = React.forwardRef(
41
- function RoxyDoshaCard2({ data, ...rest }, ref) {
46
+ function RoxyDoshaCard2({ 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-dosha-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-dosha-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/dosha-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 RoxyDoshaCardProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyDoshaCard = React.forwardRef<HTMLElement, RoxyDoshaCardProps>(\n\tfunction RoxyDoshaCard({ 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-dosha-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 { KalsarpaResponse, ManglikResponse, SadhesatiResponse } from '@roxyapi/ui/types';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children' | 'data'\n>;\n\nexport interface RoxyDoshaCardProps extends ElementAttrs {\n\t/** Spec-derived response payload. Pass the raw RoxyAPI response. */\n\tdata?: ManglikResponse | KalsarpaResponse | SadhesatiResponse;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\n}\n\nexport const RoxyDoshaCard = React.forwardRef<HTMLElement | null, RoxyDoshaCardProps>(\n\tfunction RoxyDoshaCard({ 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-dosha-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') resolves to whatever\n * the CDN currently serves 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.2.0\";\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": ["RoxyDoshaCard", "loaded"]
7
7
  }
@@ -1,9 +1,23 @@
1
1
  import * as React from 'react';
2
- type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
- export interface RoxyEndpointFormProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
- data?: unknown;
5
- [attr: string]: unknown;
2
+ type ElementAttrs = Omit<React.HTMLAttributes<HTMLElement>, 'children'>;
3
+ export interface RoxyEndpointFormProps extends ElementAttrs {
4
+ className?: string;
5
+ style?: React.CSSProperties;
6
+ /** Fires when the underlying <roxy-endpoint-form> dispatches `roxy-submit`. */
7
+ onRoxySubmit?: (event: CustomEvent<{
8
+ endpoint: string;
9
+ values: Record<string, unknown>;
10
+ }>) => void;
11
+ /** Fires when the underlying <roxy-endpoint-form> dispatches `roxy-validation-error`. */
12
+ onRoxyValidationError?: (event: CustomEvent<{
13
+ missing: string[];
14
+ }>) => void;
15
+ /** Fires when the underlying <roxy-endpoint-form> dispatches `roxy-spec-error`. */
16
+ onRoxySpecError?: (event: CustomEvent<{
17
+ url: string;
18
+ message: string;
19
+ }>) => void;
6
20
  }
7
- export declare const RoxyEndpointForm: React.ForwardRefExoticComponent<Omit<RoxyEndpointFormProps, "ref"> & React.RefAttributes<HTMLElement>>;
21
+ export declare const RoxyEndpointForm: React.ForwardRefExoticComponent<RoxyEndpointFormProps & React.RefAttributes<HTMLElement | null>>;
8
22
  export {};
9
23
  //# sourceMappingURL=endpoint-form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint-form.d.ts","sourceRoot":"","sources":["../../src/components/endpoint-form.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,qBAAsB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IACrF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,gBAAgB,wGAwB5B,CAAC"}
1
+ {"version":3,"file":"endpoint-form.d.ts","sourceRoot":"","sources":["../../src/components/endpoint-form.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,KAAK,YAAY,GAAG,IAAI,CACvB,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EACjC,UAAU,CACV,CAAC;AAEF,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACnG,yFAAyF;IACzF,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC5E,mFAAmF;IACnF,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;CACjF;AAED,eAAO,MAAM,gBAAgB,kGAoE5B,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,64 @@ function ensureScriptLoaded(version = "0.1.0") {
38
43
 
39
44
  // packages/ui-react/src/components/endpoint-form.tsx
40
45
  var RoxyEndpointForm = React.forwardRef(
41
- function RoxyEndpointForm2({ data, ...rest }, ref) {
46
+ function RoxyEndpointForm2({ className, style, onRoxySubmit, onRoxyValidationError, onRoxySpecError, ...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;
57
- }
58
- }, [data, loaded2]);
59
- return React.createElement("roxy-endpoint-form", { ref: internal, ...rest });
68
+ const el = internal.current;
69
+ const handler = onRoxySubmit;
70
+ if (!el || !handler) return;
71
+ const listener = (event) => handler(event);
72
+ el.addEventListener("roxy-submit", listener);
73
+ return () => el.removeEventListener("roxy-submit", listener);
74
+ }, [onRoxySubmit, loaded2]);
75
+ React.useEffect(() => {
76
+ const el = internal.current;
77
+ const handler = onRoxyValidationError;
78
+ if (!el || !handler) return;
79
+ const listener = (event) => handler(event);
80
+ el.addEventListener("roxy-validation-error", listener);
81
+ return () => el.removeEventListener("roxy-validation-error", listener);
82
+ }, [onRoxyValidationError, loaded2]);
83
+ React.useEffect(() => {
84
+ const el = internal.current;
85
+ const handler = onRoxySpecError;
86
+ if (!el || !handler) return;
87
+ const listener = (event) => handler(event);
88
+ el.addEventListener("roxy-spec-error", listener);
89
+ return () => el.removeEventListener("roxy-spec-error", listener);
90
+ }, [onRoxySpecError, loaded2]);
91
+ if (error) {
92
+ return React.createElement(
93
+ "div",
94
+ { role: "alert", className, style },
95
+ `Roxy UI script load failed: ${error.message}`
96
+ );
97
+ }
98
+ return React.createElement("roxy-endpoint-form", {
99
+ ref: internal,
100
+ className,
101
+ style,
102
+ ...rest
103
+ });
60
104
  }
61
105
  );
62
106
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/endpoint-form.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 RoxyEndpointFormProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyEndpointForm = React.forwardRef<HTMLElement, RoxyEndpointFormProps>(\n\tfunction RoxyEndpointForm({ 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-endpoint-form', { 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,mBAAyB;AAAA,EACrC,SAASA,kBAAiB,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK;AACjD,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,sBAAsB,EAAE,KAAK,UAAU,GAAG,KAAK,CAAC;AAAA,EAC5E;AACD;",
4
+ "sourcesContent": ["import * as React from 'react';\nimport { ensureScriptLoaded } from '../load-ui.js';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children'\n>;\n\nexport interface RoxyEndpointFormProps extends ElementAttrs {\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\t/** Fires when the underlying <roxy-endpoint-form> dispatches `roxy-submit`. */\n\tonRoxySubmit?: (event: CustomEvent<{ endpoint: string; values: Record<string, unknown> }>) => void;\n\t/** Fires when the underlying <roxy-endpoint-form> dispatches `roxy-validation-error`. */\n\tonRoxyValidationError?: (event: CustomEvent<{ missing: string[] }>) => void;\n\t/** Fires when the underlying <roxy-endpoint-form> dispatches `roxy-spec-error`. */\n\tonRoxySpecError?: (event: CustomEvent<{ url: string; message: string }>) => void;\n}\n\nexport const RoxyEndpointForm = React.forwardRef<HTMLElement | null, RoxyEndpointFormProps>(\n\tfunction RoxyEndpointForm({ className, style, onRoxySubmit, onRoxyValidationError, onRoxySpecError, ...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\tconst handler = onRoxySubmit;\n\t\t\tif (!el || !handler) return;\n\t\t\tconst listener = (event: Event) => handler(event as CustomEvent<{ endpoint: string; values: Record<string, unknown> }>);\n\t\t\tel.addEventListener('roxy-submit', listener);\n\t\t\treturn () => el.removeEventListener('roxy-submit', listener);\n\t\t}, [onRoxySubmit, loaded]);\n\n\t\tReact.useEffect(() => {\n\t\t\tconst el = internal.current;\n\t\t\tconst handler = onRoxyValidationError;\n\t\t\tif (!el || !handler) return;\n\t\t\tconst listener = (event: Event) => handler(event as CustomEvent<{ missing: string[] }>);\n\t\t\tel.addEventListener('roxy-validation-error', listener);\n\t\t\treturn () => el.removeEventListener('roxy-validation-error', listener);\n\t\t}, [onRoxyValidationError, loaded]);\n\n\t\tReact.useEffect(() => {\n\t\t\tconst el = internal.current;\n\t\t\tconst handler = onRoxySpecError;\n\t\t\tif (!el || !handler) return;\n\t\t\tconst listener = (event: Event) => handler(event as CustomEvent<{ url: string; message: string }>);\n\t\t\tel.addEventListener('roxy-spec-error', listener);\n\t\t\treturn () => el.removeEventListener('roxy-spec-error', listener);\n\t\t}, [onRoxySpecError, 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-endpoint-form', {\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') resolves to whatever\n * the CDN currently serves 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.2.0\";\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;;;AD/BO,IAAM,mBAAyB;AAAA,EACrC,SAASA,kBAAiB,EAAE,WAAW,OAAO,cAAc,uBAAuB,iBAAiB,GAAG,KAAK,GAAG,KAAK;AACnH,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,YAAM,UAAU;AAChB,UAAI,CAAC,MAAM,CAAC,QAAS;AACrB,YAAM,WAAW,CAAC,UAAiB,QAAQ,KAA2E;AACtH,SAAG,iBAAiB,eAAe,QAAQ;AAC3C,aAAO,MAAM,GAAG,oBAAoB,eAAe,QAAQ;AAAA,IAC5D,GAAG,CAAC,cAAcA,OAAM,CAAC;AAEzB,IAAM,gBAAU,MAAM;AACrB,YAAM,KAAK,SAAS;AACpB,YAAM,UAAU;AAChB,UAAI,CAAC,MAAM,CAAC,QAAS;AACrB,YAAM,WAAW,CAAC,UAAiB,QAAQ,KAA2C;AACtF,SAAG,iBAAiB,yBAAyB,QAAQ;AACrD,aAAO,MAAM,GAAG,oBAAoB,yBAAyB,QAAQ;AAAA,IACtE,GAAG,CAAC,uBAAuBA,OAAM,CAAC;AAElC,IAAM,gBAAU,MAAM;AACrB,YAAM,KAAK,SAAS;AACpB,YAAM,UAAU;AAChB,UAAI,CAAC,MAAM,CAAC,QAAS;AACrB,YAAM,WAAW,CAAC,UAAiB,QAAQ,KAAsD;AACjG,SAAG,iBAAiB,mBAAmB,QAAQ;AAC/C,aAAO,MAAM,GAAG,oBAAoB,mBAAmB,QAAQ;AAAA,IAChE,GAAG,CAAC,iBAAiBA,OAAM,CAAC;AAE5B,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,sBAAsB;AAAA,MAChD,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACJ,CAAC;AAAA,EACF;AACD;",
6
6
  "names": ["RoxyEndpointForm", "loaded"]
7
7
  }
@@ -1,9 +1,12 @@
1
1
  import * as React from 'react';
2
- type DivAttrs = React.HTMLAttributes<HTMLElement>;
3
- export interface RoxyGunaMilanProps extends Omit<DivAttrs, 'children' | 'onSelect'> {
4
- data?: unknown;
5
- [attr: string]: unknown;
2
+ import type { CompatibilityResponse } from '@roxyapi/ui/types';
3
+ type ElementAttrs = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'data'>;
4
+ export interface RoxyGunaMilanProps extends ElementAttrs {
5
+ /** Spec-derived response payload. Pass the raw RoxyAPI response. */
6
+ data?: CompatibilityResponse;
7
+ className?: string;
8
+ style?: React.CSSProperties;
6
9
  }
7
- export declare const RoxyGunaMilan: React.ForwardRefExoticComponent<Omit<RoxyGunaMilanProps, "ref"> & React.RefAttributes<HTMLElement>>;
10
+ export declare const RoxyGunaMilan: React.ForwardRefExoticComponent<RoxyGunaMilanProps & React.RefAttributes<HTMLElement | null>>;
8
11
  export {};
9
12
  //# sourceMappingURL=guna-milan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guna-milan.d.ts","sourceRoot":"","sources":["../../src/components/guna-milan.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":"guna-milan.d.ts","sourceRoot":"","sources":["../../src/components/guna-milan.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,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,qBAAqB,CAAC;IAC7B,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/guna-milan.tsx
40
45
  var RoxyGunaMilan = React.forwardRef(
41
- function RoxyGunaMilan2({ data, ...rest }, ref) {
46
+ function RoxyGunaMilan2({ 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-guna-milan", { 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-guna-milan", {
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/guna-milan.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 RoxyGunaMilanProps extends Omit<DivAttrs, 'children' | 'onSelect'> {\n\tdata?: unknown;\n\t[attr: string]: unknown;\n}\n\nexport const RoxyGunaMilan = React.forwardRef<HTMLElement, RoxyGunaMilanProps>(\n\tfunction RoxyGunaMilan({ 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-guna-milan', { 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 { CompatibilityResponse } from '@roxyapi/ui/types';\n\ntype ElementAttrs = Omit<\n\tReact.HTMLAttributes<HTMLElement>,\n\t'children' | 'data'\n>;\n\nexport interface RoxyGunaMilanProps extends ElementAttrs {\n\t/** Spec-derived response payload. Pass the raw RoxyAPI response. */\n\tdata?: CompatibilityResponse;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\n}\n\nexport const RoxyGunaMilan = React.forwardRef<HTMLElement | null, RoxyGunaMilanProps>(\n\tfunction RoxyGunaMilan({ 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-guna-milan', {\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') resolves to whatever\n * the CDN currently serves 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.2.0\";\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": ["RoxyGunaMilan", "loaded"]
7
7
  }