[{"data":1,"prerenderedAt":455},["ShallowReactive",2],{"mobile-docs-navigation":3,"command-menu-docs":126,"navigation":183,"mobile-docs-page-meta":218,"docs-pages-category":252,"\u002Fdocs\u002Fcomponents\u002Fchat":281,"surround-\u002Fdocs\u002Fcomponents\u002Fchat":452},[4],{"title":5,"path":6,"stem":7,"children":8,"page":125},"Docs","\u002Fdocs","docs",[9,19],{"title":10,"path":11,"stem":12,"children":13},"Introduction","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[14,15],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":20,"path":21,"stem":22,"children":23},"Components","\u002Fdocs\u002Fcomponents","docs\u002F2.components\u002F0.index",[24,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121],{"title":20,"path":21,"stem":22},{"title":26,"path":27,"stem":28},"Chat","\u002Fdocs\u002Fcomponents\u002Fchat","docs\u002F2.components\u002F1.chat",{"title":30,"path":31,"stem":32},"PolaroidCard","\u002Fdocs\u002Fcomponents\u002Fpolaroid-card","docs\u002F2.components\u002F10.polaroid-card",{"title":34,"path":35,"stem":36},"FeatureCard","\u002Fdocs\u002Fcomponents\u002Ffeature-card","docs\u002F2.components\u002F11.feature-card",{"title":38,"path":39,"stem":40},"ChangelogTimeline","\u002Fdocs\u002Fcomponents\u002Fchangelog-timeline","docs\u002F2.components\u002F12.changelog-timeline",{"title":42,"path":43,"stem":44},"MetricsGrid","\u002Fdocs\u002Fcomponents\u002Fmetrics-grid","docs\u002F2.components\u002F13.metrics-grid",{"title":46,"path":47,"stem":48},"Testimonials","\u002Fdocs\u002Fcomponents\u002Ftestimonials","docs\u002F2.components\u002F13.testimonials",{"title":50,"path":51,"stem":52},"FeatureGrid","\u002Fdocs\u002Fcomponents\u002Ffeature-grid","docs\u002F2.components\u002F14.feature-grid",{"title":54,"path":55,"stem":56},"FaqTabs","\u002Fdocs\u002Fcomponents\u002Ffaq-tabs","docs\u002F2.components\u002F15.faq-tabs",{"title":58,"path":59,"stem":60},"BlogPostGrid","\u002Fdocs\u002Fcomponents\u002Fblog-post-grid","docs\u002F2.components\u002F16.blog-post-grid",{"title":62,"path":63,"stem":64},"FeatureSplit","\u002Fdocs\u002Fcomponents\u002Ffeature-split","docs\u002F2.components\u002F17.feature-split",{"title":66,"path":67,"stem":68},"FileAttachment","\u002Fdocs\u002Fcomponents\u002Ffile-attachment","docs\u002F2.components\u002F17.file-attachment",{"title":70,"path":71,"stem":72},"ModelPicker","\u002Fdocs\u002Fcomponents\u002Fmodel-picker","docs\u002F2.components\u002F17.model-picker",{"title":74,"path":75,"stem":76},"WorkExperience","\u002Fdocs\u002Fcomponents\u002Fwork-experience","docs\u002F2.components\u002F17.work-experience",{"title":78,"path":79,"stem":80},"Form","\u002Fdocs\u002Fcomponents\u002Fform","docs\u002F2.components\u002F18.form",{"title":82,"path":83,"stem":84},"FormField","\u002Fdocs\u002Fcomponents\u002Fform-field","docs\u002F2.components\u002F19.form-field",{"title":86,"path":87,"stem":88},"ChatMessage","\u002Fdocs\u002Fcomponents\u002Fchat-message","docs\u002F2.components\u002F2.chat-message",{"title":90,"path":91,"stem":92},"ChatMessages","\u002Fdocs\u002Fcomponents\u002Fchat-messages","docs\u002F2.components\u002F3.chat-messages",{"title":94,"path":95,"stem":96},"ChatPrompt","\u002Fdocs\u002Fcomponents\u002Fchat-prompt","docs\u002F2.components\u002F4.chat-prompt",{"title":98,"path":99,"stem":100},"ChatPromptSubmit","\u002Fdocs\u002Fcomponents\u002Fchat-prompt-submit","docs\u002F2.components\u002F5.chat-prompt-submit",{"title":102,"path":103,"stem":104},"DocsSearchModal","\u002Fdocs\u002Fcomponents\u002Fdocs-search-modal","docs\u002F2.components\u002F6.docs-search-modal",{"title":106,"path":107,"stem":108},"PricingPlans","\u002Fdocs\u002Fcomponents\u002Fpricing-plans","docs\u002F2.components\u002F7.pricing-plans",{"title":110,"path":111,"stem":112},"PageToc","\u002Fdocs\u002Fcomponents\u002Fpage-toc","docs\u002F2.components\u002F8.page-toc",{"title":114,"path":115,"stem":116},"ReasoningDisclosure","\u002Fdocs\u002Fcomponents\u002Freasoning-disclosure","docs\u002F2.components\u002F8.reasoning-disclosure",{"title":118,"path":119,"stem":120},"DocsPager","\u002Fdocs\u002Fcomponents\u002Fdocs-pager","docs\u002F2.components\u002F9.docs-pager",{"title":122,"path":123,"stem":124},"HomeCta","\u002Fdocs\u002Fcomponents\u002Fhome-cta","docs\u002F2.components\u002F9.home-cta",false,[127,129,131,133,135,137,139,141,143,145,147,149,151,153,155,157,159,161,163,165,167,169,171,173,175,177,179,181],{"path":59,"title":58,"description":128},"Render responsive blog and content teaser grids from display-ready post data.",{"path":39,"title":38,"description":130},"Render a release timeline from app-owned changelog data with optional rich body slots.",{"path":27,"title":26,"description":132},"Build Nuxt chat interfaces with installable shadcn-vue components you own and compose.",{"path":87,"title":86,"description":134},"Render an individual chat message bubble with AI SDK parts, actions, and layout control.",{"path":91,"title":90,"description":136},"Compose chat message lists with scrolling behavior, loading states, and action-ready assistant output.",{"path":95,"title":94,"description":138},"Build chat input flows with an auto-resizing prompt, keyboard shortcuts, and flexible slot composition.",{"path":99,"title":98,"description":140},"Handle chat submit, stop, and retry actions with a status-aware control for prompt workflows.",{"path":21,"title":20,"description":142},"Explore reusable components that complement Nuxt templates and real app workflows.",{"path":119,"title":118,"description":144},"Render previous and next documentation links from app-owned page data.",{"path":103,"title":102,"description":146},"Add a lightweight local search modal to Nuxt documentation interfaces.",{"path":55,"title":54,"description":148},"Render categorized FAQ sections while keeping answer content in your app.",{"path":35,"title":34,"description":150},"Render a reusable feature, content, or navigation card with optional link and icon slot.",{"path":51,"title":50,"description":152},"Render a complete feature section from app-owned feature data.",{"path":63,"title":62,"description":154},"Render alternating split feature sections with app-owned media and icon slots.",{"path":67,"title":66,"description":156},"Render display-only file attachment UI while your app owns upload behavior.",{"path":79,"title":78,"description":158},"Validate app-owned form state and distribute errors to named fields.",{"path":83,"title":82,"description":160},"Wrap form controls with labels, descriptions, help text, and validation errors.",{"path":123,"title":122,"description":162},"Render a centered marketing CTA section with an integrated starfield background.",{"path":17,"title":16,"description":164},"Start from templates or install individual components in your Nuxt project.",{"path":11,"title":10,"description":166},"Stackhacker UI is an open-source collection of Nuxt templates and components for the shadcn-vue community.",{"path":43,"title":42,"description":168},"Render a responsive marketing metrics section from app-owned data.",{"path":71,"title":70,"description":170},"Render a controlled model selector from app-owned model\u002Fprovider data.",{"path":111,"title":110,"description":172},"Render an on-page table of contents from app-supplied heading links.",{"path":31,"title":30,"description":174},"Render a tilted photo card with app-owned image data and explicit presentation controls.",{"path":107,"title":106,"description":176},"Render a responsive pricing plan section from app-owned data.",{"path":115,"title":114,"description":178},"Show app-owned AI reasoning text in a compact collapsible disclosure.",{"path":47,"title":46,"description":180},"Render a responsive social-proof section from app-owned testimonial data.",{"path":75,"title":74,"description":182},"Render compact work-history and resume lists from app-owned experience data.",[184],{"title":5,"path":6,"stem":7,"children":185,"page":125},[186,190],{"title":10,"path":11,"stem":12,"children":187},[188,189],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},{"title":20,"path":21,"stem":22,"children":191},[192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217],{"title":20,"path":21,"stem":22},{"title":26,"path":27,"stem":28},{"title":30,"path":31,"stem":32},{"title":34,"path":35,"stem":36},{"title":38,"path":39,"stem":40},{"title":42,"path":43,"stem":44},{"title":46,"path":47,"stem":48},{"title":50,"path":51,"stem":52},{"title":54,"path":55,"stem":56},{"title":58,"path":59,"stem":60},{"title":62,"path":63,"stem":64},{"title":66,"path":67,"stem":68},{"title":70,"path":71,"stem":72},{"title":74,"path":75,"stem":76},{"title":78,"path":79,"stem":80},{"title":82,"path":83,"stem":84},{"title":86,"path":87,"stem":88},{"title":90,"path":91,"stem":92},{"title":94,"path":95,"stem":96},{"title":98,"path":99,"stem":100},{"title":102,"path":103,"stem":104},{"title":106,"path":107,"stem":108},{"title":110,"path":111,"stem":112},{"title":114,"path":115,"stem":116},{"title":118,"path":119,"stem":120},{"title":122,"path":123,"stem":124},[219,221,222,223,225,227,229,230,231,232,233,234,235,236,237,238,239,241,242,243,244,245,246,247,248,249,250,251],{"path":11,"category":220},"overview",{"path":17,"category":220},{"path":21,"category":220},{"path":27,"category":224},"chat",{"path":31,"category":226},"content",{"path":35,"category":228},"marketing",{"path":39,"category":226},{"path":43,"category":228},{"path":47,"category":228},{"path":51,"category":228},{"path":55,"category":228},{"path":59,"category":226},{"path":63,"category":228},{"path":67,"category":224},{"path":71,"category":224},{"path":75,"category":226},{"path":79,"category":240},"form",{"path":83,"category":240},{"path":87,"category":224},{"path":91,"category":224},{"path":95,"category":224},{"path":99,"category":224},{"path":103,"category":226},{"path":107,"category":228},{"path":111,"category":226},{"path":115,"category":224},{"path":119,"category":226},{"path":123,"category":228},[253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280],{"path":11,"category":220},{"path":17,"category":220},{"path":21,"category":220},{"path":27,"category":224},{"path":31,"category":226},{"path":35,"category":228},{"path":39,"category":226},{"path":43,"category":228},{"path":47,"category":228},{"path":51,"category":228},{"path":55,"category":228},{"path":59,"category":226},{"path":63,"category":228},{"path":67,"category":224},{"path":71,"category":224},{"path":75,"category":226},{"path":79,"category":240},{"path":83,"category":240},{"path":87,"category":224},{"path":91,"category":224},{"path":95,"category":224},{"path":99,"category":224},{"path":103,"category":226},{"path":107,"category":228},{"path":111,"category":226},{"path":115,"category":224},{"path":119,"category":226},{"path":123,"category":228},{"id":282,"title":26,"body":283,"category":224,"description":132,"extension":447,"meta":448,"navigation":449,"path":27,"seo":450,"stem":28,"__hash__":451},"docs\u002Fdocs\u002F2.components\u002F1.chat.md",{"type":284,"value":285,"toc":440},"minimark",[286,290,293,297,363,367,374,384,387,393,396,402,406,414,418,421,437],[287,288,289],"p",{},"Stackhacker UI Chat is a starter kit for adding chat UI pieces to a shadcn-vue Nuxt project.",[287,291,292],{},"Unlike an integrated UI module, these registry items are installed as source code in your app. You can read them, change them, and compose them with your own AI SDK state, server endpoints, markdown rendering, files, tools, and auth.",[294,295,20],"h2",{"id":296},"components",[298,299,300,313],"table",{},[301,302,303],"thead",{},[304,305,306,310],"tr",{},[307,308,309],"th",{},"Component",[307,311,312],{},"Description",[314,315,316,327,336,345,354],"tbody",{},[304,317,318,324],{},[319,320,321],"td",{},[322,323,90],"a",{"href":91},[319,325,326],{},"Message list component with loading state, optional auto-scroll, and assistant actions.",[304,328,329,333],{},[319,330,331],{},[322,332,86],{"href":87},[319,334,335],{},"Individual message bubble component with content slots, leading content, and action buttons.",[304,337,338,342],{},[319,339,340],{},[322,341,94],{"href":95},[319,343,344],{},"Prompt input wrapper for composing text areas, errors, and footer controls.",[304,346,347,351],{},[319,348,349],{},[322,350,98],{"href":99},[319,352,353],{},"Status-aware submit, stop, and retry button for prompt workflows.",[304,355,356,360],{},[319,357,358],{},[322,359,114],{"href":115},[319,361,362],{},"Collapsible disclosure for app-owned AI reasoning text.",[294,364,366],{"id":365},"install","Install",[287,368,369,370,373],{},"Install the message list when you want the primary display surface. It also installs ",[371,372,86],"code",{}," because the list composes individual messages.",[375,376,382],"pre",{"className":377,"code":379,"language":380,"meta":381},[378],"language-bash","npx shadcn-vue@latest add \"https:\u002F\u002Fui.stackhacker.io\u002Fr\u002Fchat-messages.json\"\n","bash","",[371,383,379],{"__ignoreMap":381},[287,385,386],{},"Install prompt pieces when you want the input surface.",[375,388,391],{"className":389,"code":390,"language":380,"meta":381},[378],"npx shadcn-vue@latest add \"https:\u002F\u002Fui.stackhacker.io\u002Fr\u002Fchat-prompt.json\"\nnpx shadcn-vue@latest add \"https:\u002F\u002Fui.stackhacker.io\u002Fr\u002Fchat-prompt-submit.json\"\n",[371,392,390],{"__ignoreMap":381},[287,394,395],{},"Install reasoning disclosure when you want to show app-owned reasoning text.",[375,397,400],{"className":398,"code":399,"language":380,"meta":381},[378],"npx shadcn-vue@latest add \"https:\u002F\u002Fui.stackhacker.io\u002Fr\u002Freasoning-disclosure.json\"\n",[371,401,399],{"__ignoreMap":381},[294,403,405],{"id":404},"basic-composition","Basic Composition",[375,407,412],{"className":408,"code":410,"language":411,"meta":381},[409],"language-vue","\u003Cscript setup lang=\"ts\">\nimport { ChatMessages } from '@\u002Fcomponents\u002Fchat-messages'\nimport { ChatPrompt } from '@\u002Fcomponents\u002Fchat-prompt'\nimport { ChatPromptSubmit } from '@\u002Fcomponents\u002Fchat-prompt-submit'\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"flex min-h-0 flex-1 flex-col gap-4\">\n    \u003CChatMessages :messages=\"messages\" :status=\"status\" should-auto-scroll \u002F>\n\n    \u003CChatPrompt v-model=\"input\" @submit=\"sendMessage\">\n      \u003Ctemplate #footer>\n        \u003CChatPromptSubmit :status=\"status\" @stop=\"stop\" @reload=\"reload\" \u002F>\n      \u003C\u002Ftemplate>\n    \u003C\u002FChatPrompt>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","vue",[371,413,410],{"__ignoreMap":381},[294,415,417],{"id":416},"app-responsibilities","App Responsibilities",[287,419,420],{},"The registry items handle the UI boundaries. Your Nuxt app still owns the chat runtime:",[422,423,424,428,431,434],"ul",{},[425,426,427],"li",{},"AI SDK client state and message sending.",[425,429,430],{},"Server API endpoints and model provider setup.",[425,432,433],{},"Markdown, reasoning, tool, and file rendering.",[425,435,436],{},"Auth, persistence, layout, and deployment behavior.",[287,438,439],{},"Use the component slots to connect those app-level concerns without turning the registry components into a full chat framework.",{"title":381,"searchDepth":441,"depth":441,"links":442},2,[443,444,445,446],{"id":296,"depth":441,"text":20},{"id":365,"depth":441,"text":366},{"id":404,"depth":441,"text":405},{"id":416,"depth":441,"text":417},"md",{},true,{"title":26,"description":132},"ER97oqH9NQ3slP2Ptah436LfV61-26LG7duMpaTaPrw",[453,454],{"title":20,"path":21,"stem":22,"children":-1},{"title":30,"path":31,"stem":32,"children":-1},1782820041590]