@roxyapi/ui-vue 0.34.0 → 0.35.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 (159) hide show
  1. package/AGENTS.md +39 -7
  2. package/README.md +35 -1
  3. package/dist/components/almanac-day.js +1 -1
  4. package/dist/components/almanac-day.js.map +1 -1
  5. package/dist/components/angel-number-card.js +1 -1
  6. package/dist/components/angel-number-card.js.map +1 -1
  7. package/dist/components/angel-number-lookup.js +1 -1
  8. package/dist/components/angel-number-lookup.js.map +1 -1
  9. package/dist/components/arudha-padas.js +1 -1
  10. package/dist/components/arudha-padas.js.map +1 -1
  11. package/dist/components/ashtakavarga-grid.js +1 -1
  12. package/dist/components/ashtakavarga-grid.js.map +1 -1
  13. package/dist/components/aspects-table.js +1 -1
  14. package/dist/components/aspects-table.js.map +1 -1
  15. package/dist/components/astrocartography-map.js +1 -1
  16. package/dist/components/astrocartography-map.js.map +1 -1
  17. package/dist/components/bazi-chart.js +1 -1
  18. package/dist/components/bazi-chart.js.map +1 -1
  19. package/dist/components/bhav-chalit-table.js +1 -1
  20. package/dist/components/bhav-chalit-table.js.map +1 -1
  21. package/dist/components/bhava-bala-table.js +1 -1
  22. package/dist/components/bhava-bala-table.js.map +1 -1
  23. package/dist/components/biorhythm-chart.js +1 -1
  24. package/dist/components/biorhythm-chart.js.map +1 -1
  25. package/dist/components/bodygraph.js +1 -1
  26. package/dist/components/bodygraph.js.map +1 -1
  27. package/dist/components/chara-karakas.js +1 -1
  28. package/dist/components/chara-karakas.js.map +1 -1
  29. package/dist/components/choghadiya-grid.js +1 -1
  30. package/dist/components/choghadiya-grid.js.map +1 -1
  31. package/dist/components/compatibility-card.js +1 -1
  32. package/dist/components/compatibility-card.js.map +1 -1
  33. package/dist/components/crystal-card.js +1 -1
  34. package/dist/components/crystal-card.js.map +1 -1
  35. package/dist/components/crystal-grid.js +1 -1
  36. package/dist/components/crystal-grid.js.map +1 -1
  37. package/dist/components/dasha-timeline.js +1 -1
  38. package/dist/components/dasha-timeline.js.map +1 -1
  39. package/dist/components/data.js +1 -1
  40. package/dist/components/data.js.map +1 -1
  41. package/dist/components/divisional-chart.js +1 -1
  42. package/dist/components/divisional-chart.js.map +1 -1
  43. package/dist/components/dosha-card.js +1 -1
  44. package/dist/components/dosha-card.js.map +1 -1
  45. package/dist/components/dream-card.js +1 -1
  46. package/dist/components/dream-card.js.map +1 -1
  47. package/dist/components/dream-search.js +1 -1
  48. package/dist/components/dream-search.js.map +1 -1
  49. package/dist/components/endpoint-form.js +1 -1
  50. package/dist/components/endpoint-form.js.map +1 -1
  51. package/dist/components/ephemeris-table.js +1 -1
  52. package/dist/components/ephemeris-table.js.map +1 -1
  53. package/dist/components/fixed-stars.js +1 -1
  54. package/dist/components/fixed-stars.js.map +1 -1
  55. package/dist/components/flying-star-chart.js +1 -1
  56. package/dist/components/flying-star-chart.js.map +1 -1
  57. package/dist/components/forecast-digest.js +1 -1
  58. package/dist/components/forecast-digest.js.map +1 -1
  59. package/dist/components/forecast-timeline.js +1 -1
  60. package/dist/components/forecast-timeline.js.map +1 -1
  61. package/dist/components/gochara-table.js +1 -1
  62. package/dist/components/gochara-table.js.map +1 -1
  63. package/dist/components/guna-milan.js +1 -1
  64. package/dist/components/guna-milan.js.map +1 -1
  65. package/dist/components/hd-connection.js +1 -1
  66. package/dist/components/hd-connection.js.map +1 -1
  67. package/dist/components/hd-penta.js +1 -1
  68. package/dist/components/hd-penta.js.map +1 -1
  69. package/dist/components/hd-type-card.js +1 -1
  70. package/dist/components/hd-type-card.js.map +1 -1
  71. package/dist/components/hd-variables.js +1 -1
  72. package/dist/components/hd-variables.js.map +1 -1
  73. package/dist/components/heliacal-table.js +1 -1
  74. package/dist/components/heliacal-table.js.map +1 -1
  75. package/dist/components/hexagram.js +1 -1
  76. package/dist/components/hexagram.js.map +1 -1
  77. package/dist/components/hora-table.js +1 -1
  78. package/dist/components/hora-table.js.map +1 -1
  79. package/dist/components/horoscope-card.js +1 -1
  80. package/dist/components/horoscope-card.js.map +1 -1
  81. package/dist/components/kp-chart.js +1 -1
  82. package/dist/components/kp-chart.js.map +1 -1
  83. package/dist/components/kp-planets-table.js +1 -1
  84. package/dist/components/kp-planets-table.js.map +1 -1
  85. package/dist/components/kp-ruling-planets.js +1 -1
  86. package/dist/components/kp-ruling-planets.js.map +1 -1
  87. package/dist/components/kua-card.js +1 -1
  88. package/dist/components/kua-card.js.map +1 -1
  89. package/dist/components/local-space-compass.js +1 -1
  90. package/dist/components/local-space-compass.js.map +1 -1
  91. package/dist/components/location-search.js +1 -1
  92. package/dist/components/location-search.js.map +1 -1
  93. package/dist/components/luck-pillars.js +1 -1
  94. package/dist/components/luck-pillars.js.map +1 -1
  95. package/dist/components/moon-phase.js +1 -1
  96. package/dist/components/moon-phase.js.map +1 -1
  97. package/dist/components/nakshatra-card.js +1 -1
  98. package/dist/components/nakshatra-card.js.map +1 -1
  99. package/dist/components/natal-chart.js +1 -1
  100. package/dist/components/natal-chart.js.map +1 -1
  101. package/dist/components/numerology-card.js +1 -1
  102. package/dist/components/numerology-card.js.map +1 -1
  103. package/dist/components/panchang-table.js +1 -1
  104. package/dist/components/panchang-table.js.map +1 -1
  105. package/dist/components/positions-table.js +1 -1
  106. package/dist/components/positions-table.js.map +1 -1
  107. package/dist/components/profection-card.js +1 -1
  108. package/dist/components/profection-card.js.map +1 -1
  109. package/dist/components/reference-card.js +1 -1
  110. package/dist/components/reference-card.js.map +1 -1
  111. package/dist/components/relocation-wheel.js +1 -1
  112. package/dist/components/relocation-wheel.js.map +1 -1
  113. package/dist/components/shadbala-table.js +1 -1
  114. package/dist/components/shadbala-table.js.map +1 -1
  115. package/dist/components/synastry-chart.js +1 -1
  116. package/dist/components/synastry-chart.js.map +1 -1
  117. package/dist/components/tarot-card.js +1 -1
  118. package/dist/components/tarot-card.js.map +1 -1
  119. package/dist/components/tarot-catalog.js +1 -1
  120. package/dist/components/tarot-catalog.js.map +1 -1
  121. package/dist/components/tarot-spread.js +1 -1
  122. package/dist/components/tarot-spread.js.map +1 -1
  123. package/dist/components/transit-wheel.js +1 -1
  124. package/dist/components/transit-wheel.js.map +1 -1
  125. package/dist/components/transits-table.js +1 -1
  126. package/dist/components/transits-table.js.map +1 -1
  127. package/dist/components/upagraha-table.js +1 -1
  128. package/dist/components/upagraha-table.js.map +1 -1
  129. package/dist/components/vedic-aspects.js +1 -1
  130. package/dist/components/vedic-aspects.js.map +1 -1
  131. package/dist/components/vedic-daily.js +1 -1
  132. package/dist/components/vedic-daily.js.map +1 -1
  133. package/dist/components/vedic-kundli.js +1 -1
  134. package/dist/components/vedic-kundli.js.map +1 -1
  135. package/dist/components/vedic-planets-table.js +1 -1
  136. package/dist/components/vedic-planets-table.js.map +1 -1
  137. package/dist/components/western-planets-table.js +1 -1
  138. package/dist/components/western-planets-table.js.map +1 -1
  139. package/dist/components/yoga-list.js +1 -1
  140. package/dist/components/yoga-list.js.map +1 -1
  141. package/dist/components/zodiac-card.js +1 -1
  142. package/dist/components/zodiac-card.js.map +1 -1
  143. package/dist/generated/tool-components.d.ts +14 -0
  144. package/dist/generated/tool-components.d.ts.map +1 -0
  145. package/dist/index.cjs +1 -1
  146. package/dist/index.cjs.map +4 -4
  147. package/dist/index.d.ts +7 -0
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +1 -1
  150. package/dist/index.js.map +4 -4
  151. package/dist/load-ui.d.ts +1 -1
  152. package/dist/load-ui.js +1 -1
  153. package/dist/load-ui.js.map +1 -1
  154. package/dist/types/types.gen.d.ts +1 -1
  155. package/dist/utils/compact.d.ts +18 -0
  156. package/dist/utils/compact.d.ts.map +1 -0
  157. package/dist/utils/tool-component.d.ts +28 -0
  158. package/dist/utils/tool-component.d.ts.map +1 -0
  159. package/package.json +1 -1
