{ "$schema": "https://blode.co/ui/schema/registry-item.json", "name": "message-scroller", "title": "Message Scroller", "author": "Matthew Blode", "description": "A chat scroll container that anchors turns, opens saved transcripts, follows streamed responses, loads history without jumping, and jumps to any message.", "dependencies": ["@shadcn/react"], "registryDependencies": ["button"], "files": [ { "path": "ui/message-scroller.tsx", "content": "\"use client\";\n\nimport { MessageScroller as MessageScrollerPrimitive } from \"@shadcn/react/message-scroller\";\nimport { ArrowDownIcon } from \"blode-icons-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\n\nexport {\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\n\nconst MessageScrollerProvider = (\n props: React.ComponentProps,\n) => ;\n\nconst MessageScroller = ({\n className,\n ...props\n}: React.ComponentProps) => (\n \n);\n\nconst MessageScrollerViewport = ({\n className,\n ...props\n}: React.ComponentProps) => (\n \n);\n\nconst MessageScrollerContent = ({\n className,\n ...props\n}: React.ComponentProps) => (\n \n);\n\nconst MessageScrollerItem = ({\n className,\n scrollAnchor = false,\n ...props\n}: React.ComponentProps) => (\n \n);\n\nconst MessageScrollerButton = ({\n direction = \"end\",\n className,\n children,\n render,\n variant = \"secondary\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps &\n Pick, \"variant\" | \"size\">) => (\n }\n {...props}\n >\n {children ?? (\n <>\n \n {direction === \"end\" ? \"Scroll to end\" : \"Scroll to start\"}\n \n )}\n \n);\n\nexport {\n MessageScroller,\n MessageScrollerButton,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerProvider,\n MessageScrollerViewport,\n};\n", "type": "registry:ui", "target": "" } ], "type": "registry:ui" }