{"_id":"@edd_remonts/ai-schadcn-chat","_rev":"7-8280e44629f4f3c39908ac020dcfcbea","name":"@edd_remonts/ai-schadcn-chat","dist-tags":{"latest":"0.3.1"},"versions":{"0.2.0":{"name":"@edd_remonts/ai-schadcn-chat","version":"0.2.0","keywords":["react","react-19","chat","ai","anthropic","openai","openai-compatible","shadcn","shadcn-ui","tanstack","minimax","openrouter","llm","chatbot","mdx","code-block","file-upload"],"author":"ed <eddremonts86@gmail.com>","license":"MIT","_id":"@edd_remonts/ai-schadcn-chat@0.2.0","maintainers":[{"name":"edd_remonts","email":"eddremonts86@gmail.com"}],"homepage":"https://github.com/eddremonts86/ai-schadcn-chat","bugs":{"url":"https://github.com/eddremonts86/ai-schadcn-chat/issues"},"dist":{"shasum":"6968b6bd879a64021083a6e4667275267f5d501f","tarball":"https://registry.npmjs.org/@edd_remonts/ai-schadcn-chat/-/ai-schadcn-chat-0.2.0.tgz","fileCount":219,"integrity":"sha512-EB3jEZdtpoNIENzv/LkD/J70VGdo12M+/uK1Cm6HhepKVsDxIZfXtjCpsHdeGxSs+/fWygWPoqvLrgC09zSVKA==","signatures":[{"sig":"MEUCIQD4dYgLrGoLhFYHEp8Z1npEZwyPtk98/EPV5Xee+nyGIAIgI+KsrsIxgMH+U/c0diooc5wI3MzRL+5l1VjoMY5G34U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1659249},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.17.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","require":"./dist/lib/index.cjs"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.cjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","require":"./dist/types/index.cjs"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","require":"./dist/providers/index.cjs"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","require":"./dist/components/index.cjs"},"./marker.css":"./dist/styles/marker.css","./styles.css":"./dist/styles.css","./typeset.css":"./dist/typeset.css","./scroller.css":"./dist/styles/scroller.css","./typeset-presets.css":"./dist/typeset-presets.css"},"scripts":{"dev":"vite --config vite.config.ts","demo":"vite --config demo/vite.config.ts","lint":"eslint . --max-warnings=0","test":"vitest run","build":"vite build && tsc -p tsconfig.build.json && node ./scripts/postbuild.mjs","test:e2e":"playwright test","build:dts":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","test:unit":"vitest run --exclude 'tests/e2e/**'","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","demo:og-assets":"node scripts/generate-demo-og-assets.mjs"},"_npmUser":{"name":"edd_remonts","email":"eddremonts86@gmail.com"},"repository":{"url":"https://github.com/eddremonts86/ai-schadcn-chat.git","type":"git"},"description":"A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, etc.)","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.5.0","dependencies":{"clsx":"^2.1.1","sonner":"^1.5.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.0","lucide-react":"^0.451.0","react-markdown":"^9.0.1","tailwind-merge":"^2.5.4","next-mdx-remote":"^5.0.0","rehype-highlight":"^7.0.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.3.0","@radix-ui/react-tabs":"^1.1.17","@radix-ui/react-label":"^2.1.11","@radix-ui/react-toast":"^1.2.19","@tanstack/react-query":"^5.101.2","@radix-ui/react-avatar":"^1.2.2","@radix-ui/react-dialog":"^1.1.19","@radix-ui/react-select":"^2.3.3","@radix-ui/react-switch":"^1.3.3","@radix-ui/react-popover":"^1.1.19","@radix-ui/react-tooltip":"^1.2.12","@tanstack/react-virtual":"^3.14.5","@radix-ui/react-checkbox":"^1.3.7","class-variance-authority":"^0.7.0","@radix-ui/react-separator":"^1.1.11","@radix-ui/react-collapsible":"^1.1.16","@radix-ui/react-scroll-area":"^1.2.14","@radix-ui/react-dropdown-menu":"^2.1.20"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vite":"^5.4.10","jsdom":"^29.1.1","react":"^19.0.0","vitest":"^2.1.3","postcss":"^8.5.16","react-dom":"^19.0.0","typescript":"^7.0.2","@types/node":"^22.20.1","tailwindcss":"^3.4.13","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.61.1","@types/react-dom":"^19.0.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.3.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.3.0 || ^19.0.0","react-dom":"^18.3.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-schadcn-chat_0.2.0_1784208941880_0.6080225351241009","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@edd_remonts/ai-schadcn-chat","version":"0.2.1","keywords":["react","react-19","chat","ai","anthropic","openai","openai-compatible","shadcn","shadcn-ui","tanstack","minimax","openrouter","llm","chatbot","mdx","code-block","file-upload"],"author":"ed <eddremonts86@gmail.com>","license":"MIT","_id":"@edd_remonts/ai-schadcn-chat@0.2.1","maintainers":[{"name":"edd_remonts","email":"eddremonts86@gmail.com"}],"homepage":"https://github.com/eddremonts86/ai-schadcn-chat","bugs":{"url":"https://github.com/eddremonts86/ai-schadcn-chat/issues"},"dist":{"shasum":"6a644b48d296c5f98b9c6437997baa299a875e42","tarball":"https://registry.npmjs.org/@edd_remonts/ai-schadcn-chat/-/ai-schadcn-chat-0.2.1.tgz","fileCount":224,"integrity":"sha512-S7S9xTLvYiE+TWqyEtZt9cvTMt0bmkKsBw0kbD/bMSFUc9uE9oYUo90AASKuY5dwokgFKSNXPW/SqSn2YqHY3w==","signatures":[{"sig":"MEUCIQCHsvsI/rcVqu0umhk0P8XFLcXvUhs7R8D2ytHBc1AmfwIgSBHW3NF1sYgTz4NLdX+y6U7czFyOX4xA70Xcq4HL6Jo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFz6J4Ty64Wo3G/2FJ8Xa0vgrIAdE6RDpn9HcfYNAtDnAiA1VTuca/Z99bRZx1hMSEiGUL3YKsUgBMJvRVmdBM5Qpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1683363},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.17.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","require":"./dist/lib.cjs"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks.cjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","require":"./dist/types.cjs"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","require":"./dist/providers.cjs"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","require":"./dist/components.cjs"},"./marker.css":"./dist/styles/marker.css","./styles.css":"./dist/styles.css","./typeset.css":"./dist/typeset.css","./scroller.css":"./dist/styles/scroller.css","./typeset-presets.css":"./dist/typeset-presets.css"},"scripts":{"dev":"vite --config vite.config.ts","demo":"vite --config demo/vite.config.ts","lint":"oxlint","test":"vitest run","build":"vite build && tsc -p tsconfig.build.json && node ./scripts/postbuild.mjs && node ./scripts/verify-dist.mjs","test:e2e":"playwright test","build:dts":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","test:unit":"vitest run --exclude 'tests/e2e/**'","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","verify:dist":"node ./scripts/verify-dist.mjs","demo:og-assets":"node scripts/generate-demo-og-assets.mjs"},"_npmUser":{"name":"edd_remonts","email":"eddremonts86@gmail.com"},"repository":{"url":"https://github.com/eddremonts86/ai-schadcn-chat.git","type":"git"},"description":"A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, etc.)","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.5.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.0","lucide-react":"^0.451.0","react-markdown":"^9.0.1","tailwind-merge":"^2.5.4","next-mdx-remote":"^5.0.0","rehype-highlight":"^7.0.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.3.0","@radix-ui/react-tabs":"^1.1.17","@radix-ui/react-label":"^2.1.11","@radix-ui/react-toast":"^1.2.19","@tanstack/react-query":"^5.101.2","@radix-ui/react-avatar":"^1.2.2","@radix-ui/react-dialog":"^1.1.19","@radix-ui/react-select":"^2.3.3","@radix-ui/react-switch":"^1.3.3","@radix-ui/react-popover":"^1.1.19","@radix-ui/react-tooltip":"^1.2.12","@tanstack/react-virtual":"^3.14.5","@radix-ui/react-checkbox":"^1.3.7","class-variance-authority":"^0.7.0","@radix-ui/react-separator":"^1.1.11","@radix-ui/react-collapsible":"^1.1.16","@radix-ui/react-scroll-area":"^1.2.14","@radix-ui/react-dropdown-menu":"^2.1.20"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vite":"^5.4.10","jsdom":"^29.1.1","react":"^19.0.0","lucide":"1.31.0","oxlint":"^1.77.0","vitest":"^2.1.3","postcss":"^8.5.16","react-dom":"^19.0.0","morphicons":"1.6.0","typescript":"^7.0.2","@types/node":"^22.20.1","tailwindcss":"^3.4.13","@types/react":"^19.0.0","autoprefixer":"^10.4.20","@playwright/test":"^1.61.1","@types/react-dom":"^19.0.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.3.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.3.0 || ^19.0.0","react-dom":"^18.3.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-schadcn-chat_0.2.1_1789401381029_0.9841513217589473","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@edd_remonts/ai-schadcn-chat","version":"0.2.2","keywords":["react","react-19","chat","ai","anthropic","openai","openai-compatible","shadcn","shadcn-ui","tanstack","minimax","openrouter","llm","chatbot","mdx","code-block","file-upload"],"author":{"name":"ed","email":"eddremonts86@gmail.com"},"license":"MIT","_id":"@edd_remonts/ai-schadcn-chat@0.2.2","maintainers":[{"name":"edd_remonts","email":"eddremonts86@gmail.com"}],"homepage":"https://github.com/eddremonts86/ai-schadcn-chat","bugs":{"url":"https://github.com/eddremonts86/ai-schadcn-chat/issues"},"dist":{"shasum":"22f287781b0fffe93a313f33dc351e129895e0b3","tarball":"https://registry.npmjs.org/@edd_remonts/ai-schadcn-chat/-/ai-schadcn-chat-0.2.2.tgz","fileCount":216,"integrity":"sha512-NtyJinioVa0ZVVP4gbPwDFiuRxQ2KlJyXi7mz7on6xIQOxuA+RuykLBkPApHPC0QUgFtbIu3AcHTsF4/ZelXsA==","signatures":[{"sig":"MEQCIDuYixwc2SanHrFJMrUU5x2Pbsn5JlB46w7+F4YAynIUAiAlobR/O+kFh76zNh+sV0EagdORz7knocZzMBSNq85Rmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCID7XfXrkxdz5q0ruGsAnXDIJzDAxJQ0Qa9YpGrkQm8fqAiEAtiZgAm8cx9a7FmjAMm9BZ+vYU05OIYl3GBKYxB6I+5E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1607292},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.17.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","require":"./dist/lib.cjs"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks.cjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","require":"./dist/types.cjs"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","require":"./dist/providers.cjs"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","require":"./dist/components.cjs"},"./marker.css":"./dist/styles/marker.css","./styles.css":"./dist/styles.css","./typeset.css":"./dist/typeset.css","./scroller.css":"./dist/styles/scroller.css","./typeset-presets.css":"./dist/typeset-presets.css"},"gitHead":"36d2b2954125b7e4821be9c64433f8763205110e","scripts":{"dev":"vite --config vite.config.ts","demo":"vite --config demo/vite.config.ts","lint":"oxlint","test":"vitest run","build":"vite build && tsc -p tsconfig.build.json && node ./scripts/postbuild.mjs && node ./scripts/verify-dist.mjs","prepare":"npm run build","test:e2e":"playwright test","build:dts":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","test:unit":"vitest run --exclude 'tests/e2e/**'","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","verify:dist":"node ./scripts/verify-dist.mjs","demo:og-assets":"node scripts/generate-demo-og-assets.mjs","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build"},"_npmUser":{"name":"edd_remonts","email":"eddremonts86@gmail.com"},"repository":{"url":"git+https://github.com/eddremonts86/ai-schadcn-chat.git","type":"git"},"_npmVersion":"10.9.8","description":"A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, etc.)","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"clsx":"^2.1.1","sonner":"^2.0.8","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","lucide-react":"^1.45.0","react-markdown":"^10.1.0","tailwind-merge":"^3.7.0","next-mdx-remote":"^6.0.0","rehype-highlight":"^7.0.2","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@tanstack/react-query":"^5.102.8","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@tanstack/react-virtual":"^3.14.12","@radix-ui/react-checkbox":"^1.3.11","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-collapsible":"^1.1.20","@radix-ui/react-scroll-area":"^1.2.18","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.0.1","react":"^19.3.0","lucide":"1.45.0","oxlint":"^1.82.0","vitest":"^5.0.0","postcss":"^8.5.28","react-dom":"^19.3.0","morphicons":"1.7.1","typescript":"^7.0.2","@types/node":"^26.5.1","tailwindcss":"^3.4.19","@types/react":"^19.3.0","autoprefixer":"^10.6.0","@playwright/test":"^1.63.0","@types/react-dom":"^19.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.1","@testing-library/react":"^16.3.3","@testing-library/jest-dom":"^7.0.1"},"peerDependencies":{"react":"^18.3.0 || ^19.0.0","react-dom":"^18.3.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-schadcn-chat_0.2.2_1789401748272_0.8582176508593573","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@edd_remonts/ai-schadcn-chat","version":"0.2.3","keywords":["react","react-19","chat","ai","anthropic","openai","openai-compatible","shadcn","shadcn-ui","tanstack","minimax","openrouter","llm","chatbot","mdx","code-block","file-upload"],"author":{"name":"ed","email":"eddremonts86@gmail.com"},"license":"MIT","_id":"@edd_remonts/ai-schadcn-chat@0.2.3","maintainers":[{"name":"edd_remonts","email":"eddremonts86@gmail.com"}],"homepage":"https://github.com/eddremonts86/ai-schadcn-chat","bugs":{"url":"https://github.com/eddremonts86/ai-schadcn-chat/issues"},"dist":{"shasum":"1ca2f41191f0ce5d99bd6d579f3b6b5ef92476d3","tarball":"https://registry.npmjs.org/@edd_remonts/ai-schadcn-chat/-/ai-schadcn-chat-0.2.3.tgz","fileCount":217,"integrity":"sha512-JuTwt0vzBrojAw63L/VxTxUVLLABHP7JFgN2rXZ++3QcQq1Y2n1qKCPsYcdM3mR2KeMxi6OUGi4zVL90hmEP3w==","signatures":[{"sig":"MEYCIQCHT3zmU2smTcUQru5E6lmk310gnPh9Ajm93VA3AFCOiAIhAOPXbCHcY8pUprTW7IvAkv42eWJnGcMb/3/0/c0kyiQy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAOZHL2jpBndrx9hpzXDO03yP943515YOFsRH84iNcXgAiBloJtDV0Em78sjjrhypxhwDMqSbNbB7lRJXf+1uE9qTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1610925},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.17.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","require":"./dist/lib.cjs"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks.cjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","require":"./dist/types.cjs"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","require":"./dist/providers.cjs"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","require":"./dist/components.cjs"},"./marker.css":"./dist/styles/marker.css","./styles.css":"./dist/styles.css","./typeset.css":"./dist/typeset.css","./scroller.css":"./dist/styles/scroller.css","./surfaces.css":"./dist/styles/surfaces.css","./typeset-presets.css":"./dist/typeset-presets.css"},"gitHead":"6433608ca1a5f63b0e23cbc4962f67a2d617418f","scripts":{"dev":"vite --config vite.config.ts","demo":"vite --config demo/vite.config.ts","lint":"oxlint","test":"vitest run","build":"vite build && tsc -p tsconfig.build.json && node ./scripts/postbuild.mjs && node ./scripts/verify-dist.mjs","prepare":"npm run build","test:e2e":"playwright test","build:dts":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","test:unit":"vitest run --exclude 'tests/e2e/**'","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","verify:dist":"node ./scripts/verify-dist.mjs","demo:og-assets":"node scripts/generate-demo-og-assets.mjs","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build"},"_npmUser":{"name":"edd_remonts","email":"eddremonts86@gmail.com"},"repository":{"url":"git+https://github.com/eddremonts86/ai-schadcn-chat.git","type":"git"},"_npmVersion":"10.9.8","description":"A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, etc.)","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"clsx":"^2.1.1","sonner":"^2.0.8","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","lucide-react":"^1.45.0","react-markdown":"^10.1.0","tailwind-merge":"^3.7.0","next-mdx-remote":"^6.0.0","rehype-highlight":"^7.0.2","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@tanstack/react-query":"^5.102.8","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@tanstack/react-virtual":"^3.14.12","@radix-ui/react-checkbox":"^1.3.11","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-collapsible":"^1.1.20","@radix-ui/react-scroll-area":"^1.2.18","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.0.1","react":"^19.3.0","lucide":"1.45.0","oxlint":"^1.82.0","vitest":"^5.0.0","postcss":"^8.5.28","react-dom":"^19.3.0","morphicons":"1.7.1","typescript":"^7.0.2","@types/node":"^26.5.1","tailwindcss":"^3.4.19","@types/react":"^19.3.0","autoprefixer":"^10.6.0","@playwright/test":"^1.63.0","@types/react-dom":"^19.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.1","@testing-library/react":"^16.3.3","@testing-library/jest-dom":"^7.0.1"},"peerDependencies":{"react":"^18.3.0 || ^19.0.0","react-dom":"^18.3.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-schadcn-chat_0.2.3_1789404929223_0.1456211262684428","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@edd_remonts/ai-schadcn-chat","version":"0.2.4","keywords":["react","react-19","chat","ai","anthropic","openai","openai-compatible","shadcn","shadcn-ui","tanstack","minimax","openrouter","llm","chatbot","mdx","code-block","file-upload"],"author":{"name":"ed","email":"eddremonts86@gmail.com"},"license":"MIT","_id":"@edd_remonts/ai-schadcn-chat@0.2.4","maintainers":[{"name":"edd_remonts","email":"eddremonts86@gmail.com"}],"homepage":"https://github.com/eddremonts86/ai-schadcn-chat","bugs":{"url":"https://github.com/eddremonts86/ai-schadcn-chat/issues"},"dist":{"shasum":"9fa129b65e093f4821a6e6d215052fbb2753a0df","tarball":"https://registry.npmjs.org/@edd_remonts/ai-schadcn-chat/-/ai-schadcn-chat-0.2.4.tgz","fileCount":217,"integrity":"sha512-6IivAz94WezdGCVZqqvHxjvMAOnMHjoc6YIGt0Wfy3IPrykznXlYvexvMSsXrl9rryM0ksaV43jYOFdpWiKeNg==","signatures":[{"sig":"MEYCIQDAA9ZvMUb1xhYFyngS7OSsL2eCYp5PRVYHV5mmZb+9rwIhAPDlyeorISiqPU8G/GsMyWwAjJ2M1n/cC+xXYf/6POj4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIA8frxx3HwCUOf295ixKb+jNb7XCkiU3Ps2r2p1WWVYFAiBwF/Fiw9xKW37AluPjkFGxKTkffDYI2TQGlw/N8AWD5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1610915},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.17.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","require":"./dist/lib.cjs"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks.cjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","require":"./dist/types.cjs"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","require":"./dist/providers.cjs"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","require":"./dist/components.cjs"},"./marker.css":"./dist/styles/marker.css","./styles.css":"./dist/styles.css","./typeset.css":"./dist/typeset.css","./scroller.css":"./dist/styles/scroller.css","./surfaces.css":"./dist/styles/surfaces.css","./typeset-presets.css":"./dist/typeset-presets.css"},"gitHead":"6ed02e07efc204b37d4f43591099ab910b491f16","scripts":{"dev":"vite --config vite.config.ts","demo":"vite --config demo/vite.config.ts","lint":"oxlint","test":"vitest run","build":"vite build && tsc -p tsconfig.build.json && node ./scripts/postbuild.mjs && node ./scripts/verify-dist.mjs","prepare":"npm run build","test:e2e":"playwright test","build:dts":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","test:unit":"vitest run --exclude 'tests/e2e/**'","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","verify:dist":"node ./scripts/verify-dist.mjs","demo:og-assets":"node scripts/generate-demo-og-assets.mjs","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build"},"_npmUser":{"name":"edd_remonts","email":"eddremonts86@gmail.com"},"repository":{"url":"git+https://github.com/eddremonts86/ai-schadcn-chat.git","type":"git"},"_npmVersion":"10.9.8","description":"A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, etc.)","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"clsx":"^2.1.1","sonner":"^2.0.8","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","lucide-react":"^1.45.0","react-markdown":"^10.1.0","tailwind-merge":"^3.7.0","next-mdx-remote":"^6.0.0","rehype-highlight":"^7.0.2","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@tanstack/react-query":"^5.102.8","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@tanstack/react-virtual":"^3.14.12","@radix-ui/react-checkbox":"^1.3.11","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-collapsible":"^1.1.20","@radix-ui/react-scroll-area":"^1.2.18","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.0.1","react":"^19.3.0","lucide":"1.45.0","oxlint":"^1.82.0","vitest":"^5.0.0","postcss":"^8.5.28","react-dom":"^19.3.0","morphicons":"1.7.1","typescript":"^7.0.2","@types/node":"^26.5.1","tailwindcss":"^3.4.19","@types/react":"^19.3.0","autoprefixer":"^10.6.0","@playwright/test":"^1.63.0","@types/react-dom":"^19.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.1","@testing-library/react":"^16.3.3","@testing-library/jest-dom":"^7.0.1"},"peerDependencies":{"react":"^18.3.0 || ^19.0.0","react-dom":"^18.3.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-schadcn-chat_0.2.4_1789406184099_0.54127719379929","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@edd_remonts/ai-schadcn-chat","version":"0.3.0","keywords":["react","react-19","chat","ai","anthropic","openai","openai-compatible","shadcn","shadcn-ui","tanstack","minimax","openrouter","llm","chatbot","mdx","code-block","file-upload"],"author":{"name":"ed","email":"eddremonts86@gmail.com"},"license":"MIT","_id":"@edd_remonts/ai-schadcn-chat@0.3.0","maintainers":[{"name":"edd_remonts","email":"eddremonts86@gmail.com"}],"homepage":"https://github.com/eddremonts86/ai-schadcn-chat","bugs":{"url":"https://github.com/eddremonts86/ai-schadcn-chat/issues"},"dist":{"shasum":"4b24bedbdebbd53cc1a9ad59499dd98663b56cfb","tarball":"https://registry.npmjs.org/@edd_remonts/ai-schadcn-chat/-/ai-schadcn-chat-0.3.0.tgz","fileCount":217,"integrity":"sha512-hWhNN/SBK66Ri/lj1iizJ+8NpwuP4xMPqWuANJlMHu2mkxfIkiDWeMT6+1cF4IESDmdcy1X48te2grnqOwhDVg==","signatures":[{"sig":"MEYCIQDhEWHPpi7H2/2T7dNoUcVlci0KPUT5TYtyKKgV0UUNtQIhALwoWEHitBAZt+3spY/F6WwK1rru77jaC9bbjQ1lU6di","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIA2Nyv3DO04479LuZUBj8a/e3SR84DdRZKA4jgC79uFSAiAQf/04g3csK6OZU3oW8tc0z/NOgJ9MV1IVnfiR+/EDVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1614934},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.17.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","require":"./dist/lib.cjs"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks.cjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","require":"./dist/types.cjs"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","require":"./dist/providers.cjs"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","require":"./dist/components.cjs"},"./marker.css":"./dist/styles/marker.css","./styles.css":"./dist/styles.css","./typeset.css":"./dist/typeset.css","./scroller.css":"./dist/styles/scroller.css","./surfaces.css":"./dist/styles/surfaces.css","./typeset-presets.css":"./dist/typeset-presets.css"},"gitHead":"57e8d7361b54f8f2c4bea969ec06ddfd345ac1dd","scripts":{"dev":"vite --config vite.config.ts","demo":"vite --config demo/vite.config.ts","lint":"oxlint","test":"vitest run","build":"vite build && tsc -p tsconfig.build.json && node ./scripts/postbuild.mjs && node ./scripts/verify-dist.mjs","prepare":"npm run build","test:e2e":"playwright test","build:dts":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","test:unit":"vitest run --exclude 'tests/e2e/**'","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","verify:dist":"node ./scripts/verify-dist.mjs","demo:og-assets":"node scripts/generate-demo-og-assets.mjs","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build"},"_npmUser":{"name":"edd_remonts","email":"eddremonts86@gmail.com"},"repository":{"url":"git+https://github.com/eddremonts86/ai-schadcn-chat.git","type":"git"},"_npmVersion":"12.0.2","description":"A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, etc.)","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"clsx":"^2.1.1","sonner":"^2.0.8","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","lucide-react":"^1.45.0","react-markdown":"^10.1.0","tailwind-merge":"^3.7.0","next-mdx-remote":"^6.0.0","rehype-highlight":"^7.0.2","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@tanstack/react-query":"^5.102.8","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@tanstack/react-virtual":"^3.14.12","@radix-ui/react-checkbox":"^1.3.11","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-collapsible":"^1.1.20","@radix-ui/react-scroll-area":"^1.2.18","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.0.1","react":"^19.3.0","lucide":"1.45.0","oxlint":"^1.82.0","vitest":"^5.0.0","postcss":"^8.5.28","react-dom":"^19.3.0","morphicons":"1.7.1","typescript":"^7.0.2","@types/node":"^26.5.1","tailwindcss":"^3.4.19","@types/react":"^19.3.0","autoprefixer":"^10.6.0","@playwright/test":"^1.63.0","@types/react-dom":"^19.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.1","@testing-library/react":"^16.3.3","@testing-library/jest-dom":"^7.0.1"},"peerDependencies":{"react":"^18.3.0 || ^19.0.0","react-dom":"^18.3.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ai-schadcn-chat_0.3.0_1789412032575_0.22266413738885604","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"_id":"@edd_remonts/ai-schadcn-chat@0.3.1","bugs":{"url":"https://github.com/eddremonts86/ai-schadcn-chat/issues"},"dist":{"shasum":"921330c24391492d49cd3113f64d1ffa28d5af4f","tarball":"https://registry.npmjs.org/@edd_remonts/ai-schadcn-chat/-/ai-schadcn-chat-0.3.1.tgz","fileCount":217,"integrity":"sha512-rvR04D3pfCTCbQNTghe61rt9hIsdYq8Fs838WoAppNYDHtZm7CbadqVIRMzYpFZhIfbXZP2DiSvLdCSCMfqIJg==","signatures":[{"sig":"MEQCIEgVz/IdqG7rOZkoz9rtWSQbgjA3OnhZaHnNAjHF5npAAiAdxBgsQ8fjYVBpGt8+p857A+BZpI5616zd+a9zIFdQpQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC/Heq5Qgk9R5Mdvig908TezDb4rBozmTM2stl9qsH3AQIgMjktBjDUJ+KR+twHCM8PA4xsveBRuETThgNCnK2rpDA="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@edd_remonts%2fai-schadcn-chat@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1622469},"main":"./dist/index.js","name":"@edd_remonts/ai-schadcn-chat","type":"module","types":"./dist/index.d.ts","author":{"name":"ed","email":"eddremonts86@gmail.com"},"module":"./dist/index.js","engines":{"node":">=18.17.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","require":"./dist/lib.cjs"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks.cjs"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js","require":"./dist/types.cjs"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","require":"./dist/providers.cjs"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","require":"./dist/components.cjs"},"./marker.css":"./dist/styles/marker.css","./styles.css":"./dist/styles.css","./typeset.css":"./dist/typeset.css","./scroller.css":"./dist/styles/scroller.css","./surfaces.css":"./dist/styles/surfaces.css","./typeset-presets.css":"./dist/typeset-presets.css"},"gitHead":"3d7c914b8ae02343a4fec7b5c94c6acf0795ddac","license":"MIT","scripts":{"dev":"vite --config vite.config.ts","demo":"vite --config demo/vite.config.ts","lint":"oxlint","test":"vitest run","build":"vite build && tsc -p tsconfig.build.json && node ./scripts/postbuild.mjs && node ./scripts/verify-dist.mjs","prepare":"npm run build","test:e2e":"playwright test","build:dts":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","test:unit":"vitest run --exclude 'tests/e2e/**'","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","verify:dist":"node ./scripts/verify-dist.mjs","demo:og-assets":"node scripts/generate-demo-og-assets.mjs","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build"},"version":"0.3.1","_npmUser":{"name":"edd_remonts","email":"eddremonts86@gmail.com"},"homepage":"https://github.com/eddremonts86/ai-schadcn-chat","keywords":["react","react-19","chat","ai","anthropic","openai","openai-compatible","shadcn","shadcn-ui","tanstack","minimax","openrouter","llm","chatbot","mdx","code-block","file-upload"],"repository":{"url":"git+https://github.com/eddremonts86/ai-schadcn-chat.git","type":"git"},"_npmVersion":"12.0.2","description":"A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, etc.)","directories":{},"maintainers":[{"name":"edd_remonts","email":"eddremonts86@gmail.com"}],"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"clsx":"^2.1.1","sonner":"^2.0.8","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","lucide-react":"^1.45.0","react-markdown":"^10.1.0","tailwind-merge":"^3.7.0","next-mdx-remote":"^6.0.0","rehype-highlight":"^7.0.2","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@tanstack/react-query":"^5.102.8","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@tanstack/react-virtual":"^3.14.12","@radix-ui/react-checkbox":"^1.3.11","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-collapsible":"^1.1.20","@radix-ui/react-scroll-area":"^1.2.18","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.10.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.0.1","react":"^19.3.0","lucide":"1.45.0","oxlint":"^1.82.0","vitest":"^5.0.0","postcss":"^8.5.28","react-dom":"^19.3.0","morphicons":"1.7.1","typescript":"^7.0.2","@types/node":"^26.5.1","tailwindcss":"^3.4.19","@types/react":"^19.3.0","autoprefixer":"^10.6.0","@playwright/test":"^1.63.0","@types/react-dom":"^19.3.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.1.1","@testing-library/react":"^16.3.3","@testing-library/jest-dom":"^7.0.1"},"peerDependencies":{"react":"^18.3.0 || ^19.0.0","react-dom":"^18.3.0 || ^19.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-schadcn-chat_0.3.1_1789413265135_0.05091428305230705"}}},"time":{"created":"2026-07-16T13:35:41.779Z","modified":"2026-09-14T19:14:25.568Z","0.2.0":"2026-07-16T13:35:42.034Z","0.2.1":"2026-09-14T15:56:21.124Z","0.2.2":"2026-09-14T16:02:28.379Z","0.2.3":"2026-09-14T16:55:29.310Z","0.2.4":"2026-09-14T17:16:24.207Z","0.3.0":"2026-09-14T18:53:52.681Z","0.3.1":"2026-09-14T19:14:25.273Z"},"bugs":{"url":"https://github.com/eddremonts86/ai-schadcn-chat/issues"},"author":{"name":"ed","email":"eddremonts86@gmail.com"},"license":"MIT","homepage":"https://github.com/eddremonts86/ai-schadcn-chat","keywords":["react","react-19","chat","ai","anthropic","openai","openai-compatible","shadcn","shadcn-ui","tanstack","minimax","openrouter","llm","chatbot","mdx","code-block","file-upload"],"repository":{"url":"git+https://github.com/eddremonts86/ai-schadcn-chat.git","type":"git"},"description":"A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, etc.)","maintainers":[{"name":"edd_remonts","email":"eddremonts86@gmail.com"}],"readme":"# ai-schadcn-chat\n\n> A fully-featured, deeply configurable AI chat panel for React 18/19 — works with any Anthropic / OpenAI / OpenAI-compatible API (OpenRouter, MiniMax, Together, Groq, vLLM, Ollama, …).\n\n[![npm version](https://img.shields.io/npm/v/@edd_remonts/ai-schadcn-chat.svg)](https://www.npmjs.com/package/@edd_remonts/ai-schadcn-chat)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.6-blue.svg)](https://www.typescriptlang.org/)\n\n## Demo\n\nThe package ships with a full interactive demo at `demo/`. Build it\nlocally with:\n\n```bash\npnpm install\npnpm exec vite --config demo/vite.config.ts build\n# static output → demo/dist/\n```\n\nThe published `dist/` and `demo/dist/` are independent artifacts — the\npackage and the demo do not need each other at install time. The demo\nimports `@edd_remonts/ai-schadcn-chat` from npm (see `demo/package.json`) so the\ndeployed demo bundle does not require the package source on the\nserver.\n\n## Deployment\n\nThe demo ships as a static SPA. Two paths to get it to a host:\n\n1. **Coolify (self-hosted PaaS on Hetzner VPS)** — `Dockerfile` and\n   `docker-compose.prod.yml` at the repo root, ready to wire as a new\n   Coolify application with `build_pack=dockerfile` and host\n   `ai-chat.eduardoinerarte.dk`. A push to `main` triggers a rebuild\n   via the Coolify GitHub webhook.\n2. **Static host** (Nginx / Caddy / Cloudflare Pages / S3) — run the\n   build command above, upload `demo/dist/` to the host, point\n   `ai-chat.eduardoinerarte.dk` at it via wildcard DNS or a\n   dedicated A record.\n\n## Why ai-schadcn-chat\n\n- **Three surfaces, one package** — drop in `<ChatPanel />` for an instant chat UI, compose `<ChatProvider />` + `<MessageList />` + `<ChatComposer />` for a custom layout, or use the framework-agnostic `ChatEngine` class without React at all.\n- **Any provider** — native adapters for Anthropic and OpenAI, plus a generic OpenAI-compatible mode that works with OpenRouter, MiniMax, Together, Groq, vLLM, Ollama `/openai` endpoint, etc.\n- **Built on shadcn/ui + Radix** — looks and feels like the rest of the shadcn ecosystem. Tailwind theming carries over.\n- **Tools / function calling** — register named tools with JSON-Schema parameters and async handlers; the engine dispatches calls and feeds results back to the model.\n- **Streaming, persistence, retries** — incremental SSE streaming, automatic retry with exponential back-off for 429/5xx, opt-in `localStorage` persistence keyed by `persistKey`.\n- **Markdown / MDX / code highlighting** — GFM tables, raw HTML, syntax-highlighted code with one-click copy and collapse, all rendered through `react-markdown` + `remark-gfm` + `rehype-highlight` + `rehype-raw`.\n\n## Install\n\n```bash\npnpm add @edd_remonts/ai-schadcn-chat\n```\n\nPeer deps: `react` ^18.3.0 || ^19.0.0, `react-dom` ^18.3.0 || ^19.0.0.\n\n```bash\n# if your bundler doesn't auto-install peers\npnpm add react react-dom\n```\n\n## Quick start\n\n```tsx\nimport { ChatPanel, defaultConfig } from \"@edd_remonts/ai-schadcn-chat\";\n// Import the bundled stylesheet once in your app root.\nimport \"@edd_remonts/ai-schadcn-chat/styles.css\";\n\nexport function App() {\n  // defaultConfig() reads VITE_MINIMAX_API_KEY (or MINIMAX_API_KEY) from\n  // both process.env and import.meta.env automatically.\n  const config = defaultConfig({\n    systemPrompt: \"You are a concise coding assistant.\",\n    ui: { title: \"Edd's coding buddy\", placeholder: \"Ask me anything…\" },\n  });\n  return <ChatPanel config={config} />;\n}\n```\n\n## Connect to MiniMax\n\n`defaultConfig()` is pre-wired for [MiniMax](https://MiniMax.ai) via the OpenAI-compatible protocol. It reads these env vars at runtime from both `process.env` and `import.meta.env`:\n\n| Variable            | Default                       | Purpose                                |\n| ------------------- | ----------------------------- | -------------------------------------- |\n| `MINIMAX_API_KEY`   | _(required)_                  | Bearer token sent on every request.    |\n| `MINIMAX_BASE_URL`  | `https://api.MiniMax.chat/v1` | Override to use a proxy or gateway.    |\n| `MINIMAX_MODEL`     | `MiniMax-M2`                  | Default model id surfaced in the UI.   |\n\nSet them in a `.env` / `.env.local` file:\n\n```bash\n# .env.local\nVITE_MINIMAX_API_KEY=sk-…\nVITE_MINIMAX_BASE_URL=https://api.MiniMax.chat/v1\nVITE_MINIMAX_MODEL=MiniMax-M2\n```\n\nIn Next.js / non-Vite environments, drop the `VITE_` prefix (or expose them through your bundler of choice). The engine checks `process.env` first, then `import.meta.env`, so both runtimes work.\n\n## Connect to OpenAI / Anthropic\n\nSwap the `provider.kind` and supply your own API key:\n\n```tsx\nimport { ChatPanel, defaultConfig } from \"@edd_remonts/ai-schadcn-chat\";\n\n// OpenAI\nconst openai = defaultConfig({\n  provider: {\n    kind: \"openai\",\n    baseUrl: \"https://api.openai.com/v1\",\n    authHeader: \"bearer\",\n    credentials: { apiKey: import.meta.env.VITE_OPENAI_API_KEY },\n    chatPath: \"/chat/completions\",\n  },\n  model: { id: \"gpt-4o\", label: \"GPT-4o\", tools: true, vision: true, contextWindow: 128_000 },\n});\n\n// Anthropic (Claude)\nconst claude = defaultConfig({\n  provider: {\n    kind: \"anthropic\",\n    baseUrl: \"https://api.anthropic.com\",\n    authHeader: \"x-api-key\",\n    credentials: {\n      apiKey: import.meta.env.VITE_ANTHROPIC_API_KEY,\n      secondaryKey: \"2023-06-15\", // sent as anthropic-version\n      secondaryKeyHeader: \"anthropic-version\",\n    },\n    chatPath: \"/v1/messages\",\n  },\n  model: { id: \"claude-sonnet-4-5\", label: \"Claude Sonnet 4.5\", tools: true, vision: true, contextWindow: 200_000 },\n});\n```\n\nAny OpenAI-compatible gateway (OpenRouter, Together, Groq, vLLM, Ollama `/openai`, …) just needs `kind: \"openai-compatible\"` plus the right `baseUrl`.\n\n## Configuration\n\nThe full `ChatConfig` shape:\n\n```ts\nimport type { ChatConfig } from \"@edd_remonts/ai-schadcn-chat\";\n\nconst config: ChatConfig = {\n  provider: { /* see \"Connect to …\" above */ },\n  model:    { id: \"MiniMax-M2\", tools: true, vision: false, contextWindow: 128_000, maxOutput: 8_192 },\n\n  systemPrompt: \"You are a helpful assistant.\",   // master system prompt\n  documents:    [/* optional PromptDocument[] — extra context */],\n\n  personality:  { name: \"Edd's coding buddy\", tone: \"concise\", locale: \"en\" },\n\n  maxContextTokens: 120_000,    // sliding window over older messages\n  temperature:      0.7,\n  topP:             1,\n  thinking:         { enabled: true, budgetTokens: 4_000 }, // anthropic extended thinking\n  stopSequences:    [\"\\n\\nUSER:\"],\n\n  retry:           { attempts: 3, initialDelayMs: 800, maxDelayMs: 8_000 },\n  persistKey:      \"ai-schadcn-chat:default\",   // or `false` to disable persistence\n\n  ui:      { /* see below */ },\n  tools:   [/* see \"Tools / function calling\" below */],\n\n  onResponse: (msg, ctx) => console.log(\"got\", msg, ctx.conversationId),\n  onError:    (err, ctx) => console.error(err, ctx.conversationId),\n};\n```\n\n## UI overrides\n\nEvery key is optional; sensible defaults ship.\n\n| Key                          | Type                                  | Default              |\n| ---------------------------- | ------------------------------------- | -------------------- |\n| `title`                      | `string`                              | `\"Chat\"`             |\n| `subtitle`                   | `string`                              | —                    |\n| `placeholder`                | `string`                              | `\"Ask anything…\"`    |\n| `emptyState`                 | `ReactNode`                           | —                    |\n| `showModelSelector`          | `boolean`                             | `true`               |\n| `showDocumentPicker`         | `boolean`                             | `true`               |\n| `showToolCalls`              | `boolean`                             | `true`               |\n| `showTokenCount`             | `boolean`                             | `true`               |\n| `showTimestamps`             | `boolean`                             | `true`               |\n| `enableFileUpload`           | `boolean`                             | `true`               |\n| `enableVoiceInput`           | `boolean`                             | `false`              |\n| `enableMarkdown`             | `boolean`                             | `true`               |\n| `enableMdx`                  | `boolean`                             | `true`               |\n| `enableCodeHighlight`        | `boolean`                             | `true`               |\n| `enableCopyButtons`          | `boolean`                             | `true`               |\n| `enableMessageActions`       | `boolean`                             | `true`               |\n| `enableConversationHistory`  | `boolean`                             | `true`               |\n| `enableRegenerate`           | `boolean`                             | `true`               |\n| `enableEdit`                 | `boolean`                             | `true`               |\n| `maxFileSizeMb`              | `number`                              | `10`                 |\n| `acceptedFileTypes`          | `string[]`                            | images + pdf + text  |\n| `theme`                      | `\"light\" \\| \"dark\" \\| \"system\"`       | `\"system\"`           |\n| `accentColor`                | `string` (CSS color)                  | —                    |\n| `fontFamily`                 | `string` (CSS font-family)            | —                    |\n| `density`                    | `\"compact\" \\| \"comfortable\" \\| \"spacious\"` | `\"comfortable\"` |\n| `layout`                     | `\"panel\" \\| \"floating\" \\| \"fullpage\"` | `\"panel\"`            |\n| `height` / `width`           | `number \\| string`                    | —                    |\n| `position`                   | `\"bottom-right\"` \\| `\"bottom-left\"` \\| `\"top-right\"` \\| `\"top-left\"` | `\"bottom-right\"` |\n| `className`                  | `string`                              | —                    |\n| `renderMessage`              | `(msg: ChatMessage) => ReactNode`     | —                    |\n| `renderHeader`               | `() => ReactNode`                     | —                    |\n| `renderFooter`               | `() => ReactNode`                     | —                    |\n\n## Tools / function calling\n\nRegister named tools with a JSON-Schema for `parameters` and an async `handler`. The engine dispatches tool calls made by the model and feeds the result back as a `tool` message.\n\n```tsx\nimport { defaultConfig } from \"@edd_remonts/ai-schadcn-chat\";\n\nconst config = defaultConfig({\n  tools: [\n    {\n      name: \"get_weather\",\n      description: \"Return the current weather for a city.\",\n      parameters: {\n        type: \"object\",\n        properties: {\n          city: { type: \"string\", description: \"City name, e.g. 'Berlin'.\" },\n          unit: { type: \"string\", enum: [\"celsius\", \"fahrenheit\"], default: \"celsius\" },\n        },\n        required: [\"city\"],\n      },\n      handler: async ({ city, unit }) => {\n        const res = await fetch(`https://wttr.in/${city}?format=j1`);\n        const data = await res.json();\n        return { city, unit, temp: data.current_condition?.[0]?.temp_C };\n      },\n    },\n  ],\n});\n```\n\n## Customization\n\n`ChatPanel` and the underlying `ChatComposer` accept render overrides:\n\n```tsx\n<ChatPanel\n  config={config}\n  renderHeader={() => <MyBranding />}\n  renderFooter={() => <SafetyNotice />}\n  renderSendButton={({ disabled, onClick }) => (\n    <button onClick={onClick} disabled={disabled}>Send ➤</button>\n  )}\n/>\n```\n\nFor a fully bespoke message renderer, use `renderMessage` (per `UiConfig`):\n\n```tsx\n<ChatPanel\n  config={{\n    ...config,\n    ui: {\n      renderMessage: (msg) => (\n        msg.role === \"assistant\"\n          ? <MyCustomBubble content={msg.content} />\n          : <UserBubble content={msg.content} />\n      ),\n    },\n  }}\n/>\n```\n\nTo compose your own layout without `ChatPanel`:\n\n```tsx\nimport { ChatProvider, ChatHeader, MessageList, ChatComposer, useChat } from \"@edd_remonts/ai-schadcn-chat\";\n\n<ChatProvider config={config}>\n  <MyCustomHeader />\n  <MessageList />\n  <ChatComposer renderSendButton={MySendButton} />\n</ChatProvider>\n```\n\n## Custom markdown / MDX components\n\nThe underlying `<Markdown />` component accepts a `components` prop that maps to `react-markdown`'s `Components` type (so you can override `a`, `pre`, `code`, `h1`, …). It is **not yet exposed through `ChatPanel`'s public surface** — today you can either:\n\n1. Subclass `<ChatPanel />` by composing your own `<MessageList />` and rendering `<Markdown components={…} />` manually.\n2. Open an issue / PR and we'll lift it into `UiConfig.renderMessage`'s signature as a first-class prop.\n\nThis is on the roadmap for the next minor release.\n\n## Persistence\n\nConversations are persisted to `localStorage` automatically when `persistKey` is set (default: `\"ai-schadcn-chat:default\"`). Pass `persistKey: false` to disable. Switching `persistKey` at runtime switches the storage namespace — handy for multi-user or multi-tenant apps.\n\n## Demo\n\nThe repo ships with a Vite-powered demo under `demo/`:\n\n```bash\npnpm install\npnpm demo            # starts the demo on http://localhost:5173\n# or\npnpm install && pnpm dev\n```\n\nCreate `demo/.env` with your real key before launching:\n\n```bash\n# demo/.env\nVITE_MINIMAX_API_KEY=sk-…\n```\n\n`demo/.env` is git-ignored.\n\n## Build\n\n```bash\npnpm build           # tsc → vite build → scripts/postbuild.mjs\n```\n\nOutput goes to `dist/`:\n\n- `dist/index.js` / `dist/index.cjs` — main entry\n- `dist/components/` — `ChatPanel`, `MessageList`, `ChatComposer`, UI primitives\n- `dist/hooks/` — `ChatProvider`, `useChat`, `useOptionalChat`, `defaultConfig`\n- `dist/providers/` — Anthropic, OpenAI, OpenAI-compatible adapters\n- `dist/lib/` — `ChatEngine` + helpers\n- `dist/types/` — pure types (framework-agnostic)\n- `dist/styles.css` — bundled Tailwind output\n\n`scripts/postbuild.mjs` rewrites `dist/package.json` to set `\"type\": \"module\"` and `\"sideEffects\": [\"**/*.css\"]` so consumer bundlers treat the CSS side-effect correctly under both ESM and CJS resolution.\n\n## License\n\n[MIT](./LICENSE) © 2026 Eduardo Inerarte (eddremonts86)","readmeFilename":"README.md"}