package/dist/load-ui.d.ts CHANGED
@@ -23,7 +23,7 @@
23
23
  * call wins and every component reuses it.
24
24
  */
25
25
  /** The @roxyapi/ui release this wrapper was generated against. The loader defaults to it, so the wrapper version in your lockfile is the runtime you actually get. */
26
- export declare const ROXY_UI_VERSION = "0.34.0";
26
+ export declare const ROXY_UI_VERSION = "0.35.0";
27
27
  export declare function ensureScriptLoaded(version?: string, baseUrl?: string): Promise<void>;
28
28
  /** Every language a label catalogue ships for. English is absent on purpose: the catalogue key IS the English string, so an English page downloads nothing. */
29
29
  export declare const ROXY_UI_LOCALES: readonly ["de", "es", "fr", "hi", "pt", "ru", "tr", "zh-Hans", "zh-Hant"];
package/dist/load-ui.js CHANGED
@@ -1,2 +1,2 @@
1
- var p="0.34.0",l="roxyapi-ui-loader",f="https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn",L="https://cdn.jsdelivr.net/npm/@roxyapi/ui@",g="/dist/cdn",i=null;function E(r){return!r||r==="latest"?f:`${L}${r}${g}`}function y(r=p,s){return typeof document>"u"?Promise.resolve():i||(i=new Promise((d,n)=>{let o=`${s??E(r)}/roxy-ui.js`,e=document.getElementById(l);if(e){e.dataset.loaded==="true"?d():(e.addEventListener("load",()=>d()),e.addEventListener("error",()=>n(new Error("roxy-ui load failed"))));return}e=document.createElement("script"),e.id=l,e.src=o,e.async=!0,e.crossOrigin="anonymous",e.addEventListener("load",()=>{e.dataset.loaded="true",d()}),e.addEventListener("error",()=>n(new Error("roxy-ui load failed"))),document.head.appendChild(e)}),i)}var x=["de","es","fr","hi","pt","ru","tr","zh-Hans","zh-Hant"],m=new Map;function v(r,s=p,d){if(typeof document>"u")return Promise.resolve();let n=(r||"").toLowerCase().split("-")[0]??"";if(!x.includes(n))return Promise.resolve();let o=m.get(n);if(o)return o;let e=new Promise((a,u)=>{let c=`${l}-locale-${n}`,t=document.getElementById(c);if(t){t.dataset.loaded==="true"?a():(t.addEventListener("load",()=>a()),t.addEventListener("error",()=>u(new Error(`roxy-ui locale ${n} load failed`))));return}t=document.createElement("script"),t.id=c,t.src=`${d??E(s)}/locales/${n}.js`,t.async=!0,t.crossOrigin="anonymous",t.addEventListener("load",()=>{t.dataset.loaded="true",a()}),t.addEventListener("error",()=>u(new Error(`roxy-ui locale ${n} load failed`))),document.head.appendChild(t)});return m.set(n,e),e}var P=y;export{x as ROXY_UI_LOCALES,p as ROXY_UI_VERSION,P as default,v as ensureLocaleLoaded,y as ensureScriptLoaded};
1
+ var p="0.35.0",l="roxyapi-ui-loader",f="https://cdn.jsdelivr.net/npm/@roxyapi/ui@latest/dist/cdn",L="https://cdn.jsdelivr.net/npm/@roxyapi/ui@",g="/dist/cdn",i=null;function E(r){return!r||r==="latest"?f:`${L}${r}${g}`}function y(r=p,s){return typeof document>"u"?Promise.resolve():i||(i=new Promise((d,n)=>{let o=`${s??E(r)}/roxy-ui.js`,e=document.getElementById(l);if(e){e.dataset.loaded==="true"?d():(e.addEventListener("load",()=>d()),e.addEventListener("error",()=>n(new Error("roxy-ui load failed"))));return}e=document.createElement("script"),e.id=l,e.src=o,e.async=!0,e.crossOrigin="anonymous",e.addEventListener("load",()=>{e.dataset.loaded="true",d()}),e.addEventListener("error",()=>n(new Error("roxy-ui load failed"))),document.head.appendChild(e)}),i)}var x=["de","es","fr","hi","pt","ru","tr","zh-Hans","zh-Hant"],m=new Map;function v(r,s=p,d){if(typeof document>"u")return Promise.resolve();let n=(r||"").toLowerCase().split("-")[0]??"";if(!x.includes(n))return Promise.resolve();let o=m.get(n);if(o)return o;let e=new Promise((a,u)=>{let c=`${l}-locale-${n}`,t=document.getElementById(c);if(t){t.dataset.loaded==="true"?a():(t.addEventListener("load",()=>a()),t.addEventListener("error",()=>u(new Error(`roxy-ui locale ${n} load failed`))));return}t=document.createElement("script"),t.id=c,t.src=`${d??E(s)}/locales/${n}.js`,t.async=!0,t.crossOrigin="anonymous",t.addEventListener("load",()=>{t.dataset.loaded="true",a()}),t.addEventListener("error",()=>u(new Error(`roxy-ui locale ${n} load failed`))),document.head.appendChild(t)});return m.set(n,e),e}var P=y;export{x as ROXY_UI_LOCALES,p as ROXY_UI_VERSION,P as default,v as ensureLocaleLoaded,y as ensureScriptLoaded};
2
2
  //# sourceMappingURL=load-ui.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/load-ui.ts"],
