{"_id":"@alternatefutures/chat-ui","_rev":"2-d26458ac14aac76c3fba9c12dffc4616","name":"@alternatefutures/chat-ui","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"name":"@alternatefutures/chat-ui","version":"0.2.0","license":"AGPL-3.0-only","_id":"@alternatefutures/chat-ui@0.2.0","maintainers":[{"name":"alternatehayk","email":"hayk@alternatefutures.ai"},{"name":"system-af","email":"system@alternatefutures.ai"}],"homepage":"https://github.com/alternatefutures/alternate-ui#readme","bugs":{"url":"https://github.com/alternatefutures/alternate-ui/issues"},"dist":{"shasum":"8ac3e9c75029539fb708b9d8e5a147cce3b1d9e6","tarball":"https://registry.npmjs.org/@alternatefutures/chat-ui/-/chat-ui-0.2.0.tgz","fileCount":8,"integrity":"sha512-t9DyTzKUEy57vlFTzp6Vir/xPcsLev0unlFDXUclmhz6/keQIhhUCX0wOQjBrru7SnbvfumChyWCEh9CVnGXgA==","signatures":[{"sig":"MEYCIQCKEmAL4HoD9SUCYrDTaqUlvkO3AtdsTMEEePIp+m13bAIhAP1XgrWvH7AysT9sINYj8g9m8kR+X6MqWdVwbXs+++Br","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alternatefutures%2fchat-ui@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":320539},"type":"module","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"80fdb8b4cf29e561c5864428185ca7e398725e53","scripts":{"build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"alternatehayk","email":"hayk@alternatefutures.ai"},"repository":{"url":"git+https://github.com/alternatefutures/alternate-ui.git","type":"git","directory":"packages/chat-ui"},"_npmVersion":"10.8.2","description":"AlternateFutures shared chat UI — presentation-only ChatView (message list, composer, members, search, typing) with injected transport + renderBody. No crypto, no transport. Built on @alternatefutures/ui + tokens.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@alternatefutures/ui":"^0.2.0","@alternatefutures/tokens":"^0.2.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@types/react":"^19.0.0","lucide-react":"^0.469.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","tailwindcss":"^4.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/chat-ui_0.2.0_1782141506950_0.3714314243449828","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alternatefutures/chat-ui","version":"0.3.0","description":"AlternateFutures shared chat UI — presentation-only ChatView (message list, composer, members, search, typing) with injected transport + renderBody. No crypto, no transport. Built on @alternatefutures/ui + tokens.","license":"AGPL-3.0-only","type":"module","sideEffects":false,"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"dependencies":{"@alternatefutures/tokens":"^0.2.0","@alternatefutures/ui":"^0.2.0"},"peerDependencies":{"lucide-react":">=0.400.0","react":"^19.0.0","react-dom":"^19.0.0","tailwindcss":"^4.0.0"},"devDependencies":{"@types/react":"^19.0.0","@types/react-dom":"^19.0.0","lucide-react":"^0.469.0","react":"^19.0.0","react-dom":"^19.0.0"},"publishConfig":{"access":"public","provenance":true},"repository":{"type":"git","url":"git+https://github.com/alternatefutures/alternate-ui.git","directory":"packages/chat-ui"},"_id":"@alternatefutures/chat-ui@0.3.0","gitHead":"65b9842a943cc1f60257ed64b13a863ae0a3e602","bugs":{"url":"https://github.com/alternatefutures/alternate-ui/issues"},"homepage":"https://github.com/alternatefutures/alternate-ui#readme","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-oN8jQ1t+kmwZkkysxMhN53cKNJlIBIMdtG29loeZbRUSnubiBd4LCvIbcxvBLOY6q5B9LkhSgNV6c0kVdV97Cw==","shasum":"2236d50da8e86635fcae686e7ea4dbdf67fd554a","tarball":"https://registry.npmjs.org/@alternatefutures/chat-ui/-/chat-ui-0.3.0.tgz","fileCount":8,"unpackedSize":320964,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alternatefutures%2fchat-ui@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCMRWyT8DURiWLQ7qv4PaEnAh5uVXnlhM1RhYkTP1GJjgIhAKdPrZHUf4Ew/axV+sv+zE7fXn6nZBpfO6HMBuW8plrQ"}]},"_npmUser":{"name":"alternatehayk","email":"hayk@alternatefutures.ai"},"directories":{},"maintainers":[{"name":"alternatehayk","email":"hayk@alternatefutures.ai"},{"name":"system-af","email":"system@alternatefutures.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chat-ui_0.3.0_1786805944850_0.9876934739304146"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-22T15:18:26.785Z","modified":"2026-08-15T14:59:05.364Z","0.2.0":"2026-06-22T15:18:27.101Z","0.3.0":"2026-08-15T14:59:04.981Z"},"bugs":{"url":"https://github.com/alternatefutures/alternate-ui/issues"},"license":"AGPL-3.0-only","homepage":"https://github.com/alternatefutures/alternate-ui#readme","repository":{"type":"git","url":"git+https://github.com/alternatefutures/alternate-ui.git","directory":"packages/chat-ui"},"description":"AlternateFutures shared chat UI — presentation-only ChatView (message list, composer, members, search, typing) with injected transport + renderBody. No crypto, no transport. Built on @alternatefutures/ui + tokens.","maintainers":[{"name":"alternatehayk","email":"hayk@alternatefutures.ai"},{"name":"system-af","email":"system@alternatefutures.ai"}],"readme":"# @alternatefutures/chat-ui\n\nThe shared, **presentation-only** chat room for AlternateFutures apps. `ChatView`\nrenders the full experience — message feed (grouping, replies, edits, deletes,\nmentions, search), member roster, undecryptable banner, composer, and a typing\nindicator — while every app injects its own transport and crypto.\n\nIt owns **no** WebSocket, no LiveKit, no keys. You pass it decrypted `messages`\nand callbacks; it calls `onSend`/`onEdit`/`onDelete`/`onTypingChange` back.\n\n## Install\n\n```bash\nnpm install @alternatefutures/chat-ui @alternatefutures/ui @alternatefutures/tokens\n```\n\nPeers: `react`/`react-dom` 19, `lucide-react`, Tailwind v4. Add the kit to your\nTailwind sources:\n\n```css\n@import \"tailwindcss\";\n@import \"@alternatefutures/tokens/theme.css\";\n@source \"../node_modules/@alternatefutures/ui/dist\";\n@source \"../node_modules/@alternatefutures/chat-ui/dist\";\n```\n\n## Usage\n\n```tsx\nimport { ChatView } from \"@alternatefutures/chat-ui\";\n\n<ChatView\n  roomLabel={label}\n  status={status}\n  messages={messages}      // ChatMessage[] — your decrypted data mapped to the kit's shape\n  events={events}          // join/leave SystemEvent[]\n  members={members}\n  me={{ username, fingerprint, pubkey }}\n  creatorPubkey={creatorPubkey}\n  undecryptable={undecryptable}\n  typing={typing}          // TypingUser[] — the local user is filtered out\n  renderBody={(text, { myName }) => renderMarkdown(text, myName)}  // injected — keeps markdown deps per-app\n  onSend={(text, replyTo) => hook.send(text, replyTo)}\n  onEdit={(ref, text) => hook.editMessage(ref, text)}\n  onDelete={(ref) => hook.deleteMessage(ref)}\n  onLeave={leave}\n  onTypingChange={(active) => transport.setTyping(active)}  // for the is-typing feature\n  footer={<BrandFooter />}  // per-app brand/logo\n/>\n```\n\n## What's shared vs per-app\n\n- **Shared (here):** the entire view + interaction logic, identity colors\n  (`makeColorOf`/`seedColor` re-exported from tokens), the typing indicator UI.\n- **Per-app (injected):** transport (relay hook for chat, LiveKit data adapter for\n  connect), crypto, `renderBody` (markdown), the footer/brand, and the optional\n  `onCaretSpark` flair.\n\n## Exports\n\n`ChatView`, `ChatMessageList`, `ChatInput`, `ChatAvatar`, `TypingIndicator`,\n`makeColorOf`, `seedColor`, `AVATAR_COLORS`, `initials`, and the structural types\n(`ChatMessage`, `Member`, `SystemEvent`, `TypingUser`, `Me`, `MsgRef`, `ConnStatus`,\n`RenderBody`).\n","readmeFilename":"README.md"}