[{"data":1,"prerenderedAt":912},["ShallowReactive",2],{"mobile-docs-navigation":3,"command-menu-docs":94,"navigation":135,"mobile-docs-page-meta":162,"docs-pages-category":187,"\u002Fdocs\u002Fcomponents\u002Fchangelog-timeline":208,"surround-\u002Fdocs\u002Fcomponents\u002Fchangelog-timeline":909},[4],{"title":5,"path":6,"stem":7,"children":8,"page":93},"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],{"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},"ChatMessage","\u002Fdocs\u002Fcomponents\u002Fchat-message","docs\u002F2.components\u002F2.chat-message",{"title":58,"path":59,"stem":60},"ChatMessages","\u002Fdocs\u002Fcomponents\u002Fchat-messages","docs\u002F2.components\u002F3.chat-messages",{"title":62,"path":63,"stem":64},"ChatPrompt","\u002Fdocs\u002Fcomponents\u002Fchat-prompt","docs\u002F2.components\u002F4.chat-prompt",{"title":66,"path":67,"stem":68},"ChatPromptSubmit","\u002Fdocs\u002Fcomponents\u002Fchat-prompt-submit","docs\u002F2.components\u002F5.chat-prompt-submit",{"title":70,"path":71,"stem":72},"DocsSearchModal","\u002Fdocs\u002Fcomponents\u002Fdocs-search-modal","docs\u002F2.components\u002F6.docs-search-modal",{"title":74,"path":75,"stem":76},"PricingPlans","\u002Fdocs\u002Fcomponents\u002Fpricing-plans","docs\u002F2.components\u002F7.pricing-plans",{"title":78,"path":79,"stem":80},"PageToc","\u002Fdocs\u002Fcomponents\u002Fpage-toc","docs\u002F2.components\u002F8.page-toc",{"title":82,"path":83,"stem":84},"ReasoningDisclosure","\u002Fdocs\u002Fcomponents\u002Freasoning-disclosure","docs\u002F2.components\u002F8.reasoning-disclosure",{"title":86,"path":87,"stem":88},"DocsPager","\u002Fdocs\u002Fcomponents\u002Fdocs-pager","docs\u002F2.components\u002F9.docs-pager",{"title":90,"path":91,"stem":92},"HomeCta","\u002Fdocs\u002Fcomponents\u002Fhome-cta","docs\u002F2.components\u002F9.home-cta",false,[95,97,99,101,103,105,107,109,111,113,115,117,119,121,123,125,127,129,131,133],{"path":39,"title":38,"description":96},"Render a release timeline from app-owned changelog data with optional rich body slots.",{"path":27,"title":26,"description":98},"Build Nuxt chat interfaces with installable shadcn-vue components you own and compose.",{"path":55,"title":54,"description":100},"Render an individual chat message bubble with AI SDK parts, actions, and layout control.",{"path":59,"title":58,"description":102},"Compose chat message lists with scrolling behavior, loading states, and action-ready assistant output.",{"path":63,"title":62,"description":104},"Build chat input flows with an auto-resizing prompt, keyboard shortcuts, and flexible slot composition.",{"path":67,"title":66,"description":106},"Handle chat submit, stop, and retry actions with a status-aware control for prompt workflows.",{"path":21,"title":20,"description":108},"Explore reusable components that complement Nuxt templates and real app workflows.",{"path":87,"title":86,"description":110},"Render previous and next documentation links from app-owned page data.",{"path":71,"title":70,"description":112},"Add a lightweight local search modal to Nuxt documentation interfaces.",{"path":35,"title":34,"description":114},"Render a reusable feature, content, or navigation card with optional link and icon slot.",{"path":51,"title":50,"description":116},"Render a complete feature section from app-owned feature data.",{"path":91,"title":90,"description":118},"Render a centered marketing CTA section with an integrated starfield background.",{"path":17,"title":16,"description":120},"Start from templates or install individual components in your Nuxt project.",{"path":11,"title":10,"description":122},"Stackhacker UI is an open-source collection of Nuxt templates and components for the shadcn-vue community.",{"path":43,"title":42,"description":124},"Render a responsive marketing metrics section from app-owned data.",{"path":79,"title":78,"description":126},"Render an on-page table of contents from app-supplied heading links.",{"path":31,"title":30,"description":128},"Render a tilted photo card with app-owned image data and explicit presentation controls.",{"path":75,"title":74,"description":130},"Render a responsive pricing plan section from app-owned data.",{"path":83,"title":82,"description":132},"Show app-owned AI reasoning text in a compact collapsible disclosure.",{"path":47,"title":46,"description":134},"Render a responsive social-proof section from app-owned testimonial data.",[136],{"title":5,"path":6,"stem":7,"children":137,"page":93},[138,142],{"title":10,"path":11,"stem":12,"children":139},[140,141],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},{"title":20,"path":21,"stem":22,"children":143},[144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],{"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},[163,165,166,167,169,171,173,174,175,176,177,178,179,180,181,182,183,184,185,186],{"path":11,"category":164},"overview",{"path":17,"category":164},{"path":21,"category":164},{"path":27,"category":168},"chat",{"path":31,"category":170},"content",{"path":35,"category":172},"marketing",{"path":39,"category":170},{"path":43,"category":172},{"path":47,"category":172},{"path":51,"category":172},{"path":55,"category":168},{"path":59,"category":168},{"path":63,"category":168},{"path":67,"category":168},{"path":71,"category":170},{"path":75,"category":172},{"path":79,"category":170},{"path":83,"category":168},{"path":87,"category":170},{"path":91,"category":172},[188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207],{"path":11,"category":164},{"path":17,"category":164},{"path":21,"category":164},{"path":27,"category":168},{"path":31,"category":170},{"path":35,"category":172},{"path":39,"category":170},{"path":43,"category":172},{"path":47,"category":172},{"path":51,"category":172},{"path":55,"category":168},{"path":59,"category":168},{"path":63,"category":168},{"path":67,"category":168},{"path":71,"category":170},{"path":75,"category":172},{"path":79,"category":170},{"path":83,"category":168},{"path":87,"category":170},{"path":91,"category":172},{"id":209,"title":38,"body":210,"category":170,"description":96,"extension":904,"meta":905,"navigation":906,"path":39,"seo":907,"stem":40,"__hash__":908},"docs\u002Fdocs\u002F2.components\u002F12.changelog-timeline.md",{"type":211,"value":212,"toc":883},"minimark",[213,217,221,232,236,244,248,254,281,285,303,309,313,320,395,398,402,407,409,413,419,423,429,433,439,443,447,701,705,820,824,856,860],[214,215],"component-preview",{"name":216},"ChangelogTimelineDemo",[218,219,16],"h2",{"id":220},"installation",[222,223,229],"pre",{"className":224,"code":226,"language":227,"meta":228},[225],"language-bash","npx shadcn-vue@latest add \"https:\u002F\u002Fui.stackhacker.io\u002Fr\u002Fchangelog-timeline.json\"\n","bash","",[230,231,226],"code",{"__ignoreMap":228},[218,233,235],{"id":234},"usage","Usage",[222,237,242],{"className":238,"code":240,"language":241,"meta":228},[239],"language-vue","\u003Cscript setup lang=\"ts\">\nimport { ChangelogTimeline, type ChangelogTimelineItem } from \"@\u002Fcomponents\u002Fchangelog-timeline\";\n\nconst releases: ChangelogTimelineItem[] = [\n  {\n    id: \"2026-06-27\",\n    tag: \"v1.4.0\",\n    title: \"Registry-ready release timeline\",\n    dateLabel: \"Jun 27, 2026\",\n    date: \"2026-06-27\",\n    body: \"Ship a portable timeline block with app-owned release data.\",\n  },\n];\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CChangelogTimeline :items=\"releases\" \u002F>\n\u003C\u002Ftemplate>\n","vue",[230,243,240],{"__ignoreMap":228},[218,245,247],{"id":246},"app-owned-release-data","App-Owned Release Data",[249,250,251,253],"p",{},[230,252,38],{}," owns the timeline layout, latest marker, body slot boundary, and lightweight presentational states. Your app owns release fetching, repository configuration, normalization, caching, refresh lifecycle, date formatting, markdown rendering, and analytics.",[249,255,256,257,260,261,264,265,268,269,272,273,276,277,280],{},"The component intentionally does not import Nuxt MDC, parse markdown, call ",[230,258,259],{},"useFetch",", know about ",[230,262,263],{},"ungh.cc",", or require a GitHub release response shape. Pass app-shaped items with an already formatted ",[230,266,267],{},"dateLabel",". Use the optional raw ",[230,270,271],{},"date"," only when you want the rendered ",[230,274,275],{},"time"," element to include a machine-readable ",[230,278,279],{},"datetime"," value.",[218,282,284],{"id":283},"rich-release-notes","Rich Release Notes",[249,286,287,288,291,292,294,295,298,299,302],{},"Use the ",[230,289,290],{},"item"," slot when your app wants rich release notes. The slot receives ",[230,293,290],{},", ",[230,296,297],{},"index",", and ",[230,300,301],{},"latest",", so the consuming app can render MDC, prose components, custom HTML, or plain Vue markup without turning that renderer into a registry dependency.",[222,304,307],{"className":305,"code":306,"language":241,"meta":228},[239],"\u003CChangelogTimeline :items=\"releases\">\n  \u003Ctemplate #item=\"{ item, latest }\">\n    \u003Carticle class=\"space-y-3\">\n      \u003Cp>{{ item.body }}\u003C\u002Fp>\n      \u003Cp v-if=\"latest\" class=\"font-medium\">\n        This is the latest release.\n      \u003C\u002Fp>\n    \u003C\u002Farticle>\n  \u003C\u002Ftemplate>\n\u003C\u002FChangelogTimeline>\n",[230,308,306],{"__ignoreMap":228},[218,310,312],{"id":311},"github-releases-adapter","GitHub Releases Adapter",[249,314,315,316,319],{},"Keep GitHub release fetching in app code. Map your release source into ",[230,317,318],{},"ChangelogTimelineItem"," before passing it to the component.",[321,322,323,336],"table",{},[324,325,326],"thead",{},[327,328,329,333],"tr",{},[330,331,332],"th",{},"Source field",[330,334,335],{},"Timeline item field",[337,338,339,352,367,382],"tbody",{},[327,340,341,347],{},[342,343,344],"td",{},[230,345,346],{},"tag",[342,348,349,351],{},[230,350,346],{}," and fallback key",[327,353,354,362],{},[342,355,356,359,360],{},[230,357,358],{},"name"," or ",[230,361,346],{},[342,363,364],{},[230,365,366],{},"title",[327,368,369,374],{},[342,370,371],{},[230,372,373],{},"publishedAt",[342,375,376,377,379,380],{},"raw ",[230,378,271],{}," plus app-formatted ",[230,381,267],{},[327,383,384,389],{},[342,385,386],{},[230,387,388],{},"markdown",[342,390,391,394],{},[230,392,393],{},"body"," or slot-rendered rich content",[249,396,397],{},"This keeps the generated registry item independent from network clients, API providers, and markdown modules.",[218,399,401],{"id":400},"examples","Examples",[403,404,406],"h3",{"id":405},"default","Default",[214,408],{"name":216},[403,410,412],{"id":411},"loading","Loading",[222,414,417],{"className":415,"code":416,"language":241,"meta":228},[239],"\u003CChangelogTimeline loading \u002F>\n",[230,418,416],{"__ignoreMap":228},[403,420,422],{"id":421},"empty","Empty",[222,424,427],{"className":425,"code":426,"language":241,"meta":228},[239],"\u003CChangelogTimeline\n  :items=\"[]\"\n  empty-title=\"No public releases\"\n  empty-description=\"Connect your app-owned release source when you are ready to publish.\"\n\u002F>\n",[230,428,426],{"__ignoreMap":228},[403,430,432],{"id":431},"error-with-retry","Error With Retry",[222,434,437],{"className":435,"code":436,"language":241,"meta":228},[239],"\u003CChangelogTimeline\n  error=\"The release source did not respond.\"\n  show-retry\n  @retry=\"refreshReleases\"\n\u002F>\n",[230,438,436],{"__ignoreMap":228},[218,440,442],{"id":441},"api-reference","API Reference",[403,444,446],{"id":445},"props","Props",[321,448,449,464],{},[324,450,451],{},[327,452,453,456,459,461],{},[330,454,455],{},"Prop",[330,457,458],{},"Type",[330,460,406],{},[330,462,463],{},"Description",[337,465,466,486,505,524,544,563,582,601,627,646,664,683],{},[327,467,468,473,478,483],{},[342,469,470],{},[230,471,472],{},"items",[342,474,475],{},[230,476,477],{},"ChangelogTimelineItem[]",[342,479,480],{},[230,481,482],{},"[]",[342,484,485],{},"Release items supplied by your app.",[327,487,488,492,497,502],{},[342,489,490],{},[230,491,411],{},[342,493,494],{},[230,495,496],{},"boolean",[342,498,499],{},[230,500,501],{},"false",[342,503,504],{},"Shows loading skeletons when no items are present.",[327,506,507,512,517,521],{},[342,508,509],{},[230,510,511],{},"error",[342,513,514],{},[230,515,516],{},"boolean | string",[342,518,519],{},[230,520,501],{},[342,522,523],{},"Shows an error state. A string is rendered as supporting error copy.",[327,525,526,531,536,541],{},[342,527,528],{},[230,529,530],{},"latestLabel",[342,532,533],{},[230,534,535],{},"string",[342,537,538],{},[230,539,540],{},"\"Latest release\"",[342,542,543],{},"Label shown for the latest item.",[327,545,546,551,555,560],{},[342,547,548],{},[230,549,550],{},"emptyTitle",[342,552,553],{},[230,554,535],{},[342,556,557],{},[230,558,559],{},"\"No releases yet\"",[342,561,562],{},"Empty state title.",[327,564,565,570,574,579],{},[342,566,567],{},[230,568,569],{},"emptyDescription",[342,571,572],{},[230,573,535],{},[342,575,576],{},[230,577,578],{},"\"Published releases will appear here as changelog entries.\"",[342,580,581],{},"Empty state description.",[327,583,584,589,593,598],{},[342,585,586],{},[230,587,588],{},"errorTitle",[342,590,591],{},[230,592,535],{},[342,594,595],{},[230,596,597],{},"\"Could not load releases\"",[342,599,600],{},"Error state title.",[327,602,603,608,612,617],{},[342,604,605],{},[230,606,607],{},"errorDescription",[342,609,610],{},[230,611,535],{},[342,613,614],{},[230,615,616],{},"\"Check the release source or try loading the changelog again.\"",[342,618,619,620,622,623,626],{},"Error state description used when ",[230,621,511],{}," is ",[230,624,625],{},"true",".",[327,628,629,634,638,643],{},[342,630,631],{},[230,632,633],{},"retryLabel",[342,635,636],{},[230,637,535],{},[342,639,640],{},[230,641,642],{},"\"Try again\"",[342,644,645],{},"Retry button label.",[327,647,648,653,657,661],{},[342,649,650],{},[230,651,652],{},"showRetry",[342,654,655],{},[230,656,496],{},[342,658,659],{},[230,660,501],{},[342,662,663],{},"Shows a native retry button in the error state.",[327,665,666,671,675,680],{},[342,667,668],{},[230,669,670],{},"ariaLabel",[342,672,673],{},[230,674,535],{},[342,676,677],{},[230,678,679],{},"\"Changelog timeline\"",[342,681,682],{},"Accessible label for the timeline list.",[327,684,685,690,695,698],{},[342,686,687],{},[230,688,689],{},"class",[342,691,692],{},[230,693,694],{},"HTMLAttributes[\"class\"]",[342,696,697],{},"—",[342,699,700],{},"Additional CSS classes for the root element.",[403,702,704],{"id":703},"item-type","Item Type",[321,706,707,718],{},[324,708,709],{},[327,710,711,714,716],{},[330,712,713],{},"Field",[330,715,458],{},[330,717,463],{},[337,719,720,737,750,763,776,792,805],{},[327,721,722,727,731],{},[342,723,724],{},[230,725,726],{},"id",[342,728,729],{},[230,730,535],{},[342,732,733,734,736],{},"Stable item id. Falls back to ",[230,735,346],{}," or title-derived key when omitted.",[327,738,739,743,747],{},[342,740,741],{},[230,742,346],{},[342,744,745],{},[230,746,535],{},[342,748,749],{},"Optional release tag supplied by your app.",[327,751,752,756,760],{},[342,753,754],{},[230,755,366],{},[342,757,758],{},[230,759,535],{},[342,761,762],{},"Release title.",[327,764,765,769,773],{},[342,766,767],{},[230,768,267],{},[342,770,771],{},[230,772,535],{},[342,774,775],{},"App-formatted display date.",[327,777,778,782,786],{},[342,779,780],{},[230,781,271],{},[342,783,784],{},[230,785,535],{},[342,787,788,789,791],{},"Optional machine-readable date for the ",[230,790,279],{}," attribute.",[327,793,794,798,802],{},[342,795,796],{},[230,797,393],{},[342,799,800],{},[230,801,535],{},[342,803,804],{},"Optional plain text fallback body.",[327,806,807,811,815],{},[342,808,809],{},[230,810,301],{},[342,812,813],{},[230,814,496],{},[342,816,817,818,626],{},"Marks this item as latest. Defaults to the first item when no item sets ",[230,819,301],{},[403,821,823],{"id":822},"slots","Slots",[321,825,826,837],{},[324,827,828],{},[327,829,830,833,835],{},[330,831,832],{},"Slot",[330,834,446],{},[330,836,463],{},[337,838,839],{},[327,840,841,845,850],{},[342,842,843],{},[230,844,290],{},[342,846,847],{},[230,848,849],{},"{ item, index, latest }",[342,851,852,853,626],{},"Rich body renderer for each release item. Falls back to ",[230,854,855],{},"item.body",[403,857,859],{"id":858},"emits","Emits",[321,861,862,871],{},[324,863,864],{},[327,865,866,869],{},[330,867,868],{},"Event",[330,870,463],{},[337,872,873],{},[327,874,875,880],{},[342,876,877],{},[230,878,879],{},"retry",[342,881,882],{},"Emitted when the optional retry button is clicked. The app owns refresh behavior.",{"title":228,"searchDepth":884,"depth":884,"links":885},2,[886,887,888,889,890,891,898],{"id":220,"depth":884,"text":16},{"id":234,"depth":884,"text":235},{"id":246,"depth":884,"text":247},{"id":283,"depth":884,"text":284},{"id":311,"depth":884,"text":312},{"id":400,"depth":884,"text":401,"children":892},[893,895,896,897],{"id":405,"depth":894,"text":406},3,{"id":411,"depth":894,"text":412},{"id":421,"depth":894,"text":422},{"id":431,"depth":894,"text":432},{"id":441,"depth":884,"text":442,"children":899},[900,901,902,903],{"id":445,"depth":894,"text":446},{"id":703,"depth":894,"text":704},{"id":822,"depth":894,"text":823},{"id":858,"depth":894,"text":859},"md",{},true,{"title":38,"description":96},"CnmcKdIdVIpk9H60PvQwH-Aqa7hxAGWdMcNUimC43cg",[910,911],{"title":34,"path":35,"stem":36,"children":-1},{"title":42,"path":43,"stem":44,"children":-1},1782559522483]