4
- "sourcesContent": ["/**\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 * Nuxt and Vue server rendering work without a flash.\n *\n * {@link ensureLocaleLoaded} is the other half and is OPT-IN: it loads the label\n * catalogue for one language from the same release, so a non-English app calls\n * both. There is one catalogue, shipped by `@roxyapi/ui` and read by every\n * wrapper, so nothing is restated here.\n *\n * Defaults to the EXACT @roxyapi/ui release this wrapper was built against, so\n * `@roxyapi/ui-vue@x.y.z` always runs `@roxyapi/ui@x.y.z` and a lockfile actually\n * pins the runtime. It used to default to '@latest', which meant a pinned wrapper\n * silently picked up whatever the CDN was serving, and a new @roxyapi/ui release\n * changed the elements under every existing install with no lockfile change.\n *\n * Pass an explicit `version` to override, or 'latest' to opt back into floating.\n *\n * Pass `baseUrl` to serve the bundle from your own origin instead of the CDN, which is\n * what an air-gapped install or a strict Content-Security-Policy needs: copy\n * `node_modules/@roxyapi/ui/dist/cdn/` onto your host and call this once at app entry,\n * before any component mounts. The loader keeps a single shared promise, so the first\n * call wins and every component reuses it.\n */\n/** The @roxyapi/ui release this wrapper was generated against. The loader defaults to it, so the wrapper version in your lockfile is the runtime you actually get. */\nexport const ROXY_UI_VERSION = \"0.34.0\";\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(\n\tversion: string = ROXY_UI_VERSION,\n\tbaseUrl?: string,\n): 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 = `${baseUrl ?? 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/** Every language a label catalogue ships for. English is absent on purpose: the catalogue key IS the English string, so an English page downloads nothing. */\nexport const ROXY_UI_LOCALES = [\"de\",\"es\",\"fr\",\"hi\",\"pt\",\"ru\",\"tr\",\"zh-Hans\",\"zh-Hant\"] as const;\n\nconst localesLoaded = new Map<string, Promise<void>>();\n\n/**\n * Load the label catalogue for one language, so the components write their own\n * headings, buttons, empty states and form labels in it.\n *\n * Call it once at app entry, beside `ensureScriptLoaded`. The components read the\n * language from the page (their own `lang` attribute, the nearest ancestor\n * carrying one, or `<html lang>`), so this call supplies the WORDS and the page\n * supplies the CHOICE. Loading a catalogue a page never asks for is harmless.\n *\n * `es-AR`, `es-MX` and `es-419` all resolve to the `es` catalogue, so pass the\n * page tag as it stands. English resolves to nothing at all and is not an error:\n * the catalogue is keyed by the English text, so an English page needs no payload.\n * A language outside `ROXY_UI_LOCALES` resolves the same way rather than appending\n * a script tag that 404s.\n *\n * `version` and `baseUrl` behave exactly as they do for {@link ensureScriptLoaded},\n * and passing the same `baseUrl` to both is what an air-gapped or strict-CSP host\n * needs: copy `node_modules/@roxyapi/ui/dist/cdn/` onto your own origin, which\n * carries `locales/` beside `roxy-ui.js`.\n *\n * @example\n * ```ts\n * import { ensureScriptLoaded, ensureLocaleLoaded } from '@roxyapi/ui-vue';\n *\n * ensureScriptLoaded();\n * ensureLocaleLoaded(document.documentElement.lang);\n * ```\n */\nexport function ensureLocaleLoaded(\n\tlang: string,\n\tversion: string = ROXY_UI_VERSION,\n\tbaseUrl?: string,\n): Promise<void> {\n\tif (typeof document === 'undefined') return Promise.resolve();\n\tconst base = (lang || '').toLowerCase().split('-')[0] ?? '';\n\tif (!(ROXY_UI_LOCALES as readonly string[]).includes(base)) {\n\t\treturn Promise.resolve();\n\t}\n\tconst existing = localesLoaded.get(base);\n\tif (existing) return existing;\n\n\tconst pending = new Promise<void>((resolve, reject) => {\n\t\tconst id = `${SCRIPT_ID}-locale-${base}`;\n\t\tlet el = document.getElementById(id) as HTMLScriptElement | null;\n\t\tif (el) {\n\t\t\tif (el.dataset.loaded === 'true') resolve();\n\t\t\telse {\n\t\t\t\tel.addEventListener('load', () => resolve());\n\t\t\t\tel.addEventListener('error', () => reject(new Error(`roxy-ui locale ${base} load failed`)));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tel = document.createElement('script');\n\t\tel.id = id;\n\t\tel.src = `${baseUrl ?? buildBase(version)}/locales/${base}.js`;\n\t\tel.async = true;\n\t\tel.crossOrigin = 'anonymous';\n\t\tel.addEventListener('load', () => {\n\t\t\tel!.dataset.loaded = 'true';\n\t\t\tresolve();\n\t\t});\n\t\tel.addEventListener('error', () => reject(new Error(`roxy-ui locale ${base} load failed`)));\n\t\tdocument.head.appendChild(el);\n\t});\n\tlocalesLoaded.set(base, pending);\n\treturn pending;\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-vue\n// was generated against. Useful for diagnostics; not load-bearing.\n"],
4
+ "sourcesContent": ["/**\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 * Nuxt and Vue server rendering work without a flash.\n *\n * {@link ensureLocaleLoaded} is the other half and is OPT-IN: it loads the label\n * catalogue for one language from the same release, so a non-English app calls\n * both. There is one catalogue, shipped by `@roxyapi/ui` and read by every\n * wrapper, so nothing is restated here.\n *\n * Defaults to the EXACT @roxyapi/ui release this wrapper was built against, so\n * `@roxyapi/ui-vue@x.y.z` always runs `@roxyapi/ui@x.y.z` and a lockfile actually\n * pins the runtime. It used to default to '@latest', which meant a pinned wrapper\n * silently picked up whatever the CDN was serving, and a new @roxyapi/ui release\n * changed the elements under every existing install with no lockfile change.\n *\n * Pass an explicit `version` to override, or 'latest' to opt back into floating.\n *\n * Pass `baseUrl` to serve the bundle from your own origin instead of the CDN, which is\n * what an air-gapped install or a strict Content-Security-Policy needs: copy\n * `node_modules/@roxyapi/ui/dist/cdn/` onto your host and call this once at app entry,\n * before any component mounts. The loader keeps a single shared promise, so the first\n * call wins and every component reuses it.\n */\n/** The @roxyapi/ui release this wrapper was generated against. The loader defaults to it, so the wrapper version in your lockfile is the runtime you actually get. */\nexport const ROXY_UI_VERSION = \"0.35.0\";\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(\n\tversion: string = ROXY_UI_VERSION,\n\tbaseUrl?: string,\n): 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 = `${baseUrl ?? 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/** Every language a label catalogue ships for. English is absent on purpose: the catalogue key IS the English string, so an English page downloads nothing. */\nexport const ROXY_UI_LOCALES = [\"de\",\"es\",\"fr\",\"hi\",\"pt\",\"ru\",\"tr\",\"zh-Hans\",\"zh-Hant\"] as const;\n\nconst localesLoaded = new Map<string, Promise<void>>();\n\n/**\n * Load the label catalogue for one language, so the components write their own\n * headings, buttons, empty states and form labels in it.\n *\n * Call it once at app entry, beside `ensureScriptLoaded`. The components read the\n * language from the page (their own `lang` attribute, the nearest ancestor\n * carrying one, or `<html lang>`), so this call supplies the WORDS and the page\n * supplies the CHOICE. Loading a catalogue a page never asks for is harmless.\n *\n * `es-AR`, `es-MX` and `es-419` all resolve to the `es` catalogue, so pass the\n * page tag as it stands. English resolves to nothing at all and is not an error:\n * the catalogue is keyed by the English text, so an English page needs no payload.\n * A language outside `ROXY_UI_LOCALES` resolves the same way rather than appending\n * a script tag that 404s.\n *\n * `version` and `baseUrl` behave exactly as they do for {@link ensureScriptLoaded},\n * and passing the same `baseUrl` to both is what an air-gapped or strict-CSP host\n * needs: copy `node_modules/@roxyapi/ui/dist/cdn/` onto your own origin, which\n * carries `locales/` beside `roxy-ui.js`.\n *\n * @example\n * ```ts\n * import { ensureScriptLoaded, ensureLocaleLoaded } from '@roxyapi/ui-vue';\n *\n * ensureScriptLoaded();\n * ensureLocaleLoaded(document.documentElement.lang);\n * ```\n */\nexport function ensureLocaleLoaded(\n\tlang: string,\n\tversion: string = ROXY_UI_VERSION,\n\tbaseUrl?: string,\n): Promise<void> {\n\tif (typeof document === 'undefined') return Promise.resolve();\n\tconst base = (lang || '').toLowerCase().split('-')[0] ?? '';\n\tif (!(ROXY_UI_LOCALES as readonly string[]).includes(base)) {\n\t\treturn Promise.resolve();\n\t}\n\tconst existing = localesLoaded.get(base);\n\tif (existing) return existing;\n\n\tconst pending = new Promise<void>((resolve, reject) => {\n\t\tconst id = `${SCRIPT_ID}-locale-${base}`;\n\t\tlet el = document.getElementById(id) as HTMLScriptElement | null;\n\t\tif (el) {\n\t\t\tif (el.dataset.loaded === 'true') resolve();\n\t\t\telse {\n\t\t\t\tel.addEventListener('load', () => resolve());\n\t\t\t\tel.addEventListener('error', () => reject(new Error(`roxy-ui locale ${base} load failed`)));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tel = document.createElement('script');\n\t\tel.id = id;\n\t\tel.src = `${baseUrl ?? buildBase(version)}/locales/${base}.js`;\n\t\tel.async = true;\n\t\tel.crossOrigin = 'anonymous';\n\t\tel.addEventListener('load', () => {\n\t\t\tel!.dataset.loaded = 'true';\n\t\t\tresolve();\n\t\t});\n\t\tel.addEventListener('error', () => reject(new Error(`roxy-ui locale ${base} load failed`)));\n\t\tdocument.head.appendChild(el);\n\t});\n\tlocalesLoaded.set(base, pending);\n\treturn pending;\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-vue\n// was generated against. Useful for diagnostics; not load-bearing.\n"],
5
5
  "mappings": "AAyBO,IAAMA,EAAkB,SAEzBC,EAAY,oBACZC,EAAkB,2DAClBC,EAAkB,4CAClBC,EAAkB,YAEpBC,EAA+B,KAEnC,SAASC,EAAUC,EAAyB,CAC3C,MAAI,CAACA,GAAWA,IAAY,SAAiBL,EACtC,GAAGC,CAAe,GAAGI,CAAO,GAAGH,CAAe,EACtD,CAEO,SAASI,EACfD,EAAkBP,EAClBS,EACgB,CAChB,OAAI,OAAO,SAAa,IAAoB,QAAQ,QAAQ,EACxDJ,IAEJA,EAAS,IAAI,QAAc,CAACK,EAASC,IAAW,CAC/C,IAAMC,EAAM,GAAGH,GAAWH,EAAUC,CAAO,CAAC,cACxCM,EAAW,SAAS,eAAeZ,CAAS,EAChD,GAAIY,EAAU,CACTA,EAAS,QAAQ,SAAW,OAC/BH,EAAQ,GAERG,EAAS,iBAAiB,OAAQ,IAAMH,EAAQ,CAAC,EACjDG,EAAS,iBAAiB,QAAS,IAAMF,EAAO,IAAI,MAAM,qBAAqB,CAAC,CAAC,GAElF,MACD,CACAE,EAAW,SAAS,cAAc,QAAQ,EAC1CA,EAAS,GAAKZ,EACdY,EAAS,IAAMD,EACfC,EAAS,MAAQ,GACjBA,EAAS,YAAc,YACvBA,EAAS,iBAAiB,OAAQ,IAAM,CACvCA,EAAU,QAAQ,OAAS,OAC3BH,EAAQ,CACT,CAAC,EACDG,EAAS,iBAAiB,QAAS,IAAMF,EAAO,IAAI,MAAM,qBAAqB,CAAC,CAAC,EACjF,SAAS,KAAK,YAAYE,CAAQ,CACnC,CAAC,EACMR,EACR,CAGO,IAAMS,EAAkB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,UAAU,SAAS,EAEhFC,EAAgB,IAAI,IA8BnB,SAASC,EACfC,EACAV,EAAkBP,EAClBS,EACgB,CAChB,GAAI,OAAO,SAAa,IAAa,OAAO,QAAQ,QAAQ,EAC5D,IAAMS,GAAQD,GAAQ,IAAI,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,GAAK,GACzD,GAAI,CAAEH,EAAsC,SAASI,CAAI,EACxD,OAAO,QAAQ,QAAQ,EAExB,IAAML,EAAWE,EAAc,IAAIG,CAAI,EACvC,GAAIL,EAAU,OAAOA,EAErB,IAAMM,EAAU,IAAI,QAAc,CAACT,EAASC,IAAW,CACtD,IAAMS,EAAK,GAAGnB,CAAS,WAAWiB,CAAI,GAClCG,EAAK,SAAS,eAAeD,CAAE,EACnC,GAAIC,EAAI,CACHA,EAAG,QAAQ,SAAW,OAAQX,EAAQ,GAEzCW,EAAG,iBAAiB,OAAQ,IAAMX,EAAQ,CAAC,EAC3CW,EAAG,iBAAiB,QAAS,IAAMV,EAAO,IAAI,MAAM,kBAAkBO,CAAI,cAAc,CAAC,CAAC,GAE3F,MACD,CACAG,EAAK,SAAS,cAAc,QAAQ,EACpCA,EAAG,GAAKD,EACRC,EAAG,IAAM,GAAGZ,GAAWH,EAAUC,CAAO,CAAC,YAAYW,CAAI,MACzDG,EAAG,MAAQ,GACXA,EAAG,YAAc,YACjBA,EAAG,iBAAiB,OAAQ,IAAM,CACjCA,EAAI,QAAQ,OAAS,OACrBX,EAAQ,CACT,CAAC,EACDW,EAAG,iBAAiB,QAAS,IAAMV,EAAO,IAAI,MAAM,kBAAkBO,CAAI,cAAc,CAAC,CAAC,EAC1F,SAAS,KAAK,YAAYG,CAAE,CAC7B,CAAC,EACD,OAAAN,EAAc,IAAIG,EAAMC,CAAO,EACxBA,CACR,CAGA,IAAOG,EAAQd",
6
6
  "names": ["ROXY_UI_VERSION", "SCRIPT_ID", "CDN_BASE_LATEST", "CDN_BASE_PREFIX", "CDN_BASE_SUFFIX", "loaded", "buildBase", "version", "ensureScriptLoaded", "baseUrl", "resolve", "reject", "url", "existing", "ROXY_UI_LOCALES", "localesLoaded", "ensureLocaleLoaded", "lang", "base", "pending", "id", "el", "load_ui_default"]
7
7
  }
@@ -13509,7 +13509,7 @@ export type GetDailyHoroscopeResponses = {
13509
13509
  */
13510
13510
  moonSign: string;
13511
13511
  /**
13512
- * Current lunar phase (New Moon, Waxing Crescent, First Quarter, Waxing Gibbous, Full Moon, Waning Gibbous, Last Quarter, Waning Crescent).
13512
+ * Display name of the current lunar phase, one of the eight standard phases from New Moon through Waning Crescent. Translates in place with the lang parameter, like the moonSign beside it, so render it directly.
13513
13513
  */
13514
13514
  moonPhase: string;
13515
13515
  /**
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Turn a compact API response back into the plain shape the components render.
3
+ *
4
+ * @remarks
5
+ * Asking a Remote MCP tool for a compact result trades repeated field names for a header: an array of same-shaped objects arrives as `{ __cols: [names], __rows: [[values]] }`, which costs an agent far fewer tokens to read and carries exactly the same data. This is the decoder, applied at every depth, so a compact result renders in a component with nothing else to do.
6
+ *
7
+ * Every data component runs it on the way in, so a page that sets `data` from a tool result needs no call of its own. It is exported for the paths that hold the JSON before an element does.
8
+ *
9
+ * A value with nothing encoded in it is returned unchanged, by reference.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * expandCompact({ aspects: { __cols: ['a', 'b'], __rows: [['sun', 'moon'], ['sun', 'mars'], ['moon', 'mars']] } });
14
+ * // { aspects: [{ a: 'sun', b: 'moon' }, { a: 'sun', b: 'mars' }, { a: 'moon', b: 'mars' }] }
15
+ * ```
16
+ */
17
+ export declare function expandCompact<T>(value: T): T;
18
+ //# sourceMappingURL=compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.d.ts","sourceRoot":"","sources":["../../src/utils/compact.ts"],"names":[],"mappings":"AAqDA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAE5C"}
@@ -0,0 +1,28 @@
1
+ import { type ToolComponentEntry } from '../generated/tool-components.js';
2
+ /** The component that renders one MCP tool result, plus the name it was matched on. */
3
+ export interface ToolComponent extends ToolComponentEntry {
4
+ /** The name the lookup resolved, with any server prefix removed. */
5
+ toolName: string;
6
+ }
7
+ /**
8
+ * The component that renders the result of one MCP tool call, or `undefined` when nothing in the library draws that shape.
9
+ *
10
+ * @remarks
11
+ * The name is what every model vendor hands back beside a tool result, so it is the key this resolves on. A host is free to prefix it with the server the tool came from and a colon; ours never contain one, so everything up to the last colon is dropped before the lookup.
12
+ *
13
+ * The table is resolved at build time, so this is a property read rather than a scan and the browser carries only the four fields a caller acts on.
14
+ *
15
+ * The result is a `data` consumer like any other: parse the JSON out of the tool result, set it on the element, and set the `attrs` beside it.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const found = componentForTool('post_tarot_spreads_three_card');
20
+ * if (found) {
21
+ * const el = document.createElement(found.tag);
22
+ * for (const [name, value] of Object.entries(found.attrs ?? {})) el.setAttribute(name, value);
23
+ * el.data = JSON.parse(result.content[0].text);
24
+ * }
25
+ * ```
26
+ */
27
+ export declare function componentForTool(name: string): ToolComponent | undefined;
28
+ //# sourceMappingURL=tool-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-component.d.ts","sourceRoot":"","sources":["../../src/utils/tool-component.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,kBAAkB,EACvB,MAAM,iCAAiC,CAAC;AAEzC,uFAAuF;AACvF,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACxD,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAKxE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roxyapi/ui-vue",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "description": "Vue components for the RoxyAPI catalog. Drop-in charts, tables, cards, forms for astrology, tarot, numerology, biorhythm, I Ching, and more. One key, beautiful in 30 minutes.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",