{"_id":"@boteai/a2ui-render","_rev":"7-c6f8abca5227cc5d416f6ccb174df1c1","name":"@boteai/a2ui-render","dist-tags":{"latest":"0.0.3","beta":"0.0.2-beta.3"},"versions":{"0.0.1":{"name":"@boteai/a2ui-render","version":"0.0.1","keywords":["a2ui","render","react"],"license":"MIT","_id":"@boteai/a2ui-render@0.0.1","maintainers":[{"name":"wujian666","email":"sunboyjian@126.com"}],"dist":{"shasum":"e04c132b32d5d3391566d42d268aab54e054bc42","tarball":"https://registry.npmjs.org/@boteai/a2ui-render/-/a2ui-render-0.0.1.tgz","fileCount":95,"integrity":"sha512-cxHzXlAtRasUywN8NQprYoQsft+gWuRMrfaT3zn1zSPnaNHPzjR5aHdChkL/AnMTRwQzNMcYSoW3ldTK7IJtHQ==","signatures":[{"sig":"MEQCIAG/8RPnRWCaDwdftsfRxZSapL+WgGFBEdkP1O4CvAGzAiAlP7hlb+Kexa+ZxvuQkYkIOsG1zE9XHEHE+Vx6SjQlIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2895903},"types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","authors":["wujian"],"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","default":"./dist/esm/index.js"}},"gitHead":"fc602bb07a159e95804d4857057d8aab3345d2a8","scripts":{"dev":"node ./scripts/embedShadowCss.js && father dev --no-clean","build":"node ./scripts/embedShadowCss.js && father build --no-clean","build:deps":"father prebundle","build:external":"node ./scripts/buildExternal.js","build:lit-compat":"node ./scripts/buildLitCompat.js"},"_npmUser":{"name":"wujian666","email":"sunboyjian@126.com"},"_npmVersion":"10.9.3","description":"博特-A2UI 协议渲染引擎","directories":{},"resolutions":{"@types/react":"17.x","@types/react-dom":"17.x"},"_nodeVersion":"22.20.0","dependencies":{"zod":"^3.25.76","@a2ui/lit":"^0.9.3","@a2ui/web_core":"^0.9.2","@babel/runtime":"^7.23.9","@a2ui/markdown-it":"^0.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"antd":"4.24.14","father":"^4.4.5","esbuild":"^0.28.0","stylelint":"^15.7.0","@types/react":"^17.0.0","babel-loader":"^9.1.3","@types/react-dom":"^17.0.0","@babel/preset-env":"^7.23.9","babel-preset-react-app":"^10.0.1"},"peerDependencies":{"react":"^17.x","react-dom":"^17.x"},"_npmOperationalInternal":{"tmp":"tmp/a2ui-render_0.0.1_1781255757215_0.19817993667347955","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-beta.1":{"name":"@boteai/a2ui-render","version":"0.0.1-beta.1","keywords":["a2ui","render","react"],"license":"MIT","_id":"@boteai/a2ui-render@0.0.1-beta.1","maintainers":[{"name":"wujian666","email":"sunboyjian@126.com"}],"dist":{"shasum":"0a6b1a7732ecd3f04a754dd38175abe571d82083","tarball":"https://registry.npmjs.org/@boteai/a2ui-render/-/a2ui-render-0.0.1-beta.1.tgz","fileCount":95,"integrity":"sha512-qpHT+YGWXeaHnzBK5bECBJHNJG3yzYanVjgdieymt3NmghlOWxm+FMWLZ3zVVuH0+MM3AvWpxXhtPP+Qt1S1kg==","signatures":[{"sig":"MEUCIQDPU2w9ecqjmB5NKJF7aJX+juNpqoS5zsz4/PGx5/h0KgIgAb/AuwBuhTOoFz1ERR08UvgGMjXJLt3wrwJ58Sl99us=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2895910},"types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","authors":["wujian"],"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","default":"./dist/esm/index.js"}},"gitHead":"8af58bba7b68752cbbd688b0d0e19aa32f3794e1","scripts":{"dev":"node ./scripts/embedShadowCss.js && father dev --no-clean","build":"node ./scripts/embedShadowCss.js && father build --no-clean","build:deps":"father prebundle","build:external":"node ./scripts/buildExternal.js","build:lit-compat":"node ./scripts/buildLitCompat.js"},"_npmUser":{"name":"wujian666","email":"sunboyjian@126.com"},"_npmVersion":"10.9.3","description":"博特-A2UI 协议渲染引擎","directories":{},"resolutions":{"@types/react":"17.x","@types/react-dom":"17.x"},"_nodeVersion":"22.20.0","dependencies":{"zod":"^3.25.76","@a2ui/lit":"^0.9.3","@a2ui/web_core":"^0.9.2","@babel/runtime":"^7.23.9","@a2ui/markdown-it":"^0.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"antd":"4.24.14","father":"^4.4.5","esbuild":"^0.28.0","stylelint":"^15.7.0","@types/react":"^17.0.0","babel-loader":"^9.1.3","@types/react-dom":"^17.0.0","@babel/preset-env":"^7.23.9","babel-preset-react-app":"^10.0.1"},"peerDependencies":{"react":"^17.x","react-dom":"^17.x"},"_npmOperationalInternal":{"tmp":"tmp/a2ui-render_0.0.1-beta.1_1782733584280_0.9745699682280389","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@boteai/a2ui-render","version":"0.0.2","keywords":["a2ui","render","react"],"license":"MIT","_id":"@boteai/a2ui-render@0.0.2","maintainers":[{"name":"wujian666","email":"sunboyjian@126.com"}],"dist":{"shasum":"d58cdeb3bf254942850bc903a67d6a6e605c8ef7","tarball":"https://registry.npmjs.org/@boteai/a2ui-render/-/a2ui-render-0.0.2.tgz","fileCount":95,"integrity":"sha512-JGxqfwp+OYdQhc8hjmdY1BXXQQywHRZwXBN3j2MWBJPA1QYr2Zt+sT3VmwhrcdeK23u76o4MhX9JP92hSQFa/w==","signatures":[{"sig":"MEYCIQDhBlfWKgTCrftjz6KboATC015MAqUfrPIS3LVI2KzcZQIhAOA3Hc1UDfRZHFHGGsXaspdFepozc8DpotHBGcnB7meD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2906506},"types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","authors":["wujian"],"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","default":"./dist/esm/index.js"}},"gitHead":"a6be7ae9790122776c47636070458c6f18f885ab","scripts":{"dev":"node ./scripts/embedShadowCss.js && father dev --no-clean","build":"node ./scripts/embedShadowCss.js && father build --no-clean","build:deps":"father prebundle","build:external":"node ./scripts/buildExternal.js","build:lit-compat":"node ./scripts/buildLitCompat.js"},"_npmUser":{"name":"wujian666","email":"sunboyjian@126.com"},"_npmVersion":"10.9.3","description":"博特-A2UI 协议渲染引擎","directories":{},"resolutions":{"@types/react":"17.x","@types/react-dom":"17.x"},"_nodeVersion":"22.20.0","dependencies":{"zod":"^3.25.76","@a2ui/lit":"^0.9.3","@a2ui/web_core":"^0.9.2","@babel/runtime":"^7.23.9","@a2ui/markdown-it":"^0.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"antd":"4.24.14","father":"^4.4.5","esbuild":"^0.28.0","stylelint":"^15.7.0","@types/react":"^17.0.0","babel-loader":"^9.1.3","@types/react-dom":"^17.0.0","@babel/preset-env":"^7.23.9","babel-preset-react-app":"^10.0.1"},"peerDependencies":{"react":"^17.x","react-dom":"^17.x"},"_npmOperationalInternal":{"tmp":"tmp/a2ui-render_0.0.2_1782819425543_0.9487135852336515","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-beta.1":{"name":"@boteai/a2ui-render","version":"0.0.2-beta.1","keywords":["a2ui","render","react"],"license":"MIT","_id":"@boteai/a2ui-render@0.0.2-beta.1","maintainers":[{"name":"wujian666","email":"sunboyjian@126.com"}],"dist":{"shasum":"88da60e32f8ac882308d6facf8a34093a8286807","tarball":"https://registry.npmjs.org/@boteai/a2ui-render/-/a2ui-render-0.0.2-beta.1.tgz","fileCount":95,"integrity":"sha512-RgBXXj4jVDYAIf+te227d0ssST5OBFhV4cuXisxPcj+0p4vKR2YeN/gvxD9VngbOBM06NKqb9WHGV/xNv/IXuA==","signatures":[{"sig":"MEQCIAfdDQZ9WEc5emFTL45R77M+rhkLa6ZX+qjFfYCXJCmFAiBc3sEzHDfEt5N9soN1K4fcNatYGDlFbahzLfhEG/JMtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2906513},"types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","authors":["wujian"],"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","default":"./dist/esm/index.js"}},"gitHead":"89d1bc97a1b51fc0681303c9d44cb20dbda5911b","scripts":{"dev":"node ./scripts/embedShadowCss.js && father dev --no-clean","build":"node ./scripts/embedShadowCss.js && father build --no-clean","build:deps":"father prebundle","build:external":"node ./scripts/buildExternal.js","build:lit-compat":"node ./scripts/buildLitCompat.js"},"_npmUser":{"name":"wujian666","email":"sunboyjian@126.com"},"_npmVersion":"10.9.3","description":"博特-A2UI 协议渲染引擎","directories":{},"resolutions":{"@types/react":"17.x","@types/react-dom":"17.x"},"_nodeVersion":"22.20.0","dependencies":{"zod":"^3.25.76","@a2ui/lit":"^0.9.3","@a2ui/web_core":"^0.9.2","@babel/runtime":"^7.23.9","@a2ui/markdown-it":"^0.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"antd":"4.24.14","father":"^4.4.5","esbuild":"^0.28.0","stylelint":"^15.7.0","@types/react":"^17.0.0","babel-loader":"^9.1.3","@types/react-dom":"^17.0.0","@babel/preset-env":"^7.23.9","babel-preset-react-app":"^10.0.1"},"peerDependencies":{"react":"^17.x","react-dom":"^17.x"},"_npmOperationalInternal":{"tmp":"tmp/a2ui-render_0.0.2-beta.1_1783301778559_0.9058299992371932","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-beta.2":{"name":"@boteai/a2ui-render","version":"0.0.2-beta.2","keywords":["a2ui","render","react"],"license":"MIT","_id":"@boteai/a2ui-render@0.0.2-beta.2","maintainers":[{"name":"wujian666","email":"sunboyjian@126.com"}],"dist":{"shasum":"aaf933aed8c439ed7bec608e0bb81e7ce2ae8f95","tarball":"https://registry.npmjs.org/@boteai/a2ui-render/-/a2ui-render-0.0.2-beta.2.tgz","fileCount":95,"integrity":"sha512-+pCIKH7k5gAvl2H5SGi3fYpnH6+HNVKTgRe4kqTi/HM2HWxbQaks9Yiag4T5ybdzYbYNrfS7WJ55OAXtcRUeVw==","signatures":[{"sig":"MEYCIQDF+lGBtZ31LYF1tjsni0K7umg2ZmXy2RFs2veqLbq9UAIhAOtJ1l8eJ+ElgMNIHOXUlNRGeoS993VIvCYFN9mZfj/r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2908930},"types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","authors":["wujian"],"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","default":"./dist/esm/index.js"}},"gitHead":"46c261c709d196c2201c7ff52ceb2393db83a35e","scripts":{"dev":"node ./scripts/embedShadowCss.js && father dev --no-clean","build":"node ./scripts/embedShadowCss.js && father build --no-clean","build:deps":"father prebundle","build:external":"node ./scripts/buildExternal.js","build:lit-compat":"node ./scripts/buildLitCompat.js"},"_npmUser":{"name":"wujian666","email":"sunboyjian@126.com"},"_npmVersion":"10.9.3","description":"博特-A2UI 协议渲染引擎","directories":{},"resolutions":{"@types/react":"17.x","@types/react-dom":"17.x"},"_nodeVersion":"22.20.0","dependencies":{"zod":"^3.25.76","@a2ui/lit":"^0.9.3","@a2ui/web_core":"^0.9.2","@babel/runtime":"^7.23.9","@a2ui/markdown-it":"^0.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"antd":"4.24.14","father":"^4.4.5","esbuild":"^0.28.0","stylelint":"^15.7.0","@types/react":"^17.0.0","babel-loader":"^9.1.3","@types/react-dom":"^17.0.0","@babel/preset-env":"^7.23.9","babel-preset-react-app":"^10.0.1"},"peerDependencies":{"react":"^17.x","react-dom":"^17.x"},"_npmOperationalInternal":{"tmp":"tmp/a2ui-render_0.0.2-beta.2_1783304933597_0.9806533209174548","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-beta.3":{"name":"@boteai/a2ui-render","version":"0.0.2-beta.3","keywords":["a2ui","render","react"],"license":"MIT","_id":"@boteai/a2ui-render@0.0.2-beta.3","maintainers":[{"name":"wujian666","email":"sunboyjian@126.com"}],"dist":{"shasum":"6b58adb1bfb0edca7097cf19febfb495a9f03355","tarball":"https://registry.npmjs.org/@boteai/a2ui-render/-/a2ui-render-0.0.2-beta.3.tgz","fileCount":95,"integrity":"sha512-+7O6Zr0LFihta4nNseIgu+Hm7LyMSWvwhztEbF+U3BhCQeMgltn7w2JD+g1jUJ0bUHGRccwh2Atn+Kno1mNJHg==","signatures":[{"sig":"MEUCIA2WXLy2uXpSYl3toPNpxRN4gn1uCd+RLPcS7VWv8Zw+AiEA58s55Qe9lOS47zhr70JBqQzmzI83LENndzNjxPhwJ6o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2908930},"types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","authors":["wujian"],"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","default":"./dist/esm/index.js"}},"gitHead":"62d7ea5a42e534b3fef3e92ca7e9a1a7bddf7d60","scripts":{"dev":"node ./scripts/embedShadowCss.js && father dev --no-clean","build":"node ./scripts/embedShadowCss.js && father build --no-clean","build:deps":"father prebundle","build:external":"node ./scripts/buildExternal.js","build:lit-compat":"node ./scripts/buildLitCompat.js"},"_npmUser":{"name":"wujian666","email":"sunboyjian@126.com"},"_npmVersion":"10.9.3","description":"博特-A2UI 协议渲染引擎","directories":{},"resolutions":{"@types/react":"17.x","@types/react-dom":"17.x"},"_nodeVersion":"22.20.0","dependencies":{"zod":"^3.25.76","@a2ui/lit":"^0.9.3","@a2ui/web_core":"^0.9.2","@babel/runtime":"^7.23.9","@a2ui/markdown-it":"^0.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"antd":"4.24.14","father":"^4.4.5","esbuild":"^0.28.0","stylelint":"^15.7.0","@types/react":"^17.0.0","babel-loader":"^9.1.3","@types/react-dom":"^17.0.0","@babel/preset-env":"^7.23.9","babel-preset-react-app":"^10.0.1"},"peerDependencies":{"react":"^17.x","react-dom":"^17.x"},"_npmOperationalInternal":{"tmp":"tmp/a2ui-render_0.0.2-beta.3_1783305555832_0.42822310270605035","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@boteai/a2ui-render","version":"0.0.3","description":"博特-A2UI 协议渲染引擎","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","default":"./dist/esm/index.js"}},"scripts":{"dev":"node ./scripts/embedShadowCss.js && father dev --no-clean","build":"node ./scripts/embedShadowCss.js && father build --no-clean","build:lit-compat":"node ./scripts/buildLitCompat.js","build:external":"node ./scripts/buildExternal.js","build:deps":"father prebundle"},"keywords":["a2ui","render","react"],"authors":["wujian"],"license":"MIT","publishConfig":{"access":"public"},"resolutions":{"@types/react":"17.x","@types/react-dom":"17.x"},"devDependencies":{"@babel/preset-env":"^7.23.9","@types/react":"^17.0.0","@types/react-dom":"^17.0.0","antd":"4.24.14","babel-loader":"^9.1.3","babel-preset-react-app":"^10.0.1","esbuild":"^0.28.0","father":"^4.4.5","stylelint":"^15.7.0"},"peerDependencies":{"react":"^17.x","react-dom":"^17.x"},"dependencies":{"@a2ui/lit":"^0.9.3","@a2ui/markdown-it":"^0.0.3","@a2ui/web_core":"^0.9.2","@babel/runtime":"^7.23.9","zod":"^3.25.76"},"gitHead":"8eb3d365a67c3fe7ab9606aeed077053e1b40da4","_id":"@boteai/a2ui-render@0.0.3","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-QUiDq08eKF3V9Z4FPgfd+zxb5GYvRshzbjg9y6omUdaJFfsEjiJAmSvwjzpUqdsMcNNUM+uqcBvSHq29V4cScQ==","shasum":"4db7649ed1abc69176ba86e4f73f26e5afc9a565","tarball":"https://registry.npmjs.org/@boteai/a2ui-render/-/a2ui-render-0.0.3.tgz","fileCount":89,"unpackedSize":2890966,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHQwjuNZVjYmsm3Ws4f7rr59XLrtLtf75rmDvoVt5Pi/AiEAvzxlP+oYIMZd2ug59fEPVUBP/NzH2/L2RSJYWRA9H3A="}]},"_npmUser":{"name":"wujian666","email":"sunboyjian@126.com"},"directories":{},"maintainers":[{"name":"wujian666","email":"sunboyjian@126.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/a2ui-render_0.0.3_1789228113515_0.8398726457644217"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-12T09:15:57.022Z","modified":"2026-09-12T15:48:33.802Z","0.0.1":"2026-06-12T09:15:57.371Z","0.0.1-beta.1":"2026-06-29T11:46:24.452Z","0.0.2":"2026-06-30T11:37:05.737Z","0.0.2-beta.1":"2026-07-06T01:36:18.705Z","0.0.2-beta.2":"2026-07-06T02:28:53.761Z","0.0.2-beta.3":"2026-07-06T02:39:16.056Z","0.0.3":"2026-09-12T15:48:33.659Z"},"license":"MIT","keywords":["a2ui","render","react"],"description":"博特-A2UI 协议渲染引擎","maintainers":[{"name":"wujian666","email":"sunboyjian@126.com"}],"readme":"# @boteai/a2ui-render\r\n\r\n**仓库**：[github.com/BoteAI/a2ui](https://github.com/BoteAI/a2ui)\r\n\r\n## 这个包是做什么的\r\n\r\n**把 A2UI 协议里的 messages JSON 渲染为可交互的 React 界面。**\r\n\r\nAgent 或后端下发描述界面结构与数据绑定的消息数组，本包负责解析、绘制标准 A2UI 组件、主题样式与 `onAction` 回调。只需安装 **`@boteai/a2ui-render`**（及 React 17 peer）即可接入，**不依赖** `@boteai/a2ui-custom-kit` 或 `@boteai/types`。\r\n\r\n自定义组件有两种接入方式：\r\n\r\n| 方式 | 适用场景 |\r\n|------|----------|\r\n| **`remoteComponentUrls`** | 远程 `.mjs` 已部署到 CDN，传 URL 即可（推荐） |\r\n| **`customComponents`** | 本地静态注册表，或在 `useEffect` 中手动合并远程加载结果 |\r\n\r\n自定义组件的**开发**与 ESM 打包见 **`@boteai/a2ui-custom-kit`** 与仓库文档 [`app/public/docs/custom-components-guide.md`](../../app/public/docs/custom-components-guide.md)。\r\n\r\n---\r\n\r\n## 快速开始\r\n\r\n```bash\r\nyarn add @boteai/a2ui-render\r\n```\r\n\r\n```tsx\r\nimport { BaseRenderer, type A2UIMessage } from '@boteai/a2ui-render';\r\n\r\nconst messages: A2UIMessage[] = [/* 与 protocolVersion 一致的协议消息 */];\r\n\r\n<BaseRenderer\r\n  messages={messages}\r\n  protocolVersion=\"0.9\"\r\n  themePreset=\"conversation\"\r\n  onAction={({ name, context }) => {\r\n    /* 按钮、表单等交互 */\r\n  }}\r\n/>\r\n```\r\n\r\n---\r\n\r\n## 核心 Props（BaseRenderer）\r\n\r\n| Prop | 说明 |\r\n|------|------|\r\n| `messages` | A2UI 协议消息数组 |\r\n| `protocolVersion` | `'0.8'` 或 `'0.9'` |\r\n| `themePreset` | 内置主题：`default` / `conversation` / `cyber` / `platformInterconnect` / `deepBlueWisdom` |\r\n| `onAction` | 用户交互回调 |\r\n| `customComponents` | 本地自定义组件注册表，key 与协议 `\"component\"` 一致 |\r\n| `remoteComponentUrls` | 远程 ESM `.mjs` URL 数组，**内部自动加载并与 `customComponents` 合并** |\r\n| `injectAntdStylesInShadow` | 远程组件使用 antd 时建议开启 |\r\n\r\n完整主题变量见同目录 **`styleVars.md`**。\r\n\r\n---\r\n\r\n## 远程自定义组件（传 URL）\r\n\r\n**推荐**：直接把 CDN 上的 `.mjs` 地址传给 `remoteComponentUrls`，无需先 `await` 加载，也无需安装 `@boteai/a2ui-custom-kit`。\r\n\r\n```tsx\r\nimport { BaseRenderer } from '@boteai/a2ui-render';\r\n\r\n<BaseRenderer\r\n  messages={messages}\r\n  protocolVersion=\"0.9\"\r\n  remoteComponentUrls={[\r\n    'https://cdn.example.com/DemoNativeElement.mjs',\r\n    'https://cdn.example.com/DemoActionDispatch.mjs',\r\n  ]}\r\n  onAction={handleAction}\r\n/>\r\n```\r\n\r\n可与本地注册表同时使用（远程项与 `customComponents` 合并，同名时以后者为准）：\r\n\r\n```tsx\r\n<BaseRenderer\r\n  messages={messages}\r\n  protocolVersion=\"0.9\"\r\n  customComponents={localRegistry}\r\n  remoteComponentUrls={['https://cdn.example.com/DemoNativeElement.mjs']}\r\n  onAction={handleAction}\r\n/>\r\n```\r\n\r\n远程模块须为浏览器可 `import()` 的 **ESM**，并命名导出注册表，默认导出名 `a2uiRemoteRegistry`（也支持 `a2uiCustomRegistry`、`registry`）。\r\n\r\n---\r\n\r\n## 手动加载远程注册表（高级）\r\n\r\n需要在渲染前自行控制加载时机时，使用本包导出的 loader（类型同样从本包导入）：\r\n\r\n```ts\r\nimport {\r\n  loadRemoteA2UICustomRegistry,\r\n  loadRemoteA2UICustomRegistries,\r\n  type A2UICustomComponentRegistry,\r\n} from '@boteai/a2ui-render';\r\n\r\n// 单个 URL\r\nconst remotePart = await loadRemoteA2UICustomRegistry(\r\n  'https://cdn.example.com/DemoNativeElement.mjs',\r\n);\r\n\r\n// 多个 URL\r\nconst merged = await loadRemoteA2UICustomRegistries([\r\n  'https://cdn.example.com/DemoNativeElement.mjs',\r\n  'https://cdn.example.com/DemoActionDispatch.mjs',\r\n]);\r\n\r\nconst customComponents: A2UICustomComponentRegistry = {\r\n  ...localRegistry,\r\n  ...remotePart,\r\n};\r\n```\r\n\r\n```tsx\r\n<BaseRenderer\r\n  messages={messages}\r\n  protocolVersion=\"0.9\"\r\n  customComponents={customComponents}\r\n  onAction={handleAction}\r\n/>\r\n```\r\n\r\n非默认导出名时：`loadRemoteA2UICustomRegistry(url, { exportName: 'yourExport' })`。\r\n\r\n---\r\n\r\n## 主要导出\r\n\r\n| 导出 | 说明 |\r\n|------|------|\r\n| `BaseRenderer` | 核心渲染器 |\r\n| `BoteRenderer` | 博特扩展渲染器 |\r\n| `LitSurfaceHost` | 底层 Lit 宿主（高级） |\r\n| `A2UI_THEME_PRESETS` / `A2UI_THEME_PRESET_NAMES` | 内置主题 |\r\n| `loadRemoteA2UICustomRegistry` | 加载单个远程 `.mjs` |\r\n| `loadRemoteA2UICustomRegistries` | 批量加载并合并 |\r\n| `inferProtocolVersionFromMessages` | 自动推断 v0.8 / v0.9 |\r\n| `useResponsive` / `isMobile` 等 | 响应式工具 |\r\n| `A2UIMessage` / `A2UICustomComponentRegistry` 等 | 类型定义（本包自带，无需 `@boteai/types`） |\r\n| `a2uiPresetComponentRegistry` | 内置 Preset 组件注册表，可直接传给 `BaseRenderer.customComponents` |\r\n| `a2uiPresetComponentSchemas` | 内置 Preset 组件 JSON Schema（agent 格式），供配置器 / codegen 使用 |\r\n\r\n### 内置 Preset 组件（直接 import）\r\n\r\n```tsx\r\nimport {\r\n  BaseRenderer,\r\n  a2uiPresetComponentRegistry,\r\n  a2uiPresetComponentSchemas,\r\n} from '@boteai/a2ui-render';\r\n\r\n<BaseRenderer\r\n  messages={messages}\r\n  protocolVersion=\"0.9\"\r\n  customComponents={a2uiPresetComponentRegistry}\r\n  onAction={handleAction}\r\n/>\r\n```\r\n\r\nPreset 组件已独立为 `@boteai/a2ui-comp-preset` 包（`packages/a2ui-comp-preset/`）。新增组件：在该包 `src/` 按模板添加，并在 `manifest.ts` 登记后执行 `yarn build`（仓库根目录会构建各包）。\r\n\r\nNode 脚本（如配置器 codegen）仅需 schema 时，请使用 `@boteai/a2ui-comp-preset/schemas`。\r\n\r\n仅需注册表时，请使用 `@boteai/a2ui-comp-preset/registry`。\r\n\r\n---\r\n\r\n## 使用 antd 的远程组件\r\n\r\nA2UI 在嵌套 ShadowRoot 中渲染，全局 `antd.css` 不会自动穿透：\r\n\r\n```tsx\r\n<BaseRenderer\r\n  messages={messages}\r\n  protocolVersion=\"0.9\"\r\n  remoteComponentUrls={['https://cdn.example.com/YourComponent.mjs']}\r\n  injectAntdStylesInShadow\r\n  onAction={handleAction}\r\n/>\r\n```\r\n\r\n远程 bundle **无需** 再 `import 'antd/dist/antd.min.css'`。`Select` 等弹出层建议 `ConfigProvider` + `getPopupContainer` 指向 Shadow 内节点。\r\n\r\n---\r\n\r\n## 相关文档\r\n\r\n- **主题变量**：`styleVars.md`\r\n- **自定义组件开发全流程**：[`app/public/docs/custom-components-guide.md`](../../app/public/docs/custom-components-guide.md)\r\n- **本仓库 Playground**：`app/src/pages/a2ui-playgroup`\r\n","readmeFilename":"README.md"}