[{"data":1,"prerenderedAt":1317},["ShallowReactive",2],{"duxt-navigation-docs-docs":3,"i-lucide:rocket":832,"i-lucide:compass":837,"i-lucide:book-open":839,"i-lucide:ruler":841,"i-lucide:gavel":843,"i-lucide:list":845,"i-lucide:settings":847,"i-lucide:tag":849,"i-lucide:file-clock":851,"i-lucide:split":853,"i-lucide:scan-text":855,"i-lucide:box":857,"i-lucide:git-branch":859,"i-lucide:file-code":861,"i-lucide:blocks":863,"i-lucide:component":865,"i-lucide:function-square":867,"i-lucide:route":869,"i-lucide:wrench":871,"i-lucide:plug":873,"i-lucide:chevron-right":875,"i-lucide:menu":877,"i-lucide:chevron-down":879,"i-lucide:search":881,"i-simple-icons:github":883,"i-flag:gb-4x3":885,"i-lucide:moon":889,"docs-en-GB-\u002Freference\u002Fchangelog\u002Fcomponents":891,"i-lucide:copy":1295,"i-lucide:thumbs-up":1297,"i-lucide:thumbs-down":1299,"i-lucide:star":1301,"i-lucide:circle-alert":1303,"i-simple-icons:discord":1305,"i-lucide:book-open-text":1307,"i-lucide:arrow-up-right":1309,"i-lucide:pencil":1311,"duxt-code-text-app\u002Flayouts\u002Fchangelog.vue\n":784,"duxt-code-text-app\u002Fcomponents\u002Fcontent\u002FChangelogGroup.vue\n":784,"i-lucide:arrow-left":1313,"i-lucide:arrow-right":1315},[4,25,94,148,743,751,771,826],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","1.getting-started",[9,13,19],{"title":5,"path":6,"stem":10,"icon":11,"description":12},"1.getting-started\u002Findex","lucide:rocket","What duxt is, and what arrives with a single line of config.",{"title":14,"path":15,"stem":16,"icon":17,"description":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","lucide:download","Add the layer, extend it, write Markdown.",{"title":20,"path":21,"stem":22,"icon":23,"description":24},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F2.configuration","lucide:settings","One file configures the whole site — what belongs in it, and how it merges.",{"title":26,"path":27,"stem":28,"children":29},"Concepts","\u002Fconcepts","2.concepts",[30,34,40,46,52,58,64,70,76,82,88],{"title":26,"path":27,"stem":31,"icon":32,"description":33},"2.concepts\u002Findex","lucide:compass","How the layer works — the sources model, the URL scheme, the collections and the checks.",{"title":35,"path":36,"stem":37,"icon":38,"description":39},"Layers and overriding","\u002Fconcepts\u002Flayers","2.concepts\u002F1.layers","lucide:layers","What a Nuxt layer gives you, what it takes away, and which paths do not resolve the way they read.",{"title":41,"path":42,"stem":43,"icon":44,"description":45},"Theming","\u002Fconcepts\u002Ftheming","2.concepts\u002F10.theming","lucide:palette","How the theme is put together — owned components, one token layer, and a dark mode that switches on a class.",{"title":47,"path":48,"stem":49,"icon":50,"description":51},"Sources","\u002Fconcepts\u002Fsources","2.concepts\u002F2.sources","lucide:git-branch","One list of sources becomes every collection, prefix and version the site serves.",{"title":53,"path":54,"stem":55,"icon":56,"description":57},"URLs and versions","\u002Fconcepts\u002Furls-and-versions","2.concepts\u002F3.urls-and-versions","lucide:git-compare","How the repository and version segments appear, and what a reader in an old version is told.",{"title":59,"path":60,"stem":61,"icon":62,"description":63},"Collections","\u002Fconcepts\u002Fcollections","2.concepts\u002F4.collections","lucide:database","What Content builds from the sources, and the four things the schema adds.",{"title":65,"path":66,"stem":67,"icon":68,"description":69},"Generated sections","\u002Fconcepts\u002Fgenerated-sections","2.concepts\u002F5.generated-sections","lucide:file-cog","An artefact plus a type, published as pages — what the registry is, and the two policies a type answers.",{"title":71,"path":72,"stem":73,"icon":74,"description":75},"What the build checks","\u002Fconcepts\u002Fbuild-checks","2.concepts\u002F6.build-checks","lucide:shield-check","The silent failures this layer had, turned into messages.",{"title":77,"path":78,"stem":79,"icon":80,"description":81},"Machine readers","\u002Fconcepts\u002Fmachine-readers","2.concepts\u002F7.machine-readers","lucide:bot","What a model gets — llms.txt, the raw Markdown of any page, and a real MCP server.",{"title":83,"path":84,"stem":85,"icon":86,"description":87},"SEO","\u002Fconcepts\u002Fseo","2.concepts\u002F8.seo","lucide:search","What every page emits for crawlers and social cards, which module writes it, and the one value the layer cannot guess.",{"title":89,"path":90,"stem":91,"icon":92,"description":93},"Localisation","\u002Fconcepts\u002Flocalisation","2.concepts\u002F9.localisation","lucide:languages","Seven locales ship with the layer, and every configured string takes three forms.",{"title":95,"path":96,"stem":97,"children":98},"Guides","\u002Fguides","3.guides",[99,103,109,114,119,124,130,136,142],{"title":95,"path":96,"stem":100,"icon":101,"description":102},"3.guides\u002Findex","lucide:book-open","One task per page, start to finish — several repositories, several versions, several languages, and a deploy.",{"title":104,"path":105,"stem":106,"icon":107,"description":108},"Several repositories","\u002Fguides\u002Fseveral-repositories","3.guides\u002F1.several-repositories","lucide:folder-git","Serve the documentation of several projects from one site.",{"title":110,"path":111,"stem":112,"icon":56,"description":113},"Several versions","\u002Fguides\u002Fseveral-versions","3.guides\u002F2.several-versions","Serve the same documentation at several refs, with a switcher and a banner.",{"title":115,"path":116,"stem":117,"icon":92,"description":118},"Several languages","\u002Fguides\u002Fseveral-languages","3.guides\u002F3.several-languages","Serve the interface in several languages, and translate the pages themselves.",{"title":120,"path":121,"stem":122,"icon":44,"description":123},"Override the theme","\u002Fguides\u002Foverride-the-theme","3.guides\u002F4.override-the-theme","Change a colour, replace a component, add a shadcn-vue primitive.",{"title":125,"path":126,"stem":127,"icon":128,"description":129},"Move a page","\u002Fguides\u002Fmove-a-page","3.guides\u002F5.move-a-page","lucide:signpost","redirectFrom in the frontmatter, turned into route rules under every prefix.",{"title":131,"path":132,"stem":133,"icon":134,"description":135},"Deploy a site","\u002Fguides\u002Fdeploy-a-site","3.guides\u002F6.deploy-a-site","lucide:cloud-upload","Where a duxt site can run, what it needs there, and why content is not refreshed at runtime.",{"title":137,"path":138,"stem":139,"icon":140,"description":141},"Collect page feedback","\u002Fguides\u002Fcollect-page-feedback","3.guides\u002F7.collect-page-feedback","lucide:thumbs-up","Wrap DuxtPageFeedback, keep the answer where your analytics already live.",{"title":143,"path":144,"stem":145,"icon":146,"description":147},"Brand your site","\u002Fguides\u002Fbrand-your-site","3.guides\u002F8.brand-your-site","lucide:badge-check","Set the name, the wordmark and the icons, so the site reads as yours rather than as the layer's.",{"title":149,"path":150,"stem":151,"children":152},"Reference","\u002Freference","4.reference",[153,157,161,193,197,203,343,490,611,656,716],{"title":149,"path":150,"stem":154,"icon":155,"description":156},"4.reference\u002Findex","lucide:list","The layer's public surface — config keys, frontmatter, components, composables and endpoints.",{"title":20,"path":158,"stem":159,"icon":23,"description":160},"\u002Freference\u002Fconfiguration","4.reference\u002F1.configuration","Every key under duxt in app.config.ts — what it controls, and when it is read.",{"title":162,"path":163,"stem":164,"children":165,"icon":167,"description":168},"Changelog","\u002Freference\u002Fchangelog","4.reference\u002F10.changelog\u002Findex",[166,169,175,181,187],{"title":162,"path":163,"stem":164,"icon":167,"description":168},"lucide:tag","A release log, published as pages — a timeline, a page per release, and a feed.",{"title":170,"path":171,"stem":172,"icon":173,"description":174},"Declaring the section","\u002Freference\u002Fchangelog\u002Fsection","4.reference\u002F10.changelog\u002F1.section","lucide:file-clock","The `changelog` section type — where the file lives, and the two policies it answers.",{"title":176,"path":177,"stem":178,"icon":179,"description":180},"Granularity","\u002Freference\u002Fchangelog\u002Fgranularity","4.reference\u002F10.changelog\u002F2.granularity","lucide:split","A page per release, or the file as the one page it was written as.",{"title":182,"path":183,"stem":184,"icon":185,"description":186},"What is read","\u002Freference\u002Fchangelog\u002Fwhat-is-read","4.reference\u002F10.changelog\u002F3.what-is-read","lucide:scan-text","Which headings become releases, which become groups, and what happens to the rest.",{"title":188,"path":189,"stem":190,"icon":191,"description":192},"Layout and components","\u002Freference\u002Fchangelog\u002Fcomponents","4.reference\u002F10.changelog\u002F4.components","lucide:box","The layout a split history renders in, and the two MDC components its pages are made of.",{"title":47,"path":194,"stem":195,"icon":50,"description":196},"\u002Freference\u002Fsources","4.reference\u002F2.sources","The fields of a source entry, its refs, and the options that shape the URLs.",{"title":198,"path":199,"stem":200,"icon":201,"description":202},"Frontmatter","\u002Freference\u002Ffrontmatter","4.reference\u002F3.frontmatter","lucide:file-code","The fields a page may carry beyond title and description, and the two the build fills in.",{"title":204,"path":205,"stem":206,"children":207,"icon":209,"description":210},"MDC components","\u002Freference\u002Fmdc-components","4.reference\u002F4.mdc-components\u002Findex",[208,211,217,223,229,235,241,247,253,259,297,303,308,314,320,326,332,338],{"title":204,"path":205,"stem":206,"icon":209,"description":210},"lucide:blocks","The blocks a Markdown page can call, one page each, with their props.",{"title":212,"path":213,"stem":214,"icon":215,"description":216},"Callout","\u002Freference\u002Fmdc-components\u002Fcallout","4.reference\u002F4.mdc-components\u002F1.callout","lucide:message-square-warning","An aside the reader is meant to stop at — a tip, a warning, a danger.",{"title":218,"path":219,"stem":220,"icon":221,"description":222},"Package managers","\u002Freference\u002Fmdc-components\u002Fpackage-managers","4.reference\u002F4.mdc-components\u002F10.package-managers","lucide:package","One command, one tab per package manager, remembered across pages.",{"title":224,"path":225,"stem":226,"icon":227,"description":228},"File tree","\u002Freference\u002Fmdc-components\u002Ffile-tree","4.reference\u002F4.mdc-components\u002F11.file-tree","lucide:folder-tree","A folder structure, with icons per file type.",{"title":230,"path":231,"stem":232,"icon":233,"description":234},"Preview","\u002Freference\u002Fmdc-components\u002Fpreview","4.reference\u002F4.mdc-components\u002F12.preview","lucide:eye","A component rendered as the page renders it, with its source beside it.",{"title":236,"path":237,"stem":238,"icon":239,"description":240},"Page cards","\u002Freference\u002Fmdc-components\u002Fpage-cards","4.reference\u002F4.mdc-components\u002F13.page-cards","lucide:layout-grid","A section's children, as cards.",{"title":242,"path":243,"stem":244,"icon":245,"description":246},"Partial","\u002Freference\u002Fmdc-components\u002Fpartial","4.reference\u002F4.mdc-components\u002F14.partial","lucide:puzzle","A block written once and rendered in every source that needs it.",{"title":248,"path":249,"stem":250,"icon":251,"description":252},"Since","\u002Freference\u002Fmdc-components\u002Fsince","4.reference\u002F4.mdc-components\u002F15.since","lucide:milestone","The version something arrived in, beside a heading.",{"title":254,"path":255,"stem":256,"icon":257,"description":258},"Mermaid","\u002Freference\u002Fmdc-components\u002Fmermaid","4.reference\u002F4.mdc-components\u002F16.mermaid","lucide:workflow","A diagram from a fence or a prop.",{"title":260,"path":261,"stem":262,"children":263,"icon":265,"description":266},"Prose overrides","\u002Freference\u002Fmdc-components\u002Fprose","4.reference\u002F4.mdc-components\u002F17.prose\u002Findex",[264,267,273,279,285,291],{"title":260,"path":261,"stem":262,"icon":265,"description":266},"lucide:type","What the layer changes about plain Markdown — links, headings, images, code and tables.",{"title":268,"path":269,"stem":270,"icon":271,"description":272},"ProseA","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-a","4.reference\u002F4.mdc-components\u002F17.prose\u002F1.prose-a","lucide:link","A link, resolved against the source it was written in.",{"title":274,"path":275,"stem":276,"icon":277,"description":278},"ProseH2, ProseH3, ProseH4","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-headings","4.reference\u002F4.mdc-components\u002F17.prose\u002F2.prose-headings","lucide:heading","Headings, each with a permalink anchor.",{"title":280,"path":281,"stem":282,"icon":283,"description":284},"ProseImg","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-img","4.reference\u002F4.mdc-components\u002F17.prose\u002F3.prose-img","lucide:image","An image: theme-aware, and zoomable.",{"title":286,"path":287,"stem":288,"icon":289,"description":290},"ProsePre","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-pre","4.reference\u002F4.mdc-components\u002F17.prose\u002F4.prose-pre","lucide:terminal","The code block: filename, language icon, copy button.",{"title":292,"path":293,"stem":294,"icon":295,"description":296},"ProseTable","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-table","4.reference\u002F4.mdc-components\u002F17.prose\u002F5.prose-table","lucide:table","A table that scrolls instead of the page.",{"title":298,"path":299,"stem":300,"icon":301,"description":302},"Steps","\u002Freference\u002Fmdc-components\u002Fsteps","4.reference\u002F4.mdc-components\u002F2.steps","lucide:list-ordered","An ordered list drawn as numbered steps on a rail.",{"title":304,"path":305,"stem":306,"icon":201,"description":307},"Code group","\u002Freference\u002Fmdc-components\u002Fcode-group","4.reference\u002F4.mdc-components\u002F3.code-group","Several fences as one tabbed block, labelled by filename.",{"title":309,"path":310,"stem":311,"icon":312,"description":313},"Tab group","\u002Freference\u002Fmdc-components\u002Ftab-group","4.reference\u002F4.mdc-components\u002F4.tab-group","lucide:panels-top-left","Tabs for anything that is not code.",{"title":315,"path":316,"stem":317,"icon":318,"description":319},"Tab","\u002Freference\u002Fmdc-components\u002Ftab","4.reference\u002F4.mdc-components\u002F5.tab","lucide:square","One panel of a tab group.",{"title":321,"path":322,"stem":323,"icon":324,"description":325},"Accordion","\u002Freference\u002Fmdc-components\u002Faccordion","4.reference\u002F4.mdc-components\u002F6.accordion","lucide:chevrons-up-down","Collapsible sections — a FAQ, or answers a reader picks from.",{"title":327,"path":328,"stem":329,"icon":330,"description":331},"Accordion item","\u002Freference\u002Fmdc-components\u002Faccordion-item","4.reference\u002F4.mdc-components\u002F7.accordion-item","lucide:chevron-down","One collapsible section.",{"title":333,"path":334,"stem":335,"icon":336,"description":337},"Field group","\u002Freference\u002Fmdc-components\u002Ffield-group","4.reference\u002F4.mdc-components\u002F8.field-group","lucide:list-tree","A list of fields as one block.",{"title":339,"path":340,"stem":341,"icon":167,"description":342},"Field","\u002Freference\u002Fmdc-components\u002Ffield","4.reference\u002F4.mdc-components\u002F9.field","One parameter, property or option, with its type and default.",{"title":344,"path":345,"stem":346,"children":347,"icon":349,"description":350},"Components","\u002Freference\u002Fcomponents","4.reference\u002F5.components\u002Findex",[348,351,371,412,459],{"title":344,"path":345,"stem":346,"icon":349,"description":350},"lucide:component","The layer's own components, one page each — what each is for, and what it takes.",{"title":352,"path":353,"stem":354,"children":355,"icon":357,"description":358},"Layout","\u002Freference\u002Fcomponents\u002Flayout","4.reference\u002F5.components\u002F1.layout\u002Findex",[356,359,365],{"title":352,"path":353,"stem":354,"icon":357,"description":358},"lucide:layout-panel-top","The two components that frame a page — the navbar and the footer.",{"title":360,"path":361,"stem":362,"icon":363,"description":364},"DuxtHeader","\u002Freference\u002Fcomponents\u002Flayout\u002Fduxt-header","4.reference\u002F5.components\u002F1.layout\u002F1.duxt-header","lucide:panel-top","The navbar: title, navigation, search, and the icon links.",{"title":366,"path":367,"stem":368,"icon":369,"description":370},"DuxtFooter","\u002Freference\u002Fcomponents\u002Flayout\u002Fduxt-footer","4.reference\u002F5.components\u002F1.layout\u002F2.duxt-footer","lucide:panel-bottom","The footer: the site's name, its legal links, and the layer's own line.",{"title":372,"path":373,"stem":374,"children":375,"icon":32,"description":377},"Navigation","\u002Freference\u002Fcomponents\u002Fnavigation","4.reference\u002F5.components\u002F2.navigation\u002Findex",[376,378,384,389,395,401,406],{"title":372,"path":373,"stem":374,"icon":32,"description":377},"Getting around — the section row, the sidebar, the trail, the contents and prev\u002Fnext.",{"title":379,"path":380,"stem":381,"icon":382,"description":383},"DuxtSections","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-sections","4.reference\u002F5.components\u002F2.navigation\u002F1.duxt-sections","lucide:rows-3","The second navbar row — the top-level parts of the documentation.",{"title":385,"path":386,"stem":387,"icon":336,"description":388},"DuxtNavigation","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-navigation","4.reference\u002F5.components\u002F2.navigation\u002F2.duxt-navigation","The sidebar tree.",{"title":390,"path":391,"stem":392,"icon":393,"description":394},"DuxtNavigationLink","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-navigation-link","4.reference\u002F5.components\u002F2.navigation\u002F3.duxt-navigation-link","lucide:link-2","One entry of the sidebar.",{"title":396,"path":397,"stem":398,"icon":399,"description":400},"DuxtBreadcrumb","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-breadcrumb","4.reference\u002F5.components\u002F2.navigation\u002F4.duxt-breadcrumb","lucide:chevrons-right","The trail above the page title.",{"title":402,"path":403,"stem":404,"icon":155,"description":405},"DuxtToc","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-toc","4.reference\u002F5.components\u002F2.navigation\u002F5.duxt-toc","The table of contents, and the aside under it.",{"title":407,"path":408,"stem":409,"icon":410,"description":411},"DuxtPageNav","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-page-nav","4.reference\u002F5.components\u002F2.navigation\u002F6.duxt-page-nav","lucide:arrow-left-right","Previous and next, bounded by the section.",{"title":413,"path":414,"stem":415,"children":416,"icon":418,"description":419},"Controls","\u002Freference\u002Fcomponents\u002Fcontrols","4.reference\u002F5.components\u002F3.controls\u002Findex",[417,420,425,430,436,441,447,453],{"title":413,"path":414,"stem":415,"icon":418,"description":419},"lucide:sliders-horizontal","What a reader operates — search, the switchers, the shortcut sheet, and two indicators.",{"title":421,"path":422,"stem":423,"icon":86,"description":424},"DuxtSearch","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-search","4.reference\u002F5.components\u002F3.controls\u002F1.duxt-search","Search across every source, ranked together.",{"title":426,"path":427,"stem":428,"icon":38,"description":429},"DuxtVersion","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-version","4.reference\u002F5.components\u002F3.controls\u002F2.duxt-version","The version badge, and the switcher when there is more than one.",{"title":431,"path":432,"stem":433,"icon":434,"description":435},"DuxtVersionBanner","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-version-banner","4.reference\u002F5.components\u002F3.controls\u002F3.duxt-version-banner","lucide:triangle-alert","The bar telling a reader this version is not the current one.",{"title":437,"path":438,"stem":439,"icon":92,"description":440},"DuxtLocale","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-locale","4.reference\u002F5.components\u002F3.controls\u002F4.duxt-locale","The language switcher.",{"title":442,"path":443,"stem":444,"icon":445,"description":446},"DuxtProgress","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-progress","4.reference\u002F5.components\u002F3.controls\u002F5.duxt-progress","lucide:loader","How far down the page the reader is.",{"title":448,"path":449,"stem":450,"icon":451,"description":452},"DuxtShortcuts","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-shortcuts","4.reference\u002F5.components\u002F3.controls\u002F6.duxt-shortcuts","lucide:keyboard","The keyboard shortcut sheet, on ?.",{"title":454,"path":455,"stem":456,"icon":457,"description":458},"DuxtSkipLink","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-skip-link","4.reference\u002F5.components\u002F3.controls\u002F7.duxt-skip-link","lucide:skip-forward","The first focusable element on the page.",{"title":460,"path":461,"stem":462,"children":463,"icon":465,"description":466},"Page","\u002Freference\u002Fcomponents\u002Fpage","4.reference\u002F5.components\u002F4.page\u002Findex",[464,467,473,479,484],{"title":460,"path":461,"stem":462,"icon":465,"description":466},"lucide:file-text","The components that belong to the page itself.",{"title":468,"path":469,"stem":470,"icon":471,"description":472},"DuxtPageInfo","\u002Freference\u002Fcomponents\u002Fpage\u002Fduxt-page-info","4.reference\u002F5.components\u002F4.page\u002F1.duxt-page-info","lucide:git-commit-horizontal","Where the page came from: edit link, last updated, contributors.",{"title":474,"path":475,"stem":476,"icon":477,"description":478},"DuxtCopyPage","\u002Freference\u002Fcomponents\u002Fpage\u002Fduxt-copy-page","4.reference\u002F5.components\u002F4.page\u002F2.duxt-copy-page","lucide:clipboard-copy","Hand this page to a model, or read its source.",{"title":480,"path":481,"stem":482,"icon":140,"description":483},"DuxtPageFeedback","\u002Freference\u002Fcomponents\u002Fpage\u002Fduxt-page-feedback","4.reference\u002F5.components\u002F4.page\u002F3.duxt-page-feedback","Was this page helpful?",{"title":485,"path":486,"stem":487,"icon":488,"description":489},"DuxtCodeBlock","\u002Freference\u002Fcomponents\u002Fpage\u002Fduxt-code-block","4.reference\u002F5.components\u002F4.page\u002F4.duxt-code-block","lucide:code","The card around a code block.",{"title":491,"path":492,"stem":493,"children":494,"icon":496,"description":497},"Composables","\u002Freference\u002Fcomposables","4.reference\u002F6.composables\u002Findex",[495,498,532,561],{"title":491,"path":492,"stem":493,"icon":496,"description":497},"lucide:function-square","The functions the layer exposes to your own components, one page each.",{"title":499,"path":500,"stem":501,"children":502,"icon":62,"description":504},"Config and content","\u002Freference\u002Fcomposables\u002Fconfig-and-content","4.reference\u002F6.composables\u002F1.config-and-content\u002Findex",[503,505,510,516,521,527],{"title":499,"path":500,"stem":501,"icon":62,"description":504},"The merged config, and which collection serves the page being read.",{"title":506,"path":507,"stem":508,"icon":23,"description":509},"useDuxtConfig()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-config","4.reference\u002F6.composables\u002F1.config-and-content\u002F1.use-duxt-config","The merged config, every text field already resolved.",{"title":511,"path":512,"stem":513,"icon":514,"description":515},"useDuxtCollection()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-collection","4.reference\u002F6.composables\u002F1.config-and-content\u002F2.use-duxt-collection","lucide:library","Which collection serves this route.",{"title":517,"path":518,"stem":519,"icon":336,"description":520},"useDuxtNavigation()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-navigation","4.reference\u002F6.composables\u002F1.config-and-content\u002F3.use-duxt-navigation","The navigation tree for the collection serving this route.",{"title":522,"path":523,"stem":524,"icon":525,"description":526},"useDuxtSection()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-section","4.reference\u002F6.composables\u002F1.config-and-content\u002F4.use-duxt-section","lucide:folder-open","The part of the documentation this page is in.",{"title":528,"path":529,"stem":530,"icon":399,"description":531},"useDuxtBreadcrumb()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-breadcrumb","4.reference\u002F6.composables\u002F1.config-and-content\u002F5.use-duxt-breadcrumb","The trail from the section down to a page.",{"title":533,"path":534,"stem":535,"children":536,"icon":538,"description":539},"Paths and versions","\u002Freference\u002Fcomposables\u002Fpaths-and-versions","4.reference\u002F6.composables\u002F2.paths-and-versions\u002Findex",[537,540,545,550,555],{"title":533,"path":534,"stem":535,"icon":538,"description":539},"lucide:route","Reading a URL, writing one back out, and knowing which version is being read.",{"title":541,"path":542,"stem":543,"icon":251,"description":544},"useDuxtPath()","\u002Freference\u002Fcomposables\u002Fpaths-and-versions\u002Fuse-duxt-path","4.reference\u002F6.composables\u002F2.paths-and-versions\u002F1.use-duxt-path","The path the documentation is at, locale stripped.",{"title":546,"path":547,"stem":548,"icon":271,"description":549},"useDuxtLink()","\u002Freference\u002Fcomposables\u002Fpaths-and-versions\u002Fuse-duxt-link","4.reference\u002F6.composables\u002F2.paths-and-versions\u002F2.use-duxt-link","A documentation path, written back out as a link.",{"title":551,"path":552,"stem":553,"icon":38,"description":554},"useDuxtVersion()","\u002Freference\u002Fcomposables\u002Fpaths-and-versions\u002Fuse-duxt-version","4.reference\u002F6.composables\u002F2.paths-and-versions\u002F3.use-duxt-version","What the switcher shows, what the banner says, whether to index.",{"title":556,"path":557,"stem":558,"icon":559,"description":560},"useDuxtSiteUrl()","\u002Freference\u002Fcomposables\u002Fpaths-and-versions\u002Fuse-duxt-site-url","4.reference\u002F6.composables\u002F2.paths-and-versions\u002F4.use-duxt-site-url","lucide:globe","The configured origin, and paths made absolute.",{"title":562,"path":563,"stem":564,"children":565,"icon":101,"description":567},"Reading experience","\u002Freference\u002Fcomposables\u002Freading","4.reference\u002F6.composables\u002F3.reading\u002Findex",[566,568,572,578,583,589,595,600,606],{"title":562,"path":563,"stem":564,"icon":101,"description":567},"Search, headings, focus, history, and the choices a reader makes.",{"title":569,"path":570,"stem":571,"icon":86,"description":424},"useDuxtSearch()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-search","4.reference\u002F6.composables\u002F3.reading\u002F1.use-duxt-search",{"title":573,"path":574,"stem":575,"icon":576,"description":577},"useFuzzySearch()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-fuzzy-search","4.reference\u002F6.composables\u002F3.reading\u002F2.use-fuzzy-search","lucide:spell-check","Typo tolerance beside the exact index.",{"title":579,"path":580,"stem":581,"icon":277,"description":582},"useActiveHeading()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-active-heading","4.reference\u002F6.composables\u002F3.reading\u002F3.use-active-heading","The heading currently in view.",{"title":584,"path":585,"stem":586,"icon":587,"description":588},"useDuxtPageFocus()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-page-focus","4.reference\u002F6.composables\u002F3.reading\u002F4.use-duxt-page-focus","lucide:focus","Moves focus to the heading after a client-side navigation.",{"title":590,"path":591,"stem":592,"icon":593,"description":594},"useRecentPages()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-recent-pages","4.reference\u002F6.composables\u002F3.reading\u002F5.use-recent-pages","lucide:history","The last five pages this reader opened.",{"title":596,"path":597,"stem":598,"icon":221,"description":599},"usePackageManager()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-package-manager","4.reference\u002F6.composables\u002F3.reading\u002F6.use-package-manager","The package manager a reader picked.",{"title":601,"path":602,"stem":603,"icon":604,"description":605},"useDuxtToast()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-toast","4.reference\u002F6.composables\u002F3.reading\u002F7.use-duxt-toast","lucide:bell","Notifications, wrapped so no component imports the library.",{"title":607,"path":608,"stem":609,"icon":451,"description":610},"useDuxtShortcuts()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-shortcuts","4.reference\u002F6.composables\u002F3.reading\u002F8.use-duxt-shortcuts","The keys the theme listens to.",{"title":612,"path":613,"stem":614,"children":615,"icon":538,"description":617},"Endpoints","\u002Freference\u002Fendpoints","4.reference\u002F7.endpoints\u002Findex",[616,618,623,629,634,639,644,650],{"title":612,"path":613,"stem":614,"icon":538,"description":617},"Everything the site serves besides pages, one page each.",{"title":619,"path":620,"stem":621,"icon":465,"description":622},"\u002Fllms.txt","\u002Freference\u002Fendpoints\u002Fllms-txt","4.reference\u002F7.endpoints\u002F1.llms-txt","The documentation as a Markdown index, per llmstxt.org.",{"title":624,"path":625,"stem":626,"icon":627,"description":628},"\u002Fllms-full.txt","\u002Freference\u002Fendpoints\u002Fllms-full-txt","4.reference\u002F7.endpoints\u002F2.llms-full-txt","lucide:file-stack","The same pages, whole, in one Markdown file.",{"title":630,"path":631,"stem":632,"icon":201,"description":633},"\u003Cpage>.md","\u002Freference\u002Fendpoints\u002Fpage-markdown","4.reference\u002F7.endpoints\u002F3.page-markdown","Any page source, at its own URL plus .md.",{"title":635,"path":636,"stem":637,"icon":80,"description":638},"\u002Fmcp","\u002Freference\u002Fendpoints\u002Fmcp","4.reference\u002F7.endpoints\u002F4.mcp","An MCP server over the same content.",{"title":640,"path":641,"stem":642,"icon":86,"description":643},"\u002Fsitemap.xml and \u002Frobots.txt","\u002Freference\u002Fendpoints\u002Fsitemap-and-robots","4.reference\u002F7.endpoints\u002F5.sitemap-and-robots","What a crawler is pointed at, and what it is kept out of.",{"title":645,"path":646,"stem":647,"icon":648,"description":649},"\u002Frss.xml","\u002Freference\u002Fendpoints\u002Frss-xml","4.reference\u002F7.endpoints\u002F6.rss-xml","lucide:rss","The feed, once a section is named.",{"title":651,"path":652,"stem":653,"icon":654,"description":655},"\u002F_duxt\u002Fdevtools","\u002Freference\u002Fendpoints\u002Fdevtools","4.reference\u002F7.endpoints\u002F7.devtools","lucide:wrench","The route the Nuxt Devtools panel is served from. Dev only.",{"title":657,"path":658,"stem":659,"children":660,"icon":654,"description":662},"Devtools","\u002Freference\u002Fdevtools","4.reference\u002F8.devtools\u002Findex",[661,663,667,672,677,683,689,695,700,705,710],{"title":657,"path":658,"stem":659,"icon":654,"description":662},"Ten panels that show what your sources became. Dev only.",{"title":47,"path":664,"stem":665,"icon":514,"description":666},"\u002Freference\u002Fdevtools\u002Fsources","4.reference\u002F8.devtools\u002F1.sources","What `duxt.sources` became — one collection per source, version and language.",{"title":668,"path":669,"stem":670,"icon":128,"description":671},"Redirects","\u002Freference\u002Fdevtools\u002Fredirects","4.reference\u002F8.devtools\u002F10.redirects","Every redirect the server ships, and which of them the layer wrote.",{"title":673,"path":674,"stem":675,"icon":538,"description":676},"Paths","\u002Freference\u002Fdevtools\u002Fpaths","4.reference\u002F8.devtools\u002F2.paths","Paste a URL, see which source claims it and what it finds there.",{"title":678,"path":679,"stem":680,"icon":681,"description":682},"Pages","\u002Freference\u002Fdevtools\u002Fpages","4.reference\u002F8.devtools\u002F3.pages","lucide:files","Every page of every collection, with its frontmatter and git metadata.",{"title":684,"path":685,"stem":686,"icon":687,"description":688},"Versions","\u002Freference\u002Fdevtools\u002Fversions","4.reference\u002F8.devtools\u002F4.versions","lucide:columns-3","Which version — and which language — carries which page.",{"title":690,"path":691,"stem":692,"icon":693,"description":694},"Checks","\u002Freference\u002Fdevtools\u002Fchecks","4.reference\u002F8.devtools\u002F5.checks","lucide:check-check","The build validator, run against what the site is serving now.",{"title":696,"path":697,"stem":698,"icon":86,"description":699},"Search","\u002Freference\u002Fdevtools\u002Fsearch","4.reference\u002F8.devtools\u002F6.search","What the search index holds, through the same query the dialog runs.",{"title":701,"path":702,"stem":703,"icon":418,"description":704},"Config","\u002Freference\u002Fdevtools\u002Fconfig","4.reference\u002F8.devtools\u002F7.config","The merged `duxt` config, and which side of the merge each value came from.",{"title":706,"path":707,"stem":708,"icon":92,"description":709},"i18n","\u002Freference\u002Fdevtools\u002Fi18n","4.reference\u002F8.devtools\u002F8.i18n","Message keys per locale, against the base language.",{"title":711,"path":712,"stem":713,"icon":714,"description":715},"Cache","\u002Freference\u002Fdevtools\u002Fcache","4.reference\u002F8.devtools\u002F9.cache","lucide:hard-drive","Content's download cache, and a way to drop one entry.",{"title":717,"path":718,"stem":719,"children":720,"icon":722,"description":723},"API reference","\u002Freference\u002Fopenapi","4.reference\u002F9.openapi\u002Findex",[721,724,728,732,738],{"title":717,"path":718,"stem":719,"icon":722,"description":723},"lucide:plug","An OpenAPI document, published as reference pages with a client that sends real requests.",{"title":170,"path":725,"stem":726,"icon":201,"description":727},"\u002Freference\u002Fopenapi\u002Fsection","4.reference\u002F9.openapi\u002F1.section","The `openapi` section type — where the document lives, and what it becomes.",{"title":344,"path":729,"stem":730,"icon":191,"description":731},"\u002Freference\u002Fopenapi\u002Fcomponents","4.reference\u002F9.openapi\u002F2.components","The three MDC components a generated reference page is made of.",{"title":733,"path":734,"stem":735,"icon":736,"description":737},"The try-it client","\u002Freference\u002Fopenapi\u002Ftry-it","4.reference\u002F9.openapi\u002F3.try-it","lucide:send","A real request, sent by the reader's own browser.",{"title":739,"path":740,"stem":741,"icon":488,"description":742},"Request samples","\u002Freference\u002Fopenapi\u002Frequest-samples","4.reference\u002F9.openapi\u002F4.request-samples","The same request in twelve clients, and how to add your own.",{"title":744,"path":745,"stem":746,"children":747,"icon":749,"description":750},"Credits","\u002Fcredits","5.credits\u002Findex",[748],{"title":744,"path":745,"stem":746,"icon":749,"description":750},"lucide:heart","What duxt is built on, and what it was built after.",{"title":752,"path":753,"stem":754,"children":755},"Conventions","\u002Fconventions","6.conventions",[756,760,766],{"title":752,"path":753,"stem":757,"icon":758,"description":759},"6.conventions\u002Findex","lucide:ruler","Project-specific rules — the ones a reader could not infer from the code.",{"title":761,"path":762,"stem":763,"icon":764,"description":765},"Branding","\u002Fconventions\u002Fbranding","6.conventions\u002F1.branding","lucide:shapes","The [d]uxt mark — where each asset is used, why the icon's brackets are redrawn, and the colours that are fixed.",{"title":767,"path":768,"stem":769,"icon":283,"description":770},"Icons","\u002Fconventions\u002Ficons","6.conventions\u002F2.icons","Four icon sets, and the one question that decides which of them draws a given mark.",{"title":772,"path":773,"stem":774,"children":775},"Architecture decisions","\u002Fadr","99.adr",[776,780,786,791,796,801,806,811,816,821],{"title":772,"path":773,"stem":777,"icon":778,"description":779},"99.adr\u002Findex","lucide:gavel","The decision log — every architecture decision recorded for duxt.",{"title":781,"path":782,"stem":783,"icon":784,"description":785},"Build duxt as a layer carrying a module","\u002Fadr\u002F0001-build-duxt-as-a-layer-carrying-a-module","99.adr\u002F0001-build-duxt-as-a-layer-carrying-a-module",null,"Distribute the theme as a Nuxt layer whose root is the package, rather than as a starter template.",{"title":787,"path":788,"stem":789,"icon":784,"description":790},"Generate the collections from one source list","\u002Fadr\u002F0002-generate-the-collections-from-one-source-list","99.adr\u002F0002-generate-the-collections-from-one-source-list","Compute Content collections from a compact sources list at config load time instead of having consumers declare them.",{"title":792,"path":793,"stem":794,"icon":784,"description":795},"Decide the URL prefixes at build time","\u002Fadr\u002F0003-decide-the-url-prefixes-at-build-time","99.adr\u002F0003-decide-the-url-prefixes-at-build-time","Whether a repository or version segment appears is settled by the source list before the first request, never per request.",{"title":797,"path":798,"stem":799,"icon":784,"description":800},"Render Markdown components with MDC","\u002Fadr\u002F0004-render-markdown-components-with-mdc","99.adr\u002F0004-render-markdown-components-with-mdc","Use Content's own MDC syntax for components inside Markdown rather than adopting MDX.",{"title":802,"path":803,"stem":804,"icon":784,"description":805},"Ship the layer without owner-specific links","\u002Fadr\u002F0005-ship-the-layer-without-owner-specific-links","99.adr\u002F0005-ship-the-layer-without-owner-specific-links","Every default that would name a specific project — repository, issue tracker, community, imprint — ships empty.",{"title":807,"path":808,"stem":809,"icon":784,"description":810},"Rebuild on a schedule rather than refresh at runtime","\u002Fadr\u002F0006-rebuild-on-a-schedule-rather-than-refresh-at-runtime","99.adr\u002F0006-rebuild-on-a-schedule-rather-than-refresh-at-runtime","A site reading another repository picks up its changes when it builds, and no runtime refresh is offered.",{"title":812,"path":813,"stem":814,"icon":784,"description":815},"Serve translations as collections of their own","\u002Fadr\u002F0007-serve-translations-as-collections-of-their-own","99.adr\u002F0007-serve-translations-as-collections-of-their-own","Add a locale dimension to a source rather than a locale segment to the content path.",{"title":817,"path":818,"stem":819,"icon":784,"description":820},"Build the theme on owned shadcn-vue components","\u002Fadr\u002F0008-build-the-theme-on-owned-shadcn-vue-components","99.adr\u002F0008-build-the-theme-on-owned-shadcn-vue-components","The layer holds the source of its interface components rather than importing them from a component library or a ready-made documentation theme.",{"title":822,"path":823,"stem":824,"icon":784,"description":825},"Take the SEO stack from the Nuxt SEO bundle","\u002Fadr\u002F0009-take-the-seo-stack-from-the-nuxt-seo-bundle","99.adr\u002F0009-take-the-seo-stack-from-the-nuxt-seo-bundle","The layer installs @nuxtjs\u002Fseo and hands it the head tags and structured data it used to write by hand, keeping only the rules that depend on versions and translations.",{"title":827,"path":828,"stem":829,"icon":830,"description":831},"Documentation","\u002F","index","lucide:book-open-text","A Nuxt layer that turns a repository's docs folder into a versioned, multi-repo documentation site.",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":836},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09\"\u002F>\u003Cpath d=\"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z\"\u002F>\u003Cpath d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":838},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m16.24 7.76l-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":840},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 5v16m8.001-2A2 2 0 0 0 22 17V5a2 2 0 0 0-1.999-2L16 3.002A5 5 0 0 0 12 5a5 5 0 0 0-4-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 1.999 2H8a5 5 0 0 1 4 2a5 5 0 0 1 4-2z\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":842},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Zm-6.8-2.8l2-2m-5-1l2-2m-5-1l2-2m7 11l2-2\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":844},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m14 13l-8.381 8.38a1 1 0 0 1-3.001-3l8.384-8.381M16 16l6-6m-.5.5l-8-8M8 8l6-6M8.5 7.5l8 8\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":846},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 5h.01M3 12h.01M3 19h.01M8 5h13M8 12h13M8 19h13\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":848},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0a2.34 2.34 0 0 0 3.319 1.915a2.34 2.34 0 0 1 2.33 4.033a2.34 2.34 0 0 0 0 3.831a2.34 2.34 0 0 1-2.33 4.033a2.34 2.34 0 0 0-3.319 1.915a2.34 2.34 0 0 1-4.659 0a2.34 2.34 0 0 0-3.32-1.915a2.34 2.34 0 0 1-2.33-4.033a2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\"\u002F>\u003Ccircle cx=\"12\" cy=\"12\" r=\"3\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":850},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\"\u002F>\u003Ccircle cx=\"7.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":852},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M16 22h2a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v2.85\"\u002F>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5M8 14v2.2l1.6 1\"\u002F>\u003Ccircle cx=\"8\" cy=\"16\" r=\"6\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":854},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M16 3h5v5M8 3H3v5\"\u002F>\u003Cpath d=\"M12 22v-8.3a4 4 0 0 0-1.172-2.872L3 3m12 6l6-6\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":856},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 7V5a2 2 0 0 1 2-2h2m10 0h2a2 2 0 0 1 2 2v2m0 10v2a2 2 0 0 1-2 2h-2M7 21H5a2 2 0 0 1-2-2v-2m4-9h8m-8 4h10M7 16h6\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":858},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"\u002F>\u003Cpath d=\"m3.3 7l8.7 5l8.7-5M12 22V12\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":860},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M15 6a9 9 0 0 0-9 9V3\"\u002F>\u003Ccircle cx=\"18\" cy=\"6\" r=\"3\"\u002F>\u003Ccircle cx=\"6\" cy=\"18\" r=\"3\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":862},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"\u002F>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5m-10 4.5L8 15l2 2.5m4-5l2 2.5l-2 2.5\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":864},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2\"\u002F>\u003Crect width=\"8\" height=\"8\" x=\"14\" y=\"2\" rx=\"1\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":866},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.536 11.293a1 1 0 0 0 0 1.414l2.376 2.377a1 1 0 0 0 1.414 0l2.377-2.377a1 1 0 0 0 0-1.414l-2.377-2.377a1 1 0 0 0-1.414 0zm-13.239 0a1 1 0 0 0 0 1.414l2.377 2.377a1 1 0 0 0 1.414 0l2.377-2.377a1 1 0 0 0 0-1.414L6.088 8.916a1 1 0 0 0-1.414 0zm6.619 6.619a1 1 0 0 0 0 1.415l2.377 2.376a1 1 0 0 0 1.414 0l2.377-2.376a1 1 0 0 0 0-1.415l-2.377-2.376a1 1 0 0 0-1.414 0zm0-13.238a1 1 0 0 0 0 1.414l2.377 2.376a1 1 0 0 0 1.414 0l2.377-2.376a1 1 0 0 0 0-1.414l-2.377-2.377a1 1 0 0 0-1.414 0z\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":868},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M9 17c2 0 2.8-1 2.8-2.8V10c0-2 1-3.3 3.2-3m-6 4.2h5.7\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":870},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"6\" cy=\"19\" r=\"3\"\u002F>\u003Cpath d=\"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\"\u002F>\u003Ccircle cx=\"18\" cy=\"5\" r=\"3\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":872},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":874},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 22v-5m3-9V2m2 6a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1zM9 8V2\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":876},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m9 18l6-6l-6-6\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":878},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":880},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":882},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"\u002F>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":884},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":833,"top":833,"width":886,"height":887,"rotate":833,"vFlip":835,"hFlip":835,"body":888},640,480,"\u003Cpath fill=\"#012169\" d=\"M0 0h640v480H0z\"\u002F>\u003Cpath fill=\"#fff\" d=\"m75 0l244 181L562 0h78v62L400 241l240 178v61h-80L320 301L81 480H0v-60l239-178L0 64V0z\"\u002F>\u003Cpath fill=\"#c8102e\" d=\"m424 281l216 159v40L369 281zm-184 20l6 35L54 480H0zM640 0v3L391 191l2-44L590 0zM0 0l239 176h-60L0 42z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M241 0v480h160V0zM0 160v160h640V160z\"\u002F>\u003Cpath fill=\"#c8102e\" d=\"M0 193v96h640v-96zM273 0v480h96V0z\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":890},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"page":892,"from":1294,"asked":1294},{"id":893,"title":188,"body":894,"compare":784,"contributors":1284,"date":784,"description":192,"extension":1287,"icon":191,"lastUpdated":1288,"layout":784,"meta":1289,"navigation":835,"path":189,"rawbody":1290,"redirectFrom":784,"seo":1291,"sitemap":1292,"stem":190,"__hash__":1293},"docs\u002F4.reference\u002F10.changelog\u002F4.components.md",{"type":895,"value":896,"toc":1274},"minimark",[897,906,913,924,940,943,953,957,960,1011,1026,1036,1051,1074,1081,1100,1118,1125,1129,1132,1174,1184,1195,1209,1219,1223,1226,1232,1235,1239,1253,1260,1263,1267],[898,899,900,901,905],"p",{},"The ",[902,903,904],"code",{},"changelog"," type writes ordinary Markdown pages whose bodies are two MDC\ncomponents, rendered inside a layout of its own. All three are documented because\nthey are part of the public surface — a consumer can override any of them — not\nbecause a page has to be written by hand.",[907,908,900,910,912],"h2",{"id":909},"the-changelog-layout",[902,911,904],{}," layout",[898,914,915,916,923],{},"Bound by the ",[917,918,919,922],"a",{"href":177},[902,920,921],{},"split"," granularity"," only; a flat\nchangelog is an ordinary docs page and renders in the docs chrome.",[898,925,926,927,930,931,935,936,939],{},"It differs from ",[902,928,929],{},"docs"," in two ways, and both follow from what the pages are. The\n",[932,933,934],"strong",{},"sidebar is the release list"," rather than a prose tree — same navigation, same\ncollection, because a generated section is an ordinary collection and its pages\nare the releases. And the ",[932,937,938],{},"reading column is capped at a measure",": a release\nnote is prose, and prose set across the full window is unreadable. The contents\ncolumn stays, listing the groups.",[898,941,942],{},"Replace it with a file of your own at the same path:",[944,945,950],"pre",{"className":946,"code":948,"language":949},[947],"language-text","app\u002Flayouts\u002Fchangelog.vue\n","text",[902,951,948],{"__ignoreMap":952},"",[907,954,956],{"id":955},"changelogreleases","ChangelogReleases",[898,958,959],{},"The overview's timeline: every release, newest first, filterable by what changed.\nWritten onto the section's index page.",[961,962,963,980],"table",{},[964,965,966],"thead",{},[967,968,969,974,977],"tr",{},[970,971,973],"th",{"align":972},"left","Prop",[970,975,976],{"align":972},"Type",[970,978,979],{"align":972},"Notes",[981,982,983],"tbody",{},[967,984,985,991,994],{},[986,987,988],"td",{"align":972},[902,989,990],{},"releases",[986,992,993],{"align":972},"array",[986,995,996,997,1000,1001,1000,1004,1007,1008],{"align":972},"Each with ",[902,998,999],{},"version",", ",[902,1002,1003],{},"date",[902,1005,1006],{},"to"," and its ",[902,1009,1010],{},"groups",[898,1012,1013,1014,1017,1018,1021,1022,1025],{},"The history opens on ",[932,1015,1016],{},"four figures"," — releases, changes, kinds of change, and\nthe day the last one shipped — each a number with a small labelled line under\nit, as on the landing page — but laid out as a ",[932,1019,1020],{},"four-column grid across the full\nwidth"," rather than a wrapping row, so they read as the header of the list under\nthem instead of as a caption with a hole beside it. The kinds are counted over the names\nthe file used, so it is the file's own vocabulary being counted; the date is the\nonly one that is not a count, and it is dropped rather than dashed where the file\ndates nothing. It answers what a list of rows cannot, which is how much there is. The\nfigures count ",[932,1023,1024],{},"what is shown",", so a filtered page's numbers are about the\nfiltered page, with the total kept beside the first one.",[898,1027,900,1028,1031,1032,1035],{},[932,1029,1030],{},"label carries the accent",", not the figure: ",[902,1033,1034],{},"--primary"," is the one colour a\nconsuming site sets to make the theme its own, and two short labelled lines are\nwhere it costs nothing.",[898,1037,1038,1039,1042,1043,1046,1047,1050],{},"Below them every release is ",[932,1040,1041],{},"one line in columns"," — version, badge, what it\ncarried, date — so the versions sit line under line and the summaries start at the same\nx. Under ",[902,1044,1045],{},"sm"," the summary drops to a second line; nothing scrolls sideways. The\ncurrent release says it is current with a badge beside the version — a badge is\nabout the version, so it sits with it — in a ",[932,1048,1049],{},"fixed track that exists whether or\nnot a row fills it",", so the releases without one start their summary exactly where\nthe one with it does. The date sits at the far end beside the arrow: it is the\nfield a reader scans down rather than reads across.",[898,1052,1053,1054,1057,1058,1061,1062,1065,1066,1069,1070,1073],{},"Filtering ",[932,1055,1056],{},"animates on both sides"," — the chips that appear above the list and the\nrows that move below it, at the same timings, so the two read as one gesture. Rows\nfade and settle over 200 ms, a leaving row is taken\nout of the flow so the ones under it close the gap while it goes, and the\nbrowser's own FLIP moves the survivors. It is a ",[902,1059,1060],{},"TransitionGroup",", not a motion\nlibrary — a fade and a nudge are not worth a runtime dependency in every site that\nextends the layer — and every part of it is off under ",[902,1063,1064],{},"prefers-reduced-motion",". A row names the ",[932,1067,1068],{},"three largest\ngroups and counts the rest",": \"Features 2 · Bug Fixes 2 · Documentation 1 · and 9\nmore\". Three, ",[932,1071,1072],{},"by count"," rather than by the order the file wrote them, because\nrelease-please's section order is fixed and means nothing. Nothing is dropped\nsilently, and a filtered row names what it was filtered by first.",[898,1075,1076,1077,1080],{},"The tone is ",[932,1078,1079],{},"not"," in the history. It stays where it distinguishes rather than\ndecorates: the filter menu, and the label a release page heads each group with.",[898,1082,1083,1084,1087,1088,1091,1092,1095,1096,1099],{},"A ",[932,1085,1086],{},"mark in front of a name is drawn away"," wherever a name is shown — the ",[902,1089,1090],{},"⚠","\nrelease-please prefixes its breaking block with, an emoji a hand-kept changelog\nopens a section with. Leading only, so ",[902,1093,1094],{},"C++ Support"," survives. The stored name\nstays whole: the filter matches on it, the anchor is slugified from it, and the\nprops carry it, which is why the mark is dropped in the drawing rather than in the\nparser. See ",[902,1097,1098],{},"changelogLabel",".",[898,1101,1102,1103,1105,1106,1109,1110,1113,1114,1117],{},"A release's ",[902,1104,1010],{}," carry a ",[902,1107,1108],{},"name"," and a ",[902,1111,1112],{},"count"," only — the entries are not\nhere, because each release has a page of its own and repeating its bullets would\nput the whole history twice into the search index, ",[902,1115,1116],{},"llms-full.txt"," and the feed.",[898,1119,1120,1121,1124],{},"The filter chips are built from the names the file itself used. With nothing\nselected the page shows ",[932,1122,1123],{},"everything",", which is also what the server renders: a\nfilter is a reader's choice, so the page has to be complete before anyone makes\none — otherwise the crawler and the reader whose hydration has not landed are\neach shown a filtered changelog nobody asked for.",[907,1126,1128],{"id":1127},"changeloggroup","ChangelogGroup",[898,1130,1131],{},"One group of one release — \"Features\", \"Bug Fixes\", whatever the file said.",[961,1133,1134,1144],{},[964,1135,1136],{},[967,1137,1138,1140,1142],{},[970,1139,973],{"align":972},[970,1141,976],{"align":972},[970,1143,979],{"align":972},[981,1145,1146,1160],{},[967,1147,1148,1152,1157],{},[986,1149,1150],{"align":972},[902,1151,1108],{},[986,1153,1154],{"align":972},[902,1155,1156],{},"string",[986,1158,1159],{"align":972},"The file's own heading, verbatim",[967,1161,1162,1166,1171],{},[986,1163,1164],{"align":972},[902,1165,1112],{},[986,1167,1168],{"align":972},[902,1169,1170],{},"number",[986,1172,1173],{"align":972},"How many entries the group lists",[898,1175,1176,1177,1180,1181,1183],{},"The entries arrive in the ",[932,1178,1179],{},"slot, as the Markdown they were written as"," — so the\nsearch indexes them, ",[902,1182,1116],{}," carries them and the copy control hands a\nmodel prose rather than a component call. Only the name and the count, which the\nbadge and the filters need as data, travel as props.",[898,1185,1186,1187,1190,1191,1194],{},"The name is a ",[932,1188,1189],{},"label, not a headline",": set small, upper-case and in the group's\nown tone, above a list that closes up under it. As a 20-pixel heading it claimed\nthe weight of a chapter for a word naming four bullet points, and six of them read\nas six sections rather than as one release. It is still an ",[902,1192,1193],{},"\u003Ch2>"," — the outline,\nthe contents column and the anchor are unchanged, and only its setting says what\nit is worth.",[898,1196,1197,1198,1201,1202,1204,1205,1208],{},"The colour is a ",[932,1199,1200],{},"hint and never a meaning",": a name the hint list does not know\nstill gets a stable colour of its own, which is what makes the same kind of change\nscannable down a page of forty releases in any language. The label takes the\ntone's ",[902,1203,949],{}," pair rather than the ",[902,1206,1207],{},"dot"," fill, because a run of words and a\nsix-pixel dot do not clear contrast at the same lightness.",[898,1210,900,1211,1214,1215,1218],{},[932,1212,1213],{},"entries' own markers stay grey."," The colour is already stated in the label\ndirectly above them; repeated on every line it stops being a signal. They are set\nfrom ",[902,1216,1217],{},"duxt.css",", not from this component, because they arrive as Markdown through\nthe slot.",[907,1220,1222],{"id":1221},"overriding-one","Overriding one",[898,1224,1225],{},"Same as any other component the layer ships: a file at the same path in the\nconsuming site wins.",[944,1227,1230],{"className":1228,"code":1229,"language":949},[947],"app\u002Fcomponents\u002Fcontent\u002FChangelogGroup.vue\n",[902,1231,1229],{"__ignoreMap":952},[898,1233,1234],{},"The props above are the contract, and so is the layout's name. A rename here is a\nbreaking change of the layer.",[907,1236,1238],{"id":1237},"what-a-release-page-shows-besides-its-groups","What a release page shows besides its groups",[898,1240,1241,1242,1245,1246,1248,1249,1252],{},"Nothing in the body. The day a release was cut and the ",[932,1243,1244],{},"diff it was cut from","\ntravel as ",[902,1247,1003],{}," and ",[902,1250,1251],{},"compare"," in the page's frontmatter, and are drawn where the\nsite already answers where a page came from: the provenance block under the\ncontents column, above \"Edit this page\".",[898,1254,1255,1256,1259],{},"The release date ",[932,1257,1258],{},"replaces"," the last-commit line rather than joining it — every\nrelease of a changelog lives in one file, so its last commit dates all of them the\nsame day, which is at best the newest one's.",[898,1261,1262],{},"A release page therefore reads like every other Markdown page on the site, which\nis the point: a release note is prose, not a dashboard.",[907,1264,1266],{"id":1265},"no-heading-of-its-own","No heading of its own",[898,1268,1269,1270,1273],{},"Neither component opens on an ",[902,1271,1272],{},"\u003Ch1>",". The docs shell draws the header —\nbreadcrumb, title, the copy control beside it — for every generated page whose\nbody opens on no heading, and a release page wants exactly that: a title and a\ntrail like any written page.",{"title":952,"searchDepth":1275,"depth":1275,"links":1276},2,[1277,1279,1280,1281,1282,1283],{"id":909,"depth":1275,"text":1278},"The changelog layout",{"id":955,"depth":1275,"text":956},{"id":1127,"depth":1275,"text":1128},{"id":1221,"depth":1275,"text":1222},{"id":1237,"depth":1275,"text":1238},{"id":1265,"depth":1275,"text":1266},[1285],{"name":1286,"commits":1275},"Titus Kirch","md","2026-09-09T17:10:49+02:00",{},"---\ntitle: Layout and components\ndescription: The layout a split history renders in, and the two MDC components its pages are made of.\nicon: lucide:box\n---\n\nThe `changelog` type writes ordinary Markdown pages whose bodies are two MDC\ncomponents, rendered inside a layout of its own. All three are documented because\nthey are part of the public surface — a consumer can override any of them — not\nbecause a page has to be written by hand.\n\n## The `changelog` layout\n\nBound by the [`split` granularity](\u002Freference\u002Fchangelog\u002Fgranularity) only; a flat\nchangelog is an ordinary docs page and renders in the docs chrome.\n\nIt differs from `docs` in two ways, and both follow from what the pages are. The\n**sidebar is the release list** rather than a prose tree — same navigation, same\ncollection, because a generated section is an ordinary collection and its pages\nare the releases. And the **reading column is capped at a measure**: a release\nnote is prose, and prose set across the full window is unreadable. The contents\ncolumn stays, listing the groups.\n\nReplace it with a file of your own at the same path:\n\n```\napp\u002Flayouts\u002Fchangelog.vue\n```\n\n## ChangelogReleases\n\nThe overview's timeline: every release, newest first, filterable by what changed.\nWritten onto the section's index page.\n\n| Prop       | Type  | Notes                                             |\n| :--------- | :---- | :------------------------------------------------ |\n| `releases` | array | Each with `version`, `date`, `to` and its `groups` |\n\nThe history opens on **four figures** — releases, changes, kinds of change, and\nthe day the last one shipped — each a number with a small labelled line under\nit, as on the landing page — but laid out as a **four-column grid across the full\nwidth** rather than a wrapping row, so they read as the header of the list under\nthem instead of as a caption with a hole beside it. The kinds are counted over the names\nthe file used, so it is the file's own vocabulary being counted; the date is the\nonly one that is not a count, and it is dropped rather than dashed where the file\ndates nothing. It answers what a list of rows cannot, which is how much there is. The\nfigures count **what is shown**, so a filtered page's numbers are about the\nfiltered page, with the total kept beside the first one.\n\nThe **label carries the accent**, not the figure: `--primary` is the one colour a\nconsuming site sets to make the theme its own, and two short labelled lines are\nwhere it costs nothing.\n\nBelow them every release is **one line in columns** — version, badge, what it\ncarried, date — so the versions sit line under line and the summaries start at the same\nx. Under `sm` the summary drops to a second line; nothing scrolls sideways. The\ncurrent release says it is current with a badge beside the version — a badge is\nabout the version, so it sits with it — in a **fixed track that exists whether or\nnot a row fills it**, so the releases without one start their summary exactly where\nthe one with it does. The date sits at the far end beside the arrow: it is the\nfield a reader scans down rather than reads across.\n\nFiltering **animates on both sides** — the chips that appear above the list and the\nrows that move below it, at the same timings, so the two read as one gesture. Rows\nfade and settle over 200 ms, a leaving row is taken\nout of the flow so the ones under it close the gap while it goes, and the\nbrowser's own FLIP moves the survivors. It is a `TransitionGroup`, not a motion\nlibrary — a fade and a nudge are not worth a runtime dependency in every site that\nextends the layer — and every part of it is off under `prefers-reduced-motion`. A row names the **three largest\ngroups and counts the rest**: \"Features 2 · Bug Fixes 2 · Documentation 1 · and 9\nmore\". Three, **by count** rather than by the order the file wrote them, because\nrelease-please's section order is fixed and means nothing. Nothing is dropped\nsilently, and a filtered row names what it was filtered by first.\n\nThe tone is **not** in the history. It stays where it distinguishes rather than\ndecorates: the filter menu, and the label a release page heads each group with.\n\nA **mark in front of a name is drawn away** wherever a name is shown — the `⚠`\nrelease-please prefixes its breaking block with, an emoji a hand-kept changelog\nopens a section with. Leading only, so `C++ Support` survives. The stored name\nstays whole: the filter matches on it, the anchor is slugified from it, and the\nprops carry it, which is why the mark is dropped in the drawing rather than in the\nparser. See `changelogLabel`.\n\nA release's `groups` carry a `name` and a `count` only — the entries are not\nhere, because each release has a page of its own and repeating its bullets would\nput the whole history twice into the search index, `llms-full.txt` and the feed.\n\nThe filter chips are built from the names the file itself used. With nothing\nselected the page shows **everything**, which is also what the server renders: a\nfilter is a reader's choice, so the page has to be complete before anyone makes\none — otherwise the crawler and the reader whose hydration has not landed are\neach shown a filtered changelog nobody asked for.\n\n## ChangelogGroup\n\nOne group of one release — \"Features\", \"Bug Fixes\", whatever the file said.\n\n| Prop    | Type     | Notes                                        |\n| :------ | :------- | :-------------------------------------------- |\n| `name`  | `string` | The file's own heading, verbatim              |\n| `count` | `number` | How many entries the group lists              |\n\nThe entries arrive in the **slot, as the Markdown they were written as** — so the\nsearch indexes them, `llms-full.txt` carries them and the copy control hands a\nmodel prose rather than a component call. Only the name and the count, which the\nbadge and the filters need as data, travel as props.\n\nThe name is a **label, not a headline**: set small, upper-case and in the group's\nown tone, above a list that closes up under it. As a 20-pixel heading it claimed\nthe weight of a chapter for a word naming four bullet points, and six of them read\nas six sections rather than as one release. It is still an `\u003Ch2>` — the outline,\nthe contents column and the anchor are unchanged, and only its setting says what\nit is worth.\n\nThe colour is a **hint and never a meaning**: a name the hint list does not know\nstill gets a stable colour of its own, which is what makes the same kind of change\nscannable down a page of forty releases in any language. The label takes the\ntone's `text` pair rather than the `dot` fill, because a run of words and a\nsix-pixel dot do not clear contrast at the same lightness.\n\nThe **entries' own markers stay grey.** The colour is already stated in the label\ndirectly above them; repeated on every line it stops being a signal. They are set\nfrom `duxt.css`, not from this component, because they arrive as Markdown through\nthe slot.\n\n## Overriding one\n\nSame as any other component the layer ships: a file at the same path in the\nconsuming site wins.\n\n```\napp\u002Fcomponents\u002Fcontent\u002FChangelogGroup.vue\n```\n\nThe props above are the contract, and so is the layout's name. A rename here is a\nbreaking change of the layer.\n\n## What a release page shows besides its groups\n\nNothing in the body. The day a release was cut and the **diff it was cut from**\ntravel as `date` and `compare` in the page's frontmatter, and are drawn where the\nsite already answers where a page came from: the provenance block under the\ncontents column, above \"Edit this page\".\n\nThe release date **replaces** the last-commit line rather than joining it — every\nrelease of a changelog lives in one file, so its last commit dates all of them the\nsame day, which is at best the newest one's.\n\nA release page therefore reads like every other Markdown page on the site, which\nis the point: a release note is prose, not a dashboard.\n\n## No heading of its own\n\nNeither component opens on an `\u003Ch1>`. The docs shell draws the header —\nbreadcrumb, title, the copy control beside it — for every generated page whose\nbody opens on no heading, and a release page wants exactly that: a title and a\ntrail like any written page.\n",{"title":188,"description":192},{"loc":189},"xLMInH6ak4wWMhw2OlLrZ4XyQEPoGslHXOiMcv-oEdU","en-GB",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1296},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1298},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 5.88L14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88M7 10v12\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1300},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 18.12L10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88M17 14V2\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1302},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.12 2.12 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.12 2.12 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.12 2.12 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16z\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1304},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 8v4m0 4h.01\"\u002F>\u003C\u002Fg>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1306},"\u003Cpath fill=\"currentColor\" d=\"M20.317 4.37a19.8 19.8 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.3 18.3 0 0 0-5.487 0a13 13 0 0 0-.617-1.25a.08.08 0 0 0-.079-.037A19.7 19.7 0 0 0 3.677 4.37a.1.1 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.08.08 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.08.08 0 0 0 .084-.028a14 14 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13 13 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10 10 0 0 0 .372-.292a.07.07 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.07.07 0 0 1 .078.01q.181.149.373.292a.077.077 0 0 1-.006.127a12.3 12.3 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.08.08 0 0 0 .084.028a19.8 19.8 0 0 0 6.002-3.03a.08.08 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.06.06 0 0 0-.031-.03M8.02 15.33c-1.182 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418m7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1308},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 5v16m4-8h2m-2-4h2m2.001 10A2 2 0 0 0 22 17V5a2 2 0 0 0-1.999-2L16 3.002A5 5 0 0 0 12 5a5 5 0 0 0-4-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 1.999 2H8a5 5 0 0 1 4 2a5 5 0 0 1 4-2zM6 13h2M6 9h2\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1310},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1312},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497zM15 5l4 4\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1314},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 19l-7-7l7-7m7 7H5\"\u002F>",{"left":833,"top":833,"width":834,"height":834,"rotate":833,"vFlip":835,"hFlip":835,"body":1316},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1789004666763]