{"_id":"juneau","_rev":"40-807931b151773996ae58a3e10d99ddb9","name":"juneau","dist-tags":{"latest":"0.14.0"},"versions":{"0.1.0":{"name":"juneau","version":"0.1.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.1.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"bad4e3b8d43db7b33c4c0402db3ddca84794aeda","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.1.0.tgz","fileCount":55,"integrity":"sha512-ic99zkBlTTvCfAsXT8Ren1XY0MkimBji3h9tgUqZICGWNEFSnUfwqhjVpcFPnkFl4Qzl2tRvp3AW4lsC4oQiEw==","signatures":[{"sig":"MEUCIAdCE7xigmMbPGglSv58D06ibk8KeCYEYkW0PhTM3D5JAiEAxDUDN1mVxSVdNRRhNFr7WyNBgOLtd85zuvvd8DVT4sw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2589653},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"d487ff8e13b93b2d8f05128e4d6186da25c6b01f","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.1.0_1786568404529_0.7163902952509482","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"juneau","version":"0.1.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.1.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"e85256e5ef5f860d8a694781fedbbc905da9b1ff","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.1.1.tgz","fileCount":59,"integrity":"sha512-lvO1GIMFiSN8BD4Q7iG+XA/ELAQ55mcCTNhPNVMWovgpcu41Smprnd5Sp+j2tD3GI8Ts+cFl8WY7LQAp3GSsHw==","signatures":[{"sig":"MEQCIEaHYARbDeUTtPtlOatyUydzRdZFKL3sfnQkyNGUmKOmAiBsk0fGvchsnxwhc2qjeHV2sIPrMm1eiDx3P7vo1KlOYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2648356},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"d487ff8e13b93b2d8f05128e4d6186da25c6b01f","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.1.1_1786569596772_0.9250512747975128","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"juneau","version":"0.1.3","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.1.3","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"db2a4e531e4f56726175c1101e88a78e38fc7cbb","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.1.3.tgz","fileCount":59,"integrity":"sha512-8G4VkHZm+j0Y0K7tdk3v5OanxIZSjYnokekM1oBVG/YJJ00ibKgfn+ZyFde64aI9V17XIOV+YS/5iz5UZbp/Lw==","signatures":[{"sig":"MEUCIQC0Eg/0AMUn6ZOyCUaHdU7+d6NNTU9ZNbbLTZ9r6MOGfgIgQn/qxeXn+92odOzut8Q1oaOxwlY051b3HPX11jbIdKI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2660237},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"770a0320ef796e5b826e3d0b9dd0d57ed2f5afcf","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.1.3_1786571355090_0.8305425737961936","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"juneau","version":"0.1.4","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.1.4","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"1cf8111cff74e7be53c9d291bbbc5880b8c9a03f","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.1.4.tgz","fileCount":59,"integrity":"sha512-ntrgCNDrv8VQPx5TqcOKWhiEdQSpLLATyRl+Dtt0w7/sGSUj/4XWuPIRQJXPUfWTz66JrpWaGJUfYlh+8Psdpw==","signatures":[{"sig":"MEUCIQDsBcHmDxVfsoXmMZV03YedezXbBvwEI9yfs4hU8vMeGgIgOuhWm8UAVlgM9suXGAafYTmN72g5R9E0HjmPXWZchzk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2662999},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"770a0320ef796e5b826e3d0b9dd0d57ed2f5afcf","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.1.4_1786968585142_0.01761771078490071","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"juneau","version":"0.2.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.2.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"5708dbb355fbc07ae4e51dbe736f0219eba1e401","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.2.0.tgz","fileCount":65,"integrity":"sha512-VYpemXicbWkFfdjWLKjfbaliOrWa1QGuB5GqDonSxoZKIVfBpQUSUYFPSoHw7yWRPSEoQ0fmeBbkDf/WTo2QSQ==","signatures":[{"sig":"MEYCIQClVwZkKwHS/GNv/KHeaCdmgP0Adl9HXoDs7sT5FGtpOAIhAJwbl2LgXcFDomeqqNZBzFOJ1dFd50T/1tv5wJQgz2Sb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2695002},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"7dbf0b63eefdad9e0c4314c453184b40d2887b19","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.2.0_1786970933694_0.7290375331971439","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"juneau","version":"0.2.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.2.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"f7b2cbad02b0daeabefe9b14b8cd146febdeb885","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.2.1.tgz","fileCount":65,"integrity":"sha512-dAVuVPwq9fUwmjXOK7E2ySwjD1nd8UV2Mqi5lZzZitQn7iFITlElyHM01UoOBlifGbLXNW+XChL2aexDqwVYiw==","signatures":[{"sig":"MEUCIQD7C1p3+G95FHBsL2c3VwSA16wNVUEgbZi7aArqQFO3ygIgK1/C8m9I6F+HCsi3G7ZQ5q9WZT6ldVmsa1YBO+yP/U0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2699941},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"8a35cce13d692dea2bc2cd68c8b7a1964b0b5b2d","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.2.1_1786971901734_0.19874470797061217","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"juneau","version":"0.2.2","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.2.2","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"0c99a49ee2fe7b6693ccbbc5238d4ce307db12d5","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.2.2.tgz","fileCount":67,"integrity":"sha512-G9khAXn0ZghYaS1IS4EmvVc2JXXbyT4zohVWBkEE1USOwXtr1RyeibHPJqgze9/TQvEjccywMoGAuNACQRYsAg==","signatures":[{"sig":"MEUCIQDzySy8g8kGHfBtzHGn0m3hB1yv5CBTEGeypUsg/q269QIgOY0/vlC137oPaHTZijxziWMGt4TyluAhQFMKoYfogws=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2710771},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"802ba30947ce7f4224fb675b45956ac38e9dde3f","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.2.2_1786994917267_0.34724370486711575","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"juneau","version":"0.2.3","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.2.3","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"27a40b84feb063a314650efef554ab67747e74d2","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.2.3.tgz","fileCount":67,"integrity":"sha512-auooUi5C6MIPVWNWS+66IgNfjyZImThE4wVKz0TX8gTpo4WePS0zWxF86o9gFrTEoSive0oIOz2uh1KUCfzqaA==","signatures":[{"sig":"MEYCIQDhCNhhRVbbMfXI9rKZ6reDu4TD2CVSMIaAxy95S13w3AIhAK9vQR7lwf05p7RTghKgzT24ywZd7rk3E7gNPlEoUVB2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2710771},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"10375eaa8214189be787f8238cd888f7f142105f","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.2.3_1786995815806_0.8228496290508882","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"juneau","version":"0.2.4","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.2.4","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"4b40456f749e6ba93b613e124b2550bedc7c463f","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.2.4.tgz","fileCount":67,"integrity":"sha512-yr7u3gTjN2goPi+OkUkE0JcLOXQb/zH8chQ80CgeHogifuu4r9vKz8oAoHa1gnxoA3xYiWz20hmQM9gYQD+8ow==","signatures":[{"sig":"MEUCIQDhXEsB4x6+2xe6jSfcL2dvFKjQ+UCrWRIoUVUt+y9bowIgZm7g1pRVs3vCc82yFtIgKHENIucYGVBv/OnqJs1aGtg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2712521},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"04c7ad03a4e8ec20c30d12a5295c4c29faf93e92","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.17.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.5.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.2.4_1786999234239_0.0435806031023247","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"juneau","version":"0.2.5","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.2.5","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"265ad6c9f987417e4bd6c3f1b0e095380412c91a","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.2.5.tgz","fileCount":67,"integrity":"sha512-Wbjtki3WTKQwoiKt8eK0eoA1s3x+mu1OKp/pvfFE0RhL1LfRtEbg1kflrVVR5VOP6FqSDXEXL6zAPhL7IV8K7A==","signatures":[{"sig":"MEYCIQDQpPn5Djh3xdxQRrIiTwoiUm0/m2h3UOnOraXhuVDsKgIhAIC0/rMp++OGlLOPlAQbuH+5fW0nlNmFwuI2Tu/OVwh8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2723960},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"04c7ad03a4e8ec20c30d12a5295c4c29faf93e92","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.2.5_1787040411720_0.9348452064935215","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"juneau","version":"0.3.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.3.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"a2d7e2faf6fe979dfc0dfedc728f59f065e0fb8c","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.3.0.tgz","fileCount":81,"integrity":"sha512-qmXw7bQDQILgTzS7Y0DAy8vAK7JsWKtqoiHuoqVufTWuV7f//8tYb9+xfrbqRQ8aiG7Mt5TeX+0dsU32xDSFLQ==","signatures":[{"sig":"MEQCIFqc3k+6ioPDAwsxDpnvXIJKRaQ0yBBkP3hIuBo1xHPzAiBNIv0/Wk6wWgmEDjQAq8U66re7SJ0M9AH73DqPaYtf0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2748878},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js"},"./dist/style.css":"./dist/style.css"},"gitHead":"3e715d8a2fb915403c33fbb81b5cb2009bd884f1","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.3.0_1787046619748_0.27679236653069195","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"juneau","version":"0.3.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.3.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"decfadc1119053fd43f22ff376bc3c89b9f2fec3","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.3.1.tgz","fileCount":83,"integrity":"sha512-2fPvXHLwQK8rRHgMZEqu9xZYTO5ucYenfXUQAzJK5udIcYqcZqzRjcNkzmDbgfq2KMbJogjuVL2+ZanG5RYSdQ==","signatures":[{"sig":"MEYCIQD2Dlg6KKAEiNz5Zb/YhbWd/TaeVusCusC7lh4ysAsBVwIhAIls5+27vAPVBv8KPW82qeRwu8YdhgjJ5Dmo6ivoSWPJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2762334},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"6fc77525e6eb90f53e0d01e41418bf06b8cb4f48","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.3.1_1787048727141_0.21473989514246172","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"juneau","version":"0.3.2","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.3.2","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"cfb15af779d224d5a19ea7a7637589710656274e","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.3.2.tgz","fileCount":83,"integrity":"sha512-stEciNNWuM5QaNYJ7iJTZhW1hojv3cJ6b9Gb09gt7H314YZI5+xo61cGPqcjoodcYRPZvpki0XDmM3dHk/PsuQ==","signatures":[{"sig":"MEQCID5E98yXRVk2VykXg0y+qALu301caUM/QE7ovum6qqUNAiA9B8pBGZca71T5PM07+LP7It/WZa315iHt7SVLM0ZqJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2790748},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"bda17c2aef4121441c6177cd1d8fecae6f89caf2","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.3.2_1787076690528_0.980700633804878","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"juneau","version":"0.3.3","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.3.3","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"336e14c94dd46796e1eb9b8424cc085485ffb99a","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.3.3.tgz","fileCount":83,"integrity":"sha512-XRURFBqu3IHFkZEygIgzdIV+6fSb4F2TA6doS0AE6NcPzjFhkAfAOdychPlJgYm5513mlUy+rL7TN3Pm1Foe4Q==","signatures":[{"sig":"MEYCIQCiqp0mE30rnHPRjgeDU4L+wn5xRpMzYEC3nh6lm4cYowIhALtEujrttiqeGp8sR2CQoMluUmAmPaCT10wz6BSKhCJJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2798654},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"7b46f168520abaca052bea4159062811b265aff7","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.3.3_1787077181294_0.2518795735099648","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"juneau","version":"0.3.4","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.3.4","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"6192f8634fc38c7c78d2f3db424499da54ddeba8","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.3.4.tgz","fileCount":83,"integrity":"sha512-fIRvJG8kWsDhy4Gint4RjgskM8zCfNWyhTDwCye3flkm0rgV0+8NeIu8K6W2dd1g1dFK0thkEuEvzZBMeQoKyQ==","signatures":[{"sig":"MEUCIHXpGh+wuFsSSfxWz9/Z42u0koIfJ7D/V6UtTrQd/iyoAiEAzRVHtygJ//Xf7e7PoVKlsyKy3CAT08YwSH3evggX/n0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2808098},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"888d1749590516868a6efa5e2684e2c53408cbd3","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.3.4_1787081415927_0.02248401802808031","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"juneau","version":"0.4.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.4.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"b5c50fa54c145b157789ac64882810614fd179eb","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.4.0.tgz","fileCount":83,"integrity":"sha512-gveBxOtk4kCMEql6PpgFn5xNvJiavbBPNWWEfiSAvWc2wSi+ynIeeQwM4Ylx06pv2nPLeLmMs5pZ7qEd4wtNaQ==","signatures":[{"sig":"MEUCIGe65lYvRYHNBIH4fVo95T0DSdShqSxetmmXOmI9x/nMAiEAkOBEeyHD9EFiWu9THPTrgENkqOZdsfNm5350DsDtLiM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2826383},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"42b99e965501f8a9cc39603b33f29a6bd8f3c158","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.4.0_1787138696784_0.8169278452299644","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"juneau","version":"0.4.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.4.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"0d29aeb5ad943d919e54031d51b3e2a04d683fa2","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.4.1.tgz","fileCount":85,"integrity":"sha512-MMDECYzNGRisc8UvKyJ1lkZxtljWJblhqRUY5Yd7iPDJeViSGJyjBLJECKNQ9XPft/xD5sH7PIc/DtwWzK4Vug==","signatures":[{"sig":"MEYCIQDuU3IxPonMwpHvKg4qyQoXToI4j3L2qn1UxnE8HUANDAIhANwXcegqfbi5JXEJenX07mlSqcjJHALToxrh2CMU93gO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2839199},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"16575d654981c25e36b326a8b0c78e96b2c84218","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.4.1_1787154303168_0.18023625027111678","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"juneau","version":"0.5.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.5.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"c76735e7c5bc34fdec3f2960f44c36f5ab925d8e","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.5.0.tgz","fileCount":89,"integrity":"sha512-fYaZFl1l4qXiMrF/9wIIrNvbVkcDR4DRiuZSwi5gAMM+sjKJXHv9RC7r5F0nJ4mkM2ETrF+XhzCEn/SEm1CAyg==","signatures":[{"sig":"MEQCIGOAScC9jdD0QSBLtFFdWzaooieG6MqaPGknMCZ3F2vtAiAm8jXK4I6t7FfoyqkHoXuKOJ0nAxvy+SvHdW2qhHMPYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2882613},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"3c6dec961a65da6d41c320393d4ef557c1adc015","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.5.0_1787255627560_0.3976222237829663","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"juneau","version":"0.5.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.5.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"717258dd3c8e11dc62ac66f17b3cf399e68f9e00","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.5.1.tgz","fileCount":89,"integrity":"sha512-r0XzoywNzWSrG6WdHAKoaO/Uq3TGzrc2V4gu/bUHlnrj9FxG7EV6XcRHKDgXsPrj0T5GojcjOkUAN/pxVDOu5g==","signatures":[{"sig":"MEYCIQD1gv8LQmBTWghX++V0Rw/rSm2uAo1yY8oecvVr8SxaiwIhAJb1sWO+7PW65ZHPz+YqCWz6T7e0/ibvhzYio+pm8WVi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2884421},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"3c6dec961a65da6d41c320393d4ef557c1adc015","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.5.1_1787568715733_0.6178849413083989","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"juneau","version":"0.5.2","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.5.2","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"dd269e2725c3d98deffc802698ac2ddd8a6e48d7","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.5.2.tgz","fileCount":89,"integrity":"sha512-Yjgxbu98VWdYMczy0Qqdy+M8TgVih/P50cxbgGJWsnV3GgDM2qTgo9ISIGJm64nXgi1aX9L0JdZRKiPQlYdUOg==","signatures":[{"sig":"MEQCIBffMbvu+7PaRbqmZvvqDlTL1tflM0eYoq0p571hGIOpAiBc+Cua0IEsHaJbx9NUQysGkPp7o0ryr5FcXyzEA58RbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2884494},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"3c6dec961a65da6d41c320393d4ef557c1adc015","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.5.2_1787572915731_0.6482859926782287","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"juneau","version":"0.5.3","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.5.3","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"5fd0daabaa83db0e701ccf2b604523dfe43209e7","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.5.3.tgz","fileCount":89,"integrity":"sha512-nPWlLVP5RvT/OPOAdfvplN3nDDku20xFxqEgiTPURaHRs29S9SP6mtzh+4MwPLRYHQGLwoUQsHQagjgfnM04SQ==","signatures":[{"sig":"MEYCIQDF+9A47WOUgfhlOMPci/6xhsHjCOm/HvXD5FAbt+dsHQIhAJ9486Jrc+2yhD3YJpqCW/EFmALbyM92ifS/74iRG88V","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2887634},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"0546eeca1c7f884935e4f5b537626587eecf383c","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.5.3_1787573499517_0.5733872284405386","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"juneau","version":"0.6.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.6.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"b7f666971b75f103489f019c1e4435196a3a495a","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.6.0.tgz","fileCount":89,"integrity":"sha512-avY+lvHOVHXG0Jhh8kMi2xp/RNFyv4fvJra2WcfR5f438HKKV/q3gf25LexicT46x5B2ZjzXZ3NZkQ1ZbGL1kA==","signatures":[{"sig":"MEUCIQCC+wHBwvDMi/Q3jJC6LwAE/MixygMWWSx/KaxAxiiMXwIgHnvdG8gYGU/bWi9SdTnt1eBeRqtJtExuCcZNXGli6RY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2897951},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"15a9d10444c7b8e0764f7a95705706ba87a048d6","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.6.0_1787585838463_0.24043618628253371","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"juneau","version":"0.6.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.6.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"d2389156642add711f1fea8d96e90b17ffffd7ac","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.6.1.tgz","fileCount":89,"integrity":"sha512-NQYXrIha97RWS8//1oqqFGpJZFN/b4B3ySfZI1rIp8GSTsa1Mq/sQAyi37Yr+Rqt21vVc3hIcDj6AGgOMnJc+g==","signatures":[{"sig":"MEUCID0WMbA5epTb+gTvhUk995k54Jf8GzKSDSJokT3sFSJeAiEAklYYIMz0i80ULGUF8IBmbuhsuZ8l1mySuMRxqzfUvlw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2898219},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"15a9d10444c7b8e0764f7a95705706ba87a048d6","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.6.1_1787678546865_0.18344881903699584","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"juneau","version":"0.7.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.7.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"73e7cc784c37d93f4b0ce22194d0f6a949b58352","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.7.0.tgz","fileCount":93,"integrity":"sha512-aTx21xL/83h6xHpYU5odGU3ro0zW/jt7UKePvrMsnxzDigbGZIl8bVY4OAlDhJ2QKF/RPk3k5CEsi1UKYtJE0A==","signatures":[{"sig":"MEUCIQDdySDueiRnauPdEyV3ad+zzc18NqgKUadmD3WV4HnX3QIgaHvtEnfS1u2q6KMRYocaDXaqZ9sKEmNUUepQ0sA2gyw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2933297},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"266367443b3649e533411fd1266f9760da2e0a4c","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.7.0_1787776040515_0.5261455449758186","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"juneau","version":"0.7.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.7.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"037ed552a0988c2d919053a281cea6b35fc944eb","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.7.1.tgz","fileCount":95,"integrity":"sha512-yL1rudN/jtFPpc+REDJaxLU2lNPYKzjU1Vp//yetXscX5crUudbe+olNBoWaGEZAeB4K0E1k7YG+gtyE5QgaYg==","signatures":[{"sig":"MEUCIQCr7GwF790/ifKBVlUXRiBp/GLHyD6POAQyaRhqkc80kwIgH1MDba9gmgXJDm3CDLBAIfq8VIQRXFkgtJJ5NDDAka4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2960064},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"70df930a52cb50608bce5a8be349ac3696e8b61d","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.7.1_1788180079331_0.7936230394732351","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"juneau","version":"0.7.2","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.7.2","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"0fb9fe77728e9dc2e837265c1ed8e51ce3d50472","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.7.2.tgz","fileCount":95,"integrity":"sha512-y3QSvJ4+XfYqHG4ZeLtu2Az00c1YRVzgUWpQpGPLk4nC23XXUD+APUqE/xuMLUN5vnqaTlbIxsgci4JNm+f9HA==","signatures":[{"sig":"MEUCIQDYTj8yot6bzFflqQ6GTeOYsuepNGxMCucUQWGLgC3JjQIgJvDZgKkbTBmza1oGDdxGxNZCZvFZmZMSqvsKZDYWwhk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2974584},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"28cfd42417d645bda5589f5abcfe6d73f123d19f","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.7.2_1788276737563_0.30715648879958923","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"juneau","version":"0.7.3","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.7.3","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"f41dd4a82ad720d21dc41bc9bdd0e46064878d1a","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.7.3.tgz","fileCount":95,"integrity":"sha512-Tl2+4UHZVsuZqWlmi2Ci4cN0CyMv+tK22jZFTuf1rzO4+Shk7UO+dEQ2s+cpz6U4IA3ZsPJMoKg3CXqRd8hjew==","signatures":[{"sig":"MEYCIQC4NTGgMDZT8jAZEdz8kG5P58PNpGcC+H+MfHt9FOJr0gIhANmKzPfmBH6lNoQdLBW5L+iIZ47/vyTw0S7bBH3nMgK6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2975391},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"eeb501396927a0d95eeda13a3c1d7a220aca9971","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.7.3_1788277896421_0.4302239704680917","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"juneau","version":"0.8.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.8.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"5dc27653c31b0f92b78b13d3143fa9c5022b8c7d","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.8.0.tgz","fileCount":95,"integrity":"sha512-8rmbzgu9n3vJSSSYUo6Nxx3OaFArUvmDMXkqEhU3P2UXqptQqaaKnLhEBkImfBoHCEYY/8+7gbPcRLNzlHdfEA==","signatures":[{"sig":"MEQCIFO96G+9pc3zJORw70L/FG8fUmADmSwTbPI5K6kNygTfAiBCkdjyRf4pGUog/3jVk/d6fAtfxuaYRM4cC24jx4GA9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2976488},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"1e33e4f60cf38337338a4187d66b388fe77ed61c","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.8.0_1788540202203_0.5838511544830001","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"juneau","version":"0.8.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.8.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"6eabbcbe430b4dd7b40f29bb72f27281b629233b","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.8.1.tgz","fileCount":95,"integrity":"sha512-Qdtmkv4Em/P+qntdlO4P5EnM4iaOhZVU7jhkMCGHKdtqwBqRrIjWAvM7PnS9+XxIrE5dYHJLy2Vcq/3SE8fbYQ==","signatures":[{"sig":"MEQCIFw7wM2LrlBXipWfspmF3yDvzmHkc3MuYU70+aHtSVNLAiA5hUnti0wWdnq9qRY8auKfHoG08za+cVzdAK0bA3H57w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2970083},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"d8442cba2a9b6a2aba6492681c4f94520f1c1b9a","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.8.1_1788794234333_0.3308858868513356","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"juneau","version":"0.9.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.9.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"383ee9c350d483b1e80d077eb0aa199e433fc4a2","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.9.0.tgz","fileCount":95,"integrity":"sha512-fGswKa2HqrYPan7B0PP6PQmbKnPMzWAivYzQ2dKmsY41He6Qp/m19ADZmuBgHO1K6X5S3pyMKJHWFkyW18O2pQ==","signatures":[{"sig":"MEYCIQC3KKZN3ntDtRfJtRFNYUJztAfya4Q0eb+MS3RMel7NmgIhAIQfhlEoWMIZEurTDFl7t2HhSNB/SxlWJITHm6fSe9AH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2978565},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"ea22f28a8ba6d74f0964982840e2f4ee7949934f","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.9.0_1788813203163_0.4322540113030069","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"juneau","version":"0.9.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.9.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"31e461347a06e089bc8ddecc40fcbdb39b42b942","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.9.1.tgz","fileCount":95,"integrity":"sha512-ApOdaD1mxU2i2sfjUD/sICyHKg94m1TxF9RBl4PwfHbk9GG7Vc/08yxSnwLF7slG11VQtABA+CXDJKY9b18cGQ==","signatures":[{"sig":"MEUCIGgIimnjnS3oBQehP7JaJBrUgIIkVHk81+IUyKd9wwiOAiEA6+0Yqwm9H1DQMJc+FuqbFfC/3O838EiLtkvmvh2COBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2981842},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"e1a05cdd83c0d2ac553eaf32dbde64a67ad27bc4","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.9.1_1788864706641_0.9852222263149546","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"juneau","version":"0.10.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.10.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"9ade414076c62f26b84ef5f81e046dbddad680f3","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.10.0.tgz","fileCount":95,"integrity":"sha512-pHRmXMGr5/FJ8ddA73fqseg3Jv01Rz2tBmIKaviRGHcmYTgAaR7uhEiQjvkbbmCQ/DNz456o5WVAP369WtfDCg==","signatures":[{"sig":"MEQCIBc92BYiFPucvZTlbQyYVKnIAroZ3W1sBFK4BSmdJeg2AiAJhOF/tzdkQu+6gbKZBT64S7cP2liSIwgNrgDB24agIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2991475},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"bf97fb05b27a9293b586947a32ac428015d918f7","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.10.0_1788864941801_0.6159534261004174","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"juneau","version":"0.10.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.10.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"7568bc3bf4ee461869289acd166f7d97f996afb7","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.10.1.tgz","fileCount":95,"integrity":"sha512-jHTBiIb3um9CwJL7U/6Cx+r4gCHD5VBgMPBtc1PPl5UW6KQwHUIb6pzayJB72oMeJ00YZ0xcyV0qtnnA6fe+oA==","signatures":[{"sig":"MEUCIDRU7UXz3iWY8oS5o6bZwQBr8dxzmHcY4VhtdGl32DQIAiEAsA5HY0jx26KjQSJontYjhBnisnOGohoh8iAsDz4UPWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2991475},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"b1cf92e4643c0cb2a143c22e3865e0f77de0ff71","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.10.1_1788865954558_0.015630037398653984","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"juneau","version":"0.10.2","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.10.2","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"78dc5e8095a32229ce6798dc3792610878b8db3b","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.10.2.tgz","fileCount":95,"integrity":"sha512-OJroKEBPkb9h2T1ZEtWwFRHmX10+Ciht+lc7VlDP6R5wAGmLRnl3JM97rQmnl0KPYG0emhMMhSDnBKD7fgsNTw==","signatures":[{"sig":"MEUCIHNZ+hfdjFP3hQjraqmwwzdcWk7bP+zPnHoVx9ybuQ5yAiEA5MSIE+xil/41jy2LfOwWkv2nz5NCvEcWdiri9eMMp+s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2993884},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"0990d95a0cb1de4bf8d4c51ca20d3e7e98007d6a","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.10.2_1788872509398_0.582653156290851","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"juneau","version":"0.11.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.11.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"c5e4b8d7378a2d0d3152a23cbb19961c2dce346f","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.11.0.tgz","fileCount":95,"integrity":"sha512-diO0Fn4lrmCqTyNcLiNcp1pwSicrSAmgIGN7w6Cl1dLoTH5JiR5IKhI++6fn060mantuhOv4oQjU1b+U8mAOxA==","signatures":[{"sig":"MEUCIQDipXke+7J60acqZLv/ls4v3UBpTgXorqmlrpgyS6J/bAIgFoaVNlP/yd6jcYe6mFd7eVgCTPEfoQxENxn2PJM43S4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2995237},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"505f4659f22ad1bcadc44720b87df1f36ca0e47c","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.8.1","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.11.0_1788873298149_0.5460665024264701","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"juneau","version":"0.12.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.12.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"7a89e7693c31d80f1da30e09e0dc35d955e808b8","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.12.0.tgz","fileCount":95,"integrity":"sha512-knp3GDzvMMKbP9/0IabjfHQIpHrIpSgRr93FTiRfDd7eSKp/iX5hMiiCen3CGepFM1AkUM+ahTVQuOurWjRHtw==","signatures":[{"sig":"MEQCIEOrwXCTorc+OqNQOWvosI5ws/5JderNQNFWUfK72SQXAiBFeUlIhgsbmxVEFHAPYu1KjvMcVGakRku2aJoNfcTXUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2990427},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"f408fae9f7cfafd6fb84632191619822c4ab0b1c","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.12.0_1788943753211_0.30446518125817423","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"juneau","version":"0.13.0","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.13.0","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"a95e5297c59599a1831e39db88d4e7dba12166c3","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.13.0.tgz","fileCount":95,"integrity":"sha512-eb2EctgSaQ0SHVqTFAG2d4nocP3adAikRNWCrdgjRUANSRpxqYCpItPsD3WmO0VdD09c+iSWdW2g5o7SjY+cBg==","signatures":[{"sig":"MEUCIQDE70skNXh5jI14NTZarjeg8GtqGTQ+ZMH+rr57k6VmIgIgUlUve1/utpKcI7AJ9XJTrdMnxPBla6dgLRk6yQX+PBU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2995305},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"57050f7c1b014e837e7685f017674fdb28193cad","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.13.0_1788948780659_0.09102800778763043","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"juneau","version":"0.13.1","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.13.1","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"c1c5b5d5c655113f6a23c17d8464aa1fb623c6d6","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.13.1.tgz","fileCount":95,"integrity":"sha512-uHtz56DfupPWpq/GelSd4z3A4V1bEvFw8mNl+y5FljZAY8IKEj7s6rH4Cy1FHBAYMbw6rpUpJ9rbe+svTIabIw==","signatures":[{"sig":"MEQCIF0Nw5BwJTGyCvv9tY7HNSJaTx/b/WxVJj3VQMeaQ2MaAiAXbYiWy8iDXR/QP/rEQSqUxdYjqbd8855r8wIjL4ee2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2995300},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"b2b649037ec7c3ba7784b4b571bb94a4d4cdec92","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.13.1_1788951277850_0.7643320320061178","host":"s3://npm-registry-packages-npm-production"}},"0.13.2":{"name":"juneau","version":"0.13.2","keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","_id":"juneau@0.13.2","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"dist":{"shasum":"d5542eed653d6ec2617e5e19029e070da1ebf796","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.13.2.tgz","fileCount":95,"integrity":"sha512-HoEQdZvhwO0KNUnYACPdQtS03AV2Tnk8b6gwmYLOCb1Yj2tPSsywclpS1H3r6bqIESxJFP+gJSRVsdHMfASkzw==","signatures":[{"sig":"MEUCIQC58VaK8WfyRqYmh7R0dANg1/zxKk0nTZ47RjLcc2tLLAIgFRmLq8PGh8PXGa/qp1PVtSvpKjJ/P0XfH4qteBsEJUU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2995560},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"gitHead":"be399bbde58c54dac3ce12e395818704c19ef7cf","scripts":{"dev":"vite","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","preview":"vite preview --outDir dist-demo","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","build:demo":"vite build","build:types":"tsc --project tsconfig.build.json","build-storybook":"storybook build"},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"_npmVersion":"11.19.0","description":"Open-source React/TypeScript library for AI chat UI components","directories":{},"sideEffects":["dist/style.css"],"_nodeVersion":"26.7.0","allowScripts":{"fsevents@2.3.3":true,"esbuild@0.25.12":true},"dependencies":{"zod":"^4.4.3","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^30.0.1","vitest":"latest","storybook":"^10.5.7","playwright":"latest","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitest/coverage-v8":"latest","@storybook/addon-mcp":"latest","@vitejs/plugin-react":"^4.3.4","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@storybook/addon-vitest":"^10.5.7","@chromatic-com/storybook":"latest","@vitest/browser-playwright":"latest","@fortawesome/react-fontawesome":"^3.5.0","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/juneau_0.13.2_1788955726843_0.25241343734803245","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"juneau","version":"0.14.0","description":"Open-source React/TypeScript library for AI chat UI components","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./dist/style.css":"./dist/style.css"},"sideEffects":["dist/style.css"],"scripts":{"dev":"vite","build":"npm run build:types && vite build --mode lib && vite build --config vite.config.server.ts","build:types":"tsc --project tsconfig.build.json","build:demo":"vite build","preview":"vite preview --outDir dist-demo","typecheck":"tsc --noEmit","lint":"eslint src --ext .ts,.tsx","storybook":"storybook dev -p 6006","build-storybook":"storybook build","test":"vitest"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"dependencies":{"react-markdown":"^10.1.0","remark-gfm":"^4.0.1","zod":"^4.4.3"},"devDependencies":{"@chromatic-com/storybook":"latest","@fortawesome/fontawesome-svg-core":"^7.3.1","@fortawesome/free-regular-svg-icons":"^7.3.1","@fortawesome/free-solid-svg-icons":"^7.3.1","@fortawesome/react-fontawesome":"^3.5.0","@storybook/addon-a11y":"^10.5.7","@storybook/addon-docs":"^10.5.7","@storybook/addon-mcp":"latest","@storybook/addon-vitest":"^10.5.7","@storybook/react-vite":"^10.5.7","@testing-library/react":"^16.3.2","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^4.3.4","@vitest/browser-playwright":"latest","@vitest/coverage-v8":"latest","jsdom":"^30.0.1","playwright":"latest","storybook":"^10.5.7","typescript":"^5.7.0","vite":"^6.0.0","vitest":"latest"},"keywords":["react","ai","chat","ui","copilot","streaming"],"license":"MIT","allowScripts":{"esbuild@0.25.12":true,"fsevents@2.3.3":true},"gitHead":"352e1b0eadeb8dd6a09283cc70d4cd0e413605c6","_id":"juneau@0.14.0","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-mzIIbsvteAEnV9WmexjWeg/O3wzAF1UyQkpPZ3uyQqI2ileRVpe5COhy/nPg3wQ4PtAQH5NEWtZB/pH76M3TwA==","shasum":"e626b71582e07dc7b15a55c393ae37315ba4f528","tarball":"https://registry.npmjs.org/juneau/-/juneau-0.14.0.tgz","fileCount":95,"unpackedSize":2998718,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC0oCFR2A/9B2YRKWXuLpH23w5X/WNyhAmvmPOzG8GV6wIhAJniE8G0sWXy41P2tRhroWVDDUbALXqa1wBzqtlC71HX"}]},"_npmUser":{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"},"directories":{},"maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/juneau_0.14.0_1788965951510_0.6826960766959584"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-12T21:00:04.461Z","modified":"2026-09-09T14:59:11.835Z","0.1.0":"2026-08-12T21:00:04.711Z","0.1.1":"2026-08-12T21:19:56.966Z","0.1.3":"2026-08-12T21:49:15.311Z","0.1.4":"2026-08-17T12:09:45.317Z","0.2.0":"2026-08-17T12:48:53.930Z","0.2.1":"2026-08-17T13:05:01.890Z","0.2.2":"2026-08-17T19:28:37.450Z","0.2.3":"2026-08-17T19:43:36.007Z","0.2.4":"2026-08-17T20:40:34.454Z","0.2.5":"2026-08-18T08:06:51.950Z","0.3.0":"2026-08-18T09:50:19.913Z","0.3.1":"2026-08-18T10:25:27.319Z","0.3.2":"2026-08-18T18:11:30.694Z","0.3.3":"2026-08-18T18:19:41.511Z","0.3.4":"2026-08-18T19:30:16.120Z","0.4.0":"2026-08-19T11:24:56.960Z","0.4.1":"2026-08-19T15:45:03.339Z","0.5.0":"2026-08-20T19:53:47.757Z","0.5.1":"2026-08-24T10:51:55.914Z","0.5.2":"2026-08-24T12:01:55.887Z","0.5.3":"2026-08-24T12:11:39.690Z","0.6.0":"2026-08-24T15:37:18.666Z","0.6.1":"2026-08-25T17:22:26.993Z","0.7.0":"2026-08-26T20:27:20.754Z","0.7.1":"2026-08-31T12:41:19.500Z","0.7.2":"2026-09-01T15:32:17.779Z","0.7.3":"2026-09-01T15:51:36.616Z","0.8.0":"2026-09-04T16:43:22.404Z","0.8.1":"2026-09-07T15:17:14.478Z","0.9.0":"2026-09-07T20:33:23.352Z","0.9.1":"2026-09-08T10:51:46.815Z","0.10.0":"2026-09-08T10:55:41.996Z","0.10.1":"2026-09-08T11:12:34.762Z","0.10.2":"2026-09-08T13:01:49.589Z","0.11.0":"2026-09-08T13:14:58.339Z","0.12.0":"2026-09-09T08:49:13.384Z","0.13.0":"2026-09-09T10:13:00.910Z","0.13.1":"2026-09-09T10:54:37.997Z","0.13.2":"2026-09-09T12:08:47.065Z","0.14.0":"2026-09-09T14:59:11.676Z"},"license":"MIT","keywords":["react","ai","chat","ui","copilot","streaming"],"description":"Open-source React/TypeScript library for AI chat UI components","maintainers":[{"name":"tomas_trnecka","email":"tomastrnecka@seznam.cz"}],"readme":"# Juneau\n\nReact component library for building AI chat interfaces. Streaming-first, adapter-based, fully themeable.\n\n```tsx\nimport { JuneauProvider, AiChatProvider, AiSidebar, createSseAdapter } from 'juneau';\nimport 'juneau/dist/style.css';\n\nconst adapter = createSseAdapter('/api/chat');\n\n<JuneauProvider>\n  <AiChatProvider adapter={adapter}>\n    <App />\n    <AiSidebar />\n  </AiChatProvider>\n</JuneauProvider>\n```\n\n---\n\n## Install\n\n```bash\nnpm install juneau\n```\n\n**Peer dependencies:** `react ^18 || ^19`, `react-dom ^18 || ^19`\n\n---\n\n## Core concept — the adapter\n\nJuneau never calls any AI API directly. **You own the network layer.** Juneau provides the UI, state, and streaming machinery — you provide an adapter that connects it to your backend.\n\nAn adapter is just one method:\n\n```ts\ninterface AiBackendAdapter {\n  sendMessage(input: AiAdapterInput): AsyncIterable<AiStreamEvent>;\n}\n```\n\nIt receives the conversation history and streams back typed events:\n\n```ts\ntype AiStreamEvent =\n  | { type: 'text';  text: string }       // streamed text chunk — append to current bubble\n  | { type: 'part';  part: AiMessagePart } // rich UI block (table, entity, entity-list, proposal, activity, error)\n  | { type: 'done' }                       // stream finished cleanly\n  | { type: 'error'; message: string }     // stream failed\n```\n\nThis means your API keys stay on your backend, you control auth, rate limiting, model selection — Juneau just renders whatever comes back.\n\n---\n\n## Built-in adapters\n\nJuneau ships two factory functions so you don't have to write boilerplate streaming code.\n\n### `createSseAdapter(url, options?)` — recommended\n\nFor backends that stream **Server-Sent Events (SSE)** — the format used by OpenAI, Anthropic, and most AI API proxies.\n\nThe default parser understands OpenAI's streaming format out of the box (`choices[0].delta.content`).\n\n```ts\nimport { createSseAdapter } from 'juneau';\n\n// OpenAI-compatible backend — zero config needed:\nconst adapter = createSseAdapter('/api/chat');\n\n// With dynamic auth header:\nconst adapter = createSseAdapter('/api/chat', {\n  getHeaders: async () => ({\n    Authorization: `Bearer ${await getSessionToken()}`,\n  }),\n});\n\n// Custom request body:\nconst adapter = createSseAdapter('/api/chat', {\n  getBody: ({ messages, context }) => ({\n    messages,\n    model: 'gpt-4o',\n    stream: true,\n    temperature: 0.7,\n  }),\n});\n\n// Custom SSE event schema (backend streams { text: \"...\" } instead of OpenAI format):\nconst adapter = createSseAdapter('/api/chat', {\n  parseEvent: (data) => {\n    try {\n      const json = JSON.parse(data);\n      return json.text ? [{ type: 'text', text: json.text }] : [];\n    } catch {\n      return [];\n    }\n  },\n});\n```\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `method` | `string` | `'POST'` | HTTP method |\n| `headers` | `Record<string, string>` | `{}` | Static headers, merged with Content-Type |\n| `getHeaders` | `(input) => Record<string, string>` | — | Dynamic headers, called per request. Merged on top of `headers`. |\n| `getBody` | `(input) => unknown` | `{ messages, context }` | Override request body |\n| `parseEvent` | `(data: string) => AiStreamEvent[]` | OpenAI parser | Parse each `data: ...` SSE line into events |\n\n---\n\n### `createFetchStreamAdapter(url, options?)` — for non-SSE backends\n\nFor backends that stream **newline-delimited JSON (NDJSON)** or plain text — raw chunked HTTP without SSE formatting.\n\nThe default parser expects `{ \"text\": \"...\" }` or `{ \"done\": true }` JSON lines.\n\n```ts\nimport { createFetchStreamAdapter } from 'juneau';\n\n// NDJSON backend (streams { text: \"...\" } lines):\nconst adapter = createFetchStreamAdapter('/api/chat');\n\n// Plain text — treat every chunk as raw text:\nconst adapter = createFetchStreamAdapter('/api/chat', {\n  parseChunk: (chunk) => chunk ? [{ type: 'text', text: chunk }] : [],\n});\n\n// Custom JSON lines schema:\nconst adapter = createFetchStreamAdapter('/api/chat', {\n  parseChunk: (chunk) => {\n    try {\n      const json = JSON.parse(chunk);\n      if (json.error)  return [{ type: 'error', message: json.error }];\n      if (json.done)   return [{ type: 'done' }];\n      if (json.delta)  return [{ type: 'text', text: json.delta }];\n      return [];\n    } catch { return []; }\n  },\n});\n```\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `method` | `string` | `'POST'` | HTTP method |\n| `headers` | `Record<string, string>` | `{}` | Static headers |\n| `getHeaders` | `(input) => Record<string, string>` | — | Dynamic headers, called per request |\n| `getBody` | `(input) => unknown` | `{ messages, context }` | Override request body |\n| `parseChunk` | `(chunk: string) => AiStreamEvent[]` | NDJSON parser | Parse each newline-delimited chunk into events |\n\n---\n\n### Writing your own adapter\n\nIf neither factory fits, implementing the interface directly takes about 10 lines:\n\n```ts\nimport type { AiBackendAdapter } from 'juneau';\n\nexport const myAdapter: AiBackendAdapter = {\n  async *sendMessage({ messages, context }) {\n    const res = await fetch('/api/chat', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ messages }),\n    });\n\n    const reader = res.body!.getReader();\n    const decoder = new TextDecoder();\n\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      yield { type: 'text', text: decoder.decode(value) };\n    }\n\n    yield { type: 'done' };\n  },\n};\n```\n\n---\n\n### Backend utilities — `juneau/server`\n\nIf your backend uses ai-sdk, Juneau ships server-side helpers that eliminate the boilerplate of history mapping, activity streaming, and tool failure recovery. Import from the `/server` subpath — zod stays out of the browser bundle.\n\n```ts\nimport { toSdkMessages, createSkillSet, buildSkillIndex, selectSkills, selectSkillsById, withToolRecovery, withSkillDispatch } from 'juneau/server';\n```\n\n**Full integration in ~15 lines:**\n\n```ts\nimport { toSdkMessages, createSkillSet, withToolRecovery } from 'juneau/server';\nimport { streamText } from 'ai';\nimport { z } from 'zod';\n\nconst skillSet = createSkillSet({\n  search: {\n    title: 'Record Search',\n    description: 'Search for records.',\n    instructions: 'Present results concisely. If cards are shown, write one sentence only.',\n    input: z.object({ query: z.string() }),\n    labels: {\n      running: { en: 'Searching…',    cs: 'Vyhledávám…' },\n      done:    { en: 'Results found', cs: 'Nalezeno' },\n    },\n    execute: async ({ query }) => db.search(query),\n  },\n}, { language: context.language });\n\nfor await (const chunk of withToolRecovery({\n  phase1: () => streamText({ model, system, messages: toSdkMessages(input.messages), tools: skillSet.tools, maxSteps: 1 }),\n  phase2: (ctx) => streamText({ model, system, messages: [...toSdkMessages(input.messages), { role: 'assistant', content: ctx }] }),\n  skillSet,\n})) {\n  res.write(chunk);\n}\n```\n\n#### `toSdkMessages(messages)`\n\nConverts `AiMessage[]` to `CoreMessage[]` for ai-sdk. Extracts text from parts, fixes conversation alternation (no two consecutive user turns), filters empty turns.\n\n#### `createSkillSet(skills, options?)`\n\nWraps skill definitions into ai-sdk `tools` with a built-in activity buffer. Each tool call automatically emits `running` / `done` / `failed` Juneau wire SSE strings — no manual activity handling needed.\n\n`execute` receives a `SkillExecuteContext` as its second argument with an `emit(part)` callback — push custom part wire events into the stream alongside the activities, e.g. an invoice card widget the frontend renders via `renderPart`:\n\n```ts\nexecute: async ({ query }, { emit }) => {\n  const inv = await db.findInvoice(query);\n  emit({ type: 'invoice-card', invoiceNumber: inv.number, amount: inv.total });\n  return { found: 1, invoice: inv }; // returned to the model as the tool result\n},\n```\n\nEmitted parts share the activity buffer and are drained by `streamToWire` at the same points — they appear in the stream in emit order, before the model's text response.\n\nSkill metadata: `title` (human-readable name), `id` (numeric, required — chosen by the consumer, must be unique across the skill map; `createSkillSet` throws at startup on duplicates), `instructions?` (agent workflow text — lazily loaded via `selectSkills` / `selectSkillsById`), `readOnly?` (default `true`), `requiresConfirmation?` (default `false`), `tools?` (skill composition — validated at startup, `createSkillSet` throws on a reference to an unknown skill).\n\n`SkillSet` members: `tools`, `skills`, `skillsById` (Map&lt;number, SkillDefinition&gt;), `calledSkillNames`, `calledSkillIds`, `drainActivities()`, `hadFailure`, `failureContext`.\n\n`SkillSetOptions`: `language?` — selects label variant (`'en'` default). `debug?` — emit `console.debug` logs per skill execution (default: `false`).\n\n#### `buildSkillIndex(skillSet)`\n\nGenerates a compact one-liner-per-skill index for the system prompt — registry-driven, so the prompt never drifts from the actual skills. Each line includes a numeric ID so the model can request skills by ID rather than by name:\n\n```\n[1] invoiceSearch (read): Find invoices by number, supplier, date, or status.\n[2] invoiceApprove (write, requires confirmation): Approve an invoice.\n```\n\n#### `selectSkills(skillSet, skillNames)`\n\nReturns concatenated `instructions` for the given skill names — typically `skillSet.calledSkillNames` after phase 1. Workflow instructions load lazily, only for skills the model actually used.\n\n#### `selectSkillsById(skillSet, skillIds)`\n\nSame as `selectSkills` but resolves by numeric ID — use with `skillSet.calledSkillIds` to avoid string comparisons entirely. Unknown IDs and skills without instructions are skipped silently.\n\n#### `streamToWire(fullStream, skillSet?, options?)`\n\nConverts ai-sdk `fullStream` to Juneau wire SSE strings. Handles all ai-sdk v7 text chunk types (`text-delta` and `text`), drains activity buffer at the right moment, emits `done` at the end. Pass `{ debug: true }` to log every chunk received from ai-sdk.\n\n#### `withSkillDispatch(options)`\n\nDeliberate 2-phase skill dispatch — the clean alternative to sending every skill's full instructions on every request.\n\n**Phase 1:** stream with `buildSkillIndex` as the system prompt and thin tool definitions. The model picks a skill by calling a tool — `calledSkillIds` is populated as tools fire.\n\n**Phase 2:** always runs when at least one skill was called. Receives the full workflow instructions for the called skills (via `selectSkillsById`) and the complete phase 1 message history including tool-call and tool-result turns. The model is called again without tools so it reads the instructions and produces a text response.\n\nIf no skill was called (model answered directly), the phase 1 text is emitted as-is and the stream ends cleanly — no phase 2 needed.\n\n```ts\nfor await (const chunk of withSkillDispatch({\n  phase1: () => streamText({\n    model,\n    system: buildSkillIndex(skillSet), // compact index: [1] search (read): ...\n    messages: sdkMessages,\n    tools: skillSet.tools,\n    maxSteps: 1,\n  }),\n  phase2: (instructions, history) => streamText({\n    model,\n    system: instructions, // full workflow text for the chosen skill only\n    messages: history,    // full phase 1 history incl. tool-call + tool-result\n  }),\n  skillSet,\n  onFinish: ({ text }) => saveAssistantReply(text),\n})) {\n  res.write(chunk);\n}\n```\n\n| Option | Type | Description |\n|---|---|---|\n| `phase1` | `() => ToolRecoveryStreamResult` | Phase 1 stream — model picks a skill via tool call |\n| `phase2` | `(instructions, messages) => { fullStream }` | Phase 2 stream — model executes with full instructions |\n| `skillSet` | `SkillSet` | The skill set used in phase 1 |\n| `onFinish` | `({ text }) => void` | Called once before `done` with accumulated text. Not called on error paths. |\n| `debug` | `boolean` | Log phase decisions to `console.debug`. Default: `false`. |\n\n#### `withToolRecovery(options)`\n\nMulti-phase pattern for Gemini-style tool calls. Phase 1 streams with tools. Phase 2 triggers only when a tool failed **and** no text was produced — it calls the model without tools and injects the failure context to force a text response. Phase 3 (optional) handles the silent-success case — Gemini 2.5 Flash often treats a successful tool call as its complete response and never writes text. When the tool succeeded but no text was produced, `phase3` receives the full phase 1 message history (resolved from the ai-sdk result's `messages` promise — includes tool-call and tool-result turns, which Gemini requires to accept the history) so a second model call without tools can summarise the result. Errors thrown by phase 2/3 are emitted as wire `error` events instead of a silent `done`. Pass `debug: true` to log phase decisions, the resolved phase 3 history, and the `textProduced` / `hadFailure` state at each decision point.\n\nPass `onFinish` to receive the assistant text accumulated across all phases — called exactly once, right before the final `done` event (never on error paths). Use it to persist the response server-side.\n\n```ts\nyield* withToolRecovery({\n  phase1: () => streamText({ model, system, messages, tools: skillSet.tools, maxSteps: 2 }),\n  phase2: (ctx) => streamText({ model, system, messages: [...messages, { role: 'assistant', content: ctx }] }),\n  phase3: (fullMessages) => streamText({ model, system, messages: fullMessages }), // no tools — forced text\n  skillSet,\n  onFinish: ({ text }) => saveAssistantReply(text),\n});\n```\n\n#### Type re-exports\n\nThe wire/message types shared with the client — `AiMessage`, `AiMessageRole`, `AiMessagePart`, `AiTextPart`, `AiSerializedMessage`, `AiStreamEvent`, `JuneauWireEvent` (and its member types) — are also re-exported from `juneau/server`, so backend code never needs to import from the client entry.\n\nServer-only types: `SkillSet`, `SkillDefinition`, `SkillExecuteContext`, `SkillSetOptions`, `SkillDispatchOptions`, `ToolRecoveryOptions`, `ToolRecoveryStreamResult`, `StreamToWireOptions`, `CoreMessage`.\n\n---\n\n### Juneau wire protocol — for Juneau-compatible backends\n\nIf your backend is built specifically for Juneau (e.g. Tappeer), stream newline-delimited JSON where each line is one of these shapes. Both `createSseAdapter` and `createFetchStreamAdapter` parse this automatically — no custom `parseEvent` or `parseChunk` needed.\n\n```ts\n// Text chunk — appended to the current assistant bubble\n{ \"type\": \"text\", \"text\": \"Here is what I found:\" }\n\n// Activity — shows AI progress (skill selection, tool calls, etc.)\n// Send the same `id` with a new status to update in-place\n{ \"type\": \"activity\", \"id\": \"skill-select\", \"title\": \"Selecting skill\", \"description\": \"Finding the best skill for this request.\", \"status\": \"running\" }\n{ \"type\": \"activity\", \"id\": \"skill-select\", \"title\": \"Skill selected\", \"description\": \"Using Document Search.\", \"status\": \"done\" }\n{ \"type\": \"activity\", \"id\": \"doc-search\",   \"title\": \"Searching document\", \"status\": \"running\" }\n{ \"type\": \"activity\", \"id\": \"doc-search\",   \"title\": \"Document found\", \"description\": \"INV-2024-0894\", \"status\": \"done\" }\n\n// Rich block — table, entity, entity list, or proposal\n{ \"type\": \"part\", \"part\": { \"type\": \"table\", \"columns\": [\"Name\", \"Amount\"], \"rows\": [...] } }\n{ \"type\": \"part\", \"part\": { \"type\": \"entity\", \"entityType\": \"invoice\", \"entity\": { \"id\": \"...\", \"title\": \"...\", \"subtitle\": \"...\", \"fields\": [{ \"label\": \"Status\", \"value\": \"Approved\", \"badge\": \"success\" }] } } }\n{ \"type\": \"part\", \"part\": { \"type\": \"entity-list\", \"title\": \"3 results\", \"entities\": [...] } }\n{ \"type\": \"part\", \"part\": { \"type\": \"proposal\", \"proposal\": { \"id\": \"...\", \"title\": \"...\" } } }\n\n// Stream finished cleanly\n{ \"type\": \"done\" }\n\n// Stream error — ends the stream\n{ \"type\": \"error\", \"message\": \"Something went wrong.\" }\n```\n\n**Activity `status` values:** `running` | `done` | `failed`\n\n**Activity `id` behaviour:**\n- With `id` — a later event with the same `id` updates the existing row in-place (running → done)\n- Without `id` — each activity appends as a new timeline row\n\n**Activity `metadata`** is an optional opaque object — not rendered by Juneau, available for logging or custom renderers. Use it for internal data (tool name, duration, skill ID) that should not be shown to the user.\n\n`createSseAdapter` also retains OpenAI-format fallback parsing (`choices[0].delta.content`) so it works with both Juneau-compatible backends and standard OpenAI proxies.\n\n---\n\n### `mockAdapter` — for development\n\nShipped for local development. No backend needed — responds to keywords in the message:\n\n| Say... | Gets you... |\n|---|---|\n| `\"show\"`, `\"list\"`, `\"data\"`, `\"table\"` | A rendered data table |\n| `\"suggest\"`, `\"recommend\"`, `\"proposal\"` | A proposal card with confirm/cancel |\n| `\"entity\"`, `\"card\"`, `\"detail\"`, `\"find\"` | An entity list + entity detail card |\n| `\"activity\"`, `\"progress\"`, `\"document\"` | An activity timeline with running/done states |\n| `\"help\"`, `\"what can you do\"` | Capability overview |\n| `\"error\"`, `\"fail\"` | Simulated error response |\n| anything else | Explains the available triggers |\n\n```ts\nimport { mockAdapter } from 'juneau';\n// Pass to AiChatProvider — see below\n```\n\n---\n\n## Providers\n\n### `<JuneauProvider>`\n\nWrap your app once. Provides theme tokens and UI labels to all Juneau components below it.\n\n```tsx\nimport { JuneauProvider, juneauCs } from 'juneau';\n\n<JuneauProvider\n  theme={{ colorPrimary: '#0f766e', colorAccent: '#14b8a6' }}\n  labels={juneauCs}\n>\n  {children}\n</JuneauProvider>\n```\n\n| Prop | Type | Description |\n|---|---|---|\n| `theme` | `JuneauTheme` | Override design tokens. Only specified keys are applied. |\n| `labels` | `Partial<JuneauLabels>` | Override UI strings. Omitted keys fall back to English. |\n| `className` | `string` | Added to the root `<div>`. |\n| `style` | `CSSProperties` | Inline styles on the root `<div>`. |\n\n---\n\n### `<AiChatProvider>`\n\nHolds the shared conversation state. Wrap your app (or layout) once — any page can then render `<AiSidebar />` without losing conversation history on navigation.\n\n```tsx\nimport { AiChatProvider } from 'juneau';\n\n<AiChatProvider\n  adapter={myAdapter}\n  onProposalConfirm={(id, payload) => handleAction(id, payload)}\n  onProposalCancel={(id) => handleDismiss(id)}\n>\n  <App />\n</AiChatProvider>\n```\n\n| Prop | Type | Description |\n|---|---|---|\n| `adapter` | `AiBackendAdapter` | **Required.** Your adapter. |\n| `context` | `Record<string, unknown>` | Initial context forwarded to every adapter call. Update per-page via `setContext()`. |\n| `onProposalConfirm` | `(id, payload) => void` | Called when user confirms a proposal card. |\n| `onProposalCancel` | `(id) => void` | Called when user cancels a proposal card. |\n| `initialMessages` | `AiMessage[]` | Restored conversation to start with (see Chat history). |\n| `historyLimit` | `number` | Max messages sent to the adapter per request. Rendering never trimmed. |\n| `onMessagesChange` | `(messages) => void` | Called when the conversation settles. Use to persist. |\n\n**Updating context per page:**\n\nUse `setContext()` from `useAiChatContext()` to tell the AI where the user is on each page. The context is forwarded opaquely to every `adapter.sendMessage` call as `input.context`.\n\n```tsx\nimport { useAiChatContext } from 'juneau';\n\nfunction InvoicesPage() {\n  const { setContext } = useAiChatContext();\n\n  useEffect(() => {\n    setContext({\n      page: 'invoices',\n      availableTools: ['search', 'export'],\n      userRole: 'admin',\n    });\n  }, []);\n\n  return <main>...</main>;\n}\n```\n\n**Replace vs merge:** passing an object to `setContext` **replaces** the whole context. To keep existing keys (e.g. a `sessionId` set elsewhere) while updating others, use the updater form:\n\n```tsx\nsetContext(prev => ({ ...prev, page: 'invoices' }));\n```\n\n**Consuming chat state outside a guaranteed provider:**\n\n`useAiChatContext()` throws when called outside `<AiChatProvider>` — fail fast is right for components that require it. For components that may render outside the provider (e.g. during sign-out transitions), use `useAiChatContextSafe()`, which returns `null` instead of throwing:\n\n```tsx\nimport { useAiChatContextSafe } from 'juneau';\n\nfunction OptionalChatButton() {\n  const chat = useAiChatContextSafe(); // AiChatContextValue | null\n  if (!chat) return null;\n  return <button onClick={() => chat.sendMessageWithText('Help')}>Ask AI</button>;\n}\n```\n\nThe context value is memoized — consumers re-render only when chat state actually changes, not on every provider render.\n\n---\n\n## Components\n\n### `<AiSidebar>`\n\nFixed-position chat panel. Reads all state from the nearest `<AiChatProvider>` — renders wherever you place it, conversation persists across navigation.\n\nThe sidebar anchors to the bottom-right of the viewport and opens at 60% screen height by default. Users can minimize it to a compact header bar.\n\n```tsx\n<AiSidebar\n  title=\"AI Assistant\"\n  height=\"70vh\"\n/>\n```\n\n| Prop | Type | Description |\n|---|---|---|\n| `title` | `string` | Overrides the `sidebarTitle` label for this instance. |\n| `icon` | `ReactNode` | Override the header + avatar icon. Defaults to a wand icon. |\n| `actions` | `AiInputAction[]` | Toolbar buttons left of send. Pass `[]` to hide entirely. |\n| `sendIcon` | `ReactNode` | Override the send button icon. |\n| `height` | `string` | Height when open. Any CSS value. Defaults to `'60vh'`. |\n| `className` | `string` | Added to the `<aside>` element. |\n| `style` | `CSSProperties` | Inline styles on the `<aside>`. |\n| `renderPart` | `RenderPartFn` | Custom part renderer — see below. |\n| `onEntityClick` | `(entity, entityType?) => void` | Makes entity cards clickable — e.g. navigate to the record. |\n| `headerActions` | `ReactNode` | Extra controls in the header, left of reset/minimize. Rendered as given — Juneau never interprets them. |\n\n**Header chrome (`headerActions`):**\n\nThe header exposes a slot for consumer-owned controls — a settings button, a link, anything. Juneau renders the node untouched and owns none of its behaviour:\n\n```tsx\n<AiSidebar\n  headerActions={\n    <button onClick={() => setSettingsOpen(true)} aria-label='Chat settings'>\n      ⚙\n    </button>\n  }\n/>\n```\n\n---\n\n### `<AiChat>`\n\nHeadless chat body — message list + input bar + error banner, no surrounding chrome. Use this when you want to embed chat inside your own layout (dashboard panel, modal, full-page view).\n\nThe parent is responsible for calling `useAiChat` and passing results down as props.\n\n```tsx\nimport { useAiChat, AiChat } from 'juneau';\n\nfunction MyPage() {\n  const chat = useAiChat({ adapter });\n\n  return (\n    <div className=\"my-layout\">\n      <MySidebar />\n      <AiChat\n        messages={chat.messages}\n        input={chat.input}\n        isLoading={chat.isLoading}\n        error={chat.error}\n        onInputChange={chat.setInput}\n        onSend={chat.sendMessage}\n        onStop={chat.stop}\n        onProposalConfirm={chat.confirmProposal}\n        onProposalCancel={chat.cancelProposal}\n      />\n    </div>\n  );\n}\n```\n\n| Prop | Type | Description |\n|---|---|---|\n| `messages` | `AiMessage[]` | Conversation history. |\n| `input` | `string` | Current textarea value. |\n| `isLoading` | `boolean` | Whether a stream is in progress. |\n| `error` | `string \\| null` | Last error message, or `null`. |\n| `onInputChange` | `(value: string) => void` | Input change handler. |\n| `onSend` | `() => void` | Send the current input. |\n| `onStop` | `() => void` | Abort the in-flight stream. Renders a stop button while loading. |\n| `onProposalConfirm` | `(id, payload) => void` | Proposal confirmed. |\n| `onProposalCancel` | `(id) => void` | Proposal cancelled. |\n| `assistantIcon` | `ReactNode` | Override the assistant avatar in all bubbles. |\n| `actions` | `AiInputAction[]` | Toolbar buttons. |\n| `sendIcon` | `ReactNode` | Override send button icon. |\n| `placeholder` | `string` | Input placeholder text. |\n| `renderPart` | `RenderPartFn` | Custom part renderer — see below. |\n| `onEntityClick` | `(entity, entityType?) => void` | Makes entity cards clickable — e.g. navigate to the record. |\n\n---\n\n## Custom part rendering — `renderPart`\n\nBoth `AiSidebar` and `AiChat` accept a `renderPart` prop — an escape hatch for rendering consumer-defined part types (or overriding built-in ones):\n\n```ts\ntype RenderPartFn = (part: AiMessagePart) => ReactNode | null | undefined;\n```\n\nIt is called **before** the built-in renderers for every message part. Return a ReactNode to render it; return `null`/`undefined` to fall through to the built-ins (`text`, `table`, `entity`, `entity-list`, `proposal`, `activity`, `error`).\n\nThe backend can stream any custom part through the standard wire protocol:\n\n```json\n{ \"type\": \"part\", \"part\": { \"type\": \"invoice-card\", \"invoiceNumber\": \"23251\", \"amount\": \"1200.00\" } }\n```\n\n`AiCustomPart` (`{ type: string; [key: string]: unknown }`) is part of the `AiMessagePart` union, so TypeScript accepts custom shapes on both ends. Juneau applies **no validation or narrowing** to custom parts — the consumer owns all type assertions:\n\n```tsx\n// Define your part type wherever you like — Juneau doesn't need to know about it\ntype InvoiceCardPart = { type: 'invoice-card'; invoiceNumber: string; amount: string };\n\n<AiSidebar renderPart={part => {\n  if (part.type === 'invoice-card') return <InvoiceCard part={part as InvoiceCardPart} />;\n  return null; // everything else falls through to the built-ins\n}} />\n```\n\nUnhandled custom part types show a dashed warning outline in development (so they're never a silent mystery) and render nothing in production.\n\n---\n\n## `useAiChat` hook\n\nFor full control over layout and behaviour. Returns everything needed to build a custom chat UI.\n\n```ts\nconst {\n  messages,            // AiMessage[] — full conversation history\n  input,               // string — current textarea value\n  setInput,            // (value: string) => void\n  sendMessage,         // () => Promise<void> — sends current input as user message\n  sendMessageWithText, // (text: string) => Promise<void> — send programmatically, no input state change\n  sendGreeting,        // (contextHint: string) => Promise<void> — assistant speaks first, no user bubble shown\n  stop,                // () => void — abort in-flight stream, keep existing messages\n  isLoading,           // boolean — true while streaming\n  isConnecting,        // boolean — true from send until first token arrives\n  error,               // string | null — last error, cleared on next send\n  reset,               // (nextMessages?: AiMessage[]) => void — clear (or replace) messages, abort any stream\n  confirmProposal,     // (id: string, payload: unknown) => void — marks proposal resolved + fires callback\n  cancelProposal,      // (id: string) => void — marks proposal resolved + fires callback\n} = useAiChat({\n  adapter,             // required\n  context,             // optional — forwarded to every adapter.sendMessage call\n  onProposalConfirm,   // optional — called by confirmProposal\n  onProposalCancel,    // optional — called by cancelProposal\n  initialMessages,     // optional — restored conversation to start with (see Chat history)\n  historyLimit,        // optional — max messages sent to the adapter per request (token saving)\n  onMessagesChange,    // optional — called when the conversation settles; use to persist\n});\n```\n\n## `useAiChatContext` hook\n\nReads the shared state from `<AiChatProvider>`. Includes everything from `useAiChat` plus `setContext()`.\n\n```ts\nconst {\n  // all useAiChat fields +\n  setContext,  // (ctx: Record<string, unknown>) => void — update context forwarded to adapter\n} = useAiChatContext();\n```\n\nThrows a descriptive error if called outside `<AiChatProvider>`.\n\n---\n\n### Useful patterns\n\n**Proactive greeting on mount (`sendGreeting`):**\n\n`sendGreeting(hint)` sends the hint as a `system` role message to the adapter and streams the response as an assistant-only message — no user bubble is added to the conversation. Perfect for page-load summaries where the AI speaks first.\n\n```ts\nconst { sendGreeting } = useAiChatContext();\n\nuseEffect(() => {\n  sendGreeting(\n    'The user is viewing the Invoices page. ' +\n    'Briefly introduce what you can help with on this page.'\n  );\n}, []);\n```\n\n**Trigger from outside the chat (e.g. clicking a data row):**\n```ts\nconst { sendMessageWithText } = useAiChatContext();\nsendMessageWithText(`Summarise order #${order.id} for me`);\n```\n\n**Pass page context to every request:**\n```tsx\nconst { setContext } = useAiChatContext();\n\nuseEffect(() => {\n  setContext({ pageId: 'invoices', entityId: invoice.id, userRole: 'admin' });\n}, [invoice.id]);\n```\n\nThe `context` object lands in `input.context` inside every `adapter.sendMessage` call — use it to inject page-level data without polluting the message history.\n\n**Reading message text in your adapter:**\n\nDon't dig into `parts` manually — use the exported `getMessageText` helper:\n\n```ts\nimport { getMessageText } from 'juneau';\n\nasync *sendMessage({ messages }) {\n  const lastUser = [...messages].reverse().find(m => m.role === 'user');\n  const text = lastUser ? getMessageText(lastUser) : '';\n  // → plain string, all text parts concatenated\n}\n```\n\n**Auth — bearer token from React context:**\n```ts\nconst adapter = createSseAdapter('/api/chat', {\n  getHeaders: async () => ({\n    Authorization: `Bearer ${await getAccessToken()}`,\n  }),\n});\n```\n\n**Auth — session cookie (no extra config needed):**\n\nCookies are sent automatically by `fetch` to same-origin URLs. Just use `createSseAdapter('/api/chat')` with no headers — the browser attaches the session cookie for you.\n\nFor cross-origin backends, add `credentials: 'include'` by writing a custom adapter:\n\n```ts\nconst adapter: AiBackendAdapter = {\n  async *sendMessage({ messages }) {\n    const res = await fetch('https://api.example.com/chat', {\n      method: 'POST',\n      credentials: 'include',   // sends cookies cross-origin\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ messages }),\n    });\n    // …stream response\n  },\n};\n```\n\n**Stop button feedback:**\n\nWhen `onStop` is provided, the send button becomes a stop button while streaming. After the user hits stop, `isLoading` goes false immediately and the existing partial response stays visible in the conversation — there's no error state, the stream just ends cleanly where it was cut.\n\n---\n\n## Message parts\n\nAssistant messages are composed of typed **parts**. Text is streamed chunk by chunk; rich UI blocks are emitted as complete `part` events.\n\n| Part type | Emitted as | Rendered by |\n|---|---|---|\n| `text` | `{ type: 'text', text: string }` stream events, accumulated | Markdown via `react-markdown` — safe against XSS |\n| `table` | `{ type: 'part', part: { type: 'table', ... } }` | `AiTablePart` |\n| `entity` | `{ type: 'part', part: { type: 'entity', ... } }` | `AiEntityCard` |\n| `entity-list` | `{ type: 'part', part: { type: 'entity-list', ... } }` | `AiEntityListPart` |\n| `proposal` | `{ type: 'part', part: { type: 'proposal', ... } }` | `AiProposalCard` |\n| `activity` | `{ type: 'part', part: { type: 'activity', ... } }` | `AiActivityPart` |\n| `error` | `{ type: 'error', message: string }` or `{ type: 'part', part: { type: 'error', ... } }` | Inline error in bubble |\n\n**Emitting an activity from your adapter:**\n\nActivity parts show the user what the AI is doing while it works — skill selection, document search, tool calls, etc. They have three states: `running`, `done`, `failed`.\n\n```ts\n// Show a running activity\nyield {\n  type: 'part',\n  part: {\n    type: 'activity',\n    id: 'doc-search',           // optional stable ID — enables in-place update\n    title: 'Searching document',\n    description: 'Looking up document by ID.',\n    status: 'running',\n  },\n};\n\n// Later: update the same activity in-place (same id)\nyield {\n  type: 'part',\n  part: {\n    type: 'activity',\n    id: 'doc-search',\n    title: 'Document found',\n    description: 'Found document INV-2024-0894.',\n    status: 'done',\n  },\n};\n```\n\nIf `id` is provided, a later activity part with the same `id` updates the previous one in-place instead of appending a new row. Without `id`, activity parts append as a timeline.\n\n**Emitting a proposal from your adapter:**\n```ts\nyield {\n  type: 'part',\n  part: {\n    type: 'proposal',\n    proposal: {\n      id: 'confirm-delete',           // passed back to onProposalConfirm\n      title: 'Delete this item?',\n      description: 'This cannot be undone.',\n      confirmLabel: 'Delete',         // optional, falls back to labels.proposalConfirm\n      cancelLabel: 'Keep',            // optional, falls back to labels.proposalCancel\n      payload: { itemId: 42 },        // anything — you get it back in onProposalConfirm\n    },\n  },\n};\n```\n\n**Emitting a table:**\n```ts\nyield {\n  type: 'part',\n  part: {\n    type: 'table',\n    columns: ['Name', 'Amount', 'Status'],\n    rows: [\n      { Name: 'Item A', Amount: '$1,200', Status: 'Paid' },\n      { Name: 'Item B', Amount: '$840',   Status: 'Pending' },\n    ],\n  },\n};\n```\n\n**Emitting an entity or entity list:**\n\nEntity parts render structured records as cards — a title, optional subtitle, and labelled field rows. Field values can render as badges (`success` / `warning` / `danger` / `neutral`). Pass `onEntityClick` to `AiSidebar` / `AiChat` to make the cards clickable (e.g. navigate to the record); `entityType` and `entity.payload` are forwarded so consumers can route without guessing.\n\n```ts\n// Single entity card\nyield {\n  type: 'part',\n  part: {\n    type: 'entity',\n    entityType: 'invoice',           // optional kind — forwarded to onEntityClick and custom renderers\n    entity: {\n      id: 'inv-0894',                // forwarded to onEntityClick\n      title: 'INV-2024-0894',\n      subtitle: 'DataSys a.s.',\n      fields: [\n        { label: 'Amount', value: 'CZK 390 000' },\n        { label: 'Status', value: 'Approved', badge: 'success' },\n      ],\n      payload: { internalId: 42 },   // anything — not rendered, available in onEntityClick\n    },\n  },\n};\n\n// List of entities with an optional heading\nyield {\n  type: 'part',\n  part: {\n    type: 'entity-list',\n    title: '2 results',\n    entityType: 'invoice',\n    entities: [\n      { id: 'inv-1', title: 'INV-2024-0894', fields: [{ label: 'Status', value: 'Approved', badge: 'success' }] },\n      { id: 'inv-2', title: 'INV-2024-0895', fields: [{ label: 'Status', value: 'Pending', badge: 'warning' }] },\n    ],\n  },\n};\n```\n\nFor fully custom entity layouts, override the built-in card via `renderPart` — return your own component for `part.type === 'entity'` / `'entity-list'` and it wins over the default renderer.\n\n---\n\n## Chat history\n\nJuneau is storage-agnostic: it defines the exact data contract and renders restored conversations (including tables, proposals, and custom parts), but never touches storage itself. You persist chats wherever you want — localStorage, a database — and hand Juneau plain data.\n\n**Persist a conversation:**\n\n```tsx\nimport { useAiChat, serializeForStorage } from 'juneau';\n\nconst chat = useAiChat({\n  adapter,\n  historyLimit: 20, // send at most 20 messages to the adapter per request (token saving)\n  onMessagesChange: (messages) => {\n    // called when the conversation settles — never per streamed token\n    localStorage.setItem('chat', JSON.stringify(serializeForStorage(messages)));\n  },\n});\n```\n\n`serializeForStorage` prepares messages for persistence:\n- `createdAt` dates become ISO strings\n- unresolved proposals are marked `resolved: 'expired'` — a restored proposal card renders disabled and can never fire callbacks against a stale payload\n- `running` activity parts are dropped (they'd look permanently stuck)\n- each message is stamped with the format version (`v: 1`); `deserializeMessages` treats a missing `v` as v1, so pre-versioned histories still parse\n\n**Restore a conversation:**\n\n```tsx\nimport { deserializeMessages } from 'juneau';\n\nconst stored = JSON.parse(localStorage.getItem('chat') ?? '[]');\nconst chat = useAiChat({ adapter, initialMessages: deserializeMessages(stored) });\n```\n\nAll rich parts re-render exactly as they streamed in — no reconstruction needed. The restored history is also sent to the adapter, so the AI keeps full context.\n\n**Rendering trims nothing.** `historyLimit` only caps what is *sent to the adapter*; the cut keeps the most recent messages and never splits a user/assistant exchange, so alternation stays valid.\n\n**Multiple chats:**\n\nJuneau supports a multi-chat UX via `AiChatSummary` and the `AiChatHistoryList` component. You own the chat list and per-chat storage; Juneau renders the list and switches conversations via `reset(nextMessages)`:\n\n```tsx\nimport { AiChatHistoryList, trimChats } from 'juneau';\n\n<AiChatHistoryList\n  chats={trimChats(myChats, 10)}   // keep the 10 most recently updated\n  activeChatId={currentChatId}\n  onSelect={(chatId) => chat.reset(loadMessagesFor(chatId))}\n  onDelete={(chatId) => deleteChat(chatId)}  // optional — omit to hide delete buttons\n/>\n```\n\n```ts\ntype AiChatSummary = {\n  id: string;\n  title: string;\n  createdAt: Date;\n  updatedAt: Date;\n};\n```\n\n`trimChats(chats, limit)` returns the `limit` most recently updated chats (sorted newest first) — delete the rest from your storage to enforce an overall chats limit.\n\n---\n\n## Theming\n\nAll visual values are CSS custom properties prefixed `--juneau-`. Override them via `JuneauProvider`:\n\n```tsx\n<JuneauProvider theme={{\n  colorPrimary:  '#1d4ed8',\n  colorAccent:   '#7c3aed',\n  radiusLg:      '16px',\n  fontFamily:    '\"Inter\", sans-serif',\n}}>\n```\n\nOnly keys you specify are overridden — everything else keeps its default. Overrides are scoped to the provider's subtree so multiple providers with different themes can coexist.\n\n### Full theme reference\n\n| Key | CSS variable | Default | Usage |\n|---|---|---|---|\n| `colorPrimary` | `--juneau-color-primary` | `#000000` | Send button, user bubble |\n| `colorPrimaryDark` | `--juneau-color-primary-dark` | `#252528` | Primary hover state |\n| `colorPrimaryLight` | `--juneau-color-primary-light` | `#ECECEC` | Primary tinted backgrounds |\n| `colorPrimaryBorder` | `--juneau-color-primary-border` | `#E8E8EC` | Primary tinted borders |\n| `colorAccent` | `--juneau-color-accent` | `#FF49A4` | Header bg, proposal confirm, avatar |\n| `colorAccentDark` | `--juneau-color-accent-dark` | `#FF6BB3` | Accent hover |\n| `colorAccentLight` | `--juneau-color-accent-light` | `#FFF0F7` | Proposal card background |\n| `colorAccentBorder` | `--juneau-color-accent-border` | `#FFBDD9` | Proposal card border |\n| `colorSurface` | `--juneau-color-surface` | `#FFFFFF` | Cards, sidebar, input background |\n| `colorSurfaceRaised` | `--juneau-color-surface-raised` | `#F4F4F6` | Page background, table headers |\n| `colorSurfaceHover` | `--juneau-color-surface-hover` | `#ECECEC` | Row hover |\n| `colorBorder` | `--juneau-color-border` | `#E8E8EC` | Default borders |\n| `colorBorderSubtle` | `--juneau-color-border-subtle` | `#ECECEC` | Table row dividers |\n| `colorTextPrimary` | `--juneau-color-text-primary` | `#000000` | Main body text |\n| `colorTextSecondary` | `--juneau-color-text-secondary` | `#474747` | Supporting text |\n| `colorTextMuted` | `--juneau-color-text-muted` | `#474747` | Labels, hints |\n| `colorTextFaint` | `--juneau-color-text-faint` | `#9090A0` | Empty states |\n| `colorTextInverse` | `--juneau-color-text-inverse` | `#FFFFFF` | Text on dark backgrounds |\n| `colorAssistantAvatar` | `--juneau-color-assistant-avatar` | `#FF49A4` | Assistant avatar circle |\n| `colorErrorBg` | `--juneau-color-error-bg` | `#FFF0F7` | Error banner background |\n| `colorErrorBorder` | `--juneau-color-error-border` | `#E6244A` | Error banner border |\n| `colorErrorText` | `--juneau-color-error-text` | `#C41A3B` | Error text |\n| `colorSuccessBg` | `--juneau-color-success-bg` | `#F4FDE8` | Success badge background |\n| `colorSuccessText` | `--juneau-color-success-text` | `#3F7528` | Success badge text |\n| `colorWarningBg` | `--juneau-color-warning-bg` | `#FFF6E5` | Warning badge background |\n| `colorWarningText` | `--juneau-color-warning-text` | `#B37400` | Warning badge text |\n| `colorDangerBg` | `--juneau-color-danger-bg` | `#FFF0F7` | Danger badge background |\n| `colorDangerText` | `--juneau-color-danger-text` | `#C41A3B` | Danger badge text |\n| `radiusSm` | `--juneau-radius-sm` | `6px` | Buttons, small elements |\n| `radiusMd` | `--juneau-radius-md` | `8px` | Inputs, cards |\n| `radiusLg` | `--juneau-radius-lg` | `12px` | Panels, large cards |\n| `radiusFull` | `--juneau-radius-full` | `9999px` | Pills, avatars, dots |\n| `fontSizeXs` | `--juneau-font-size-xs` | `11px` | Badges |\n| `fontSizeSm` | `--juneau-font-size-sm` | `12px` | Labels, captions |\n| `fontSizeBase` | `--juneau-font-size-base` | `13px` | Default body, action buttons |\n| `fontSizeMd` | `--juneau-font-size-md` | `14px` | Chat bubbles |\n| `fontSizeLg` | `--juneau-font-size-lg` | `15px` | Section headings |\n| `fontSizeXl` | `--juneau-font-size-xl` | `16px` | App title |\n| `fontSize2xl` | `--juneau-font-size-2xl` | `22px` | KPI values |\n| `fontSize3xl` | `--juneau-font-size-3xl` | `24px` | Page titles |\n| `fontFamily` | `--juneau-font-family` | system-ui | Font used across all components |\n| `transitionFast` | `--juneau-transition-fast` | `0.15s` | All transitions |\n\n### Styling hooks (`data-juneau` attributes)\n\nBeyond tokens, key elements carry stable `data-juneau` attributes so you can target them with plain CSS — internal class names are hashed and must not be relied on.\n\n```css\n/* Example: wider bubbles and a custom user bubble background */\n[data-juneau='message'][data-juneau-role='user'] [data-juneau-segment='bubble'] {\n  background: rebeccapurple;\n}\n[data-juneau='input-textarea'] {\n  min-height: 80px;\n}\n```\n\n| Attribute | Element |\n|---|---|\n| `data-juneau=\"sidebar\"` | `AiSidebar` root `<aside>` |\n| `data-juneau=\"chat\"` | `AiChat` root |\n| `data-juneau=\"header\"` | `AiChatHeader` root |\n| `data-juneau=\"message-list\"` | `AiMessageList` root |\n| `data-juneau=\"empty-state\"` | Default empty state in `AiMessageList` |\n| `data-juneau=\"message\"` + `data-juneau-role=\"user\\|assistant\"` | Each message row |\n| `data-juneau-segment=\"bubble\\|card\"` | Bubble / card segment inside a message |\n| `data-juneau=\"typing-indicator\"` | Typing indicator |\n| `data-juneau=\"input\"` | `AiInput` wrapper |\n| `data-juneau=\"input-textarea\"` | `AiInput` textarea |\n| `data-juneau=\"error\"` | `AiError` banner |\n| `data-juneau=\"history-list\"` | `AiChatHistoryList` root |\n| `data-juneau=\"table-part\"` | Table part wrapper |\n| `data-juneau=\"entity-card\"` | Entity card (static and clickable) |\n| `data-juneau=\"entity-list-part\"` | Entity list part wrapper |\n| `data-juneau=\"proposal-card\"` | Proposal card |\n| `data-juneau=\"activity-part\"` | Activity part (also has `data-status`) |\n\n---\n\n## i18n / Labels\n\nAll UI strings are overridable. Built-in locales: `juneauEn` (default) and `juneauCs`.\n\n```tsx\nimport { juneauCs } from 'juneau';\n<JuneauProvider labels={juneauCs}>...</JuneauProvider>\n```\n\nPass any `Partial<JuneauLabels>` — omitted keys fall back to English:\n\n```tsx\n<JuneauProvider labels={{ sidebarTitle: 'Ask AI', sendMessage: 'Send' }}>\n```\n\n### Full label reference\n\n| Key | Default (EN) | Used in |\n|---|---|---|\n| `sidebarTitle` | `AI Assistant` | `AiChatHeader` title |\n| `minimizeSidebar` | `Minimize` | `AiChatHeader` minimize button |\n| `expandSidebar` | `Expand` | `AiChatHeader` expand button (when minimized) |\n| `inputPlaceholder` | `Ask a question… (Enter to send)` | `AiInput` textarea |\n| `sendMessage` | `Send message` | `AiInput` send button |\n| `stopMessage` | `Stop` | `AiInput` stop button (while streaming) |\n| `emptyStateText` | `How can I help you today?` | `AiMessageList` empty state |\n| `emptyStateHint` | `Try: \"Show me the data\" or \"Can you suggest something?\"` | `AiMessageList` empty state hint |\n| `proposalConfirm` | `Confirm` | `AiProposalCard` fallback confirm label |\n| `proposalCancel` | `Cancel` | `AiProposalCard` fallback cancel label |\n| `proposalConfirmed` | `Confirmed` | `AiProposalCard` badge after confirm |\n| `proposalCancelled` | `Cancelled` | `AiProposalCard` badge after cancel |\n| `proposalExpired` | `No longer available` | `AiProposalCard` badge for restored proposals |\n| `errorDismiss` | `Dismiss` | `AiError` dismiss button |\n| `historyEmpty` | `No previous chats` | `AiChatHistoryList` empty state |\n| `historyDeleteChat` | `Delete chat` | `AiChatHistoryList` delete button |\n| `actionAddFile` | `Add file` | `AiInput` toolbar |\n| `actionQuickActions` | `Quick actions` | `AiInput` toolbar |\n| `actionNew` | `New` | `AiInput` toolbar |\n| `actionHistory` | `History` | `AiInput` toolbar |\n| `actionRules` | `Rules` | `AiInput` toolbar |\n\n---\n\n## Custom toolbar actions\n\nThe toolbar buttons left of the send button are fully configurable:\n\n```tsx\n<AiSidebar\n  actions={[\n    {\n      icon: <MyAttachIcon />,\n      label: 'Attach file',\n      onClick: () => openFilePicker(),\n    },\n    {\n      icon: <MyTemplatesIcon />,\n      label: 'Templates',\n      onClick: () => openTemplateMenu(),\n    },\n  ]}\n/>\n\n// Hide the toolbar entirely:\n<AiSidebar actions={[]} />\n```\n\nEach action: `{ icon: ReactNode, label: string, onClick?: () => void }`\n\n---\n\n## Security\n\n- **No API keys in the library** — all AI calls happen in your adapter, which calls your backend. Juneau never sees credentials.\n- **XSS-safe markdown** — text parts are rendered via `react-markdown`, which never uses `dangerouslySetInnerHTML`. Malicious model output cannot inject scripts.\n- **No data storage** — Juneau holds conversation state in React memory only. Nothing is persisted or sent anywhere by the library itself.\n\n---\n\n## License\n\nMIT\n\n---\n\n## Icon attribution\n\nIcons used internally by Juneau are from [Font Awesome Free](https://fontawesome.com) (v6), licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). SVG paths are inlined directly — no runtime dependency on the Font Awesome package.\n\nIcons used: `crow`, `paper-plane`, `paperclip`, `bolt`, `plus`, `clock-rotate-left`, `scroll`, `arrow-rotate-left`, `window-minimize`, `window-restore`.\n","readmeFilename":"README.md"}