Changelog
What shipped in each release.
Subscribe via Atom0.13.1
Patch Changes
Refine docs chrome edges and ship the full typeface stack:
- Self-host JetBrains Mono from
theme.cssso code faces match without a separate Google Fonts link - Theme toggle labels the destination mode (
Switch to light/dark mode) - Search empty state lists suggested starter pages once the index loads
- Prev/next cards get directional chevrons and a light primary hover fill
- Mobile header includes the GitHub control when configured
- Background pattern grid lines follow the
--bordertoken so presets stay coherent - Sidebar hover is quieter than the active state on dense trees
- Self-host JetBrains Mono from
Polish the docs chrome and landing sections for reading measure, identity, and recovery:
- Ship Source Serif 4 with
theme.cssand apply it on landing display headings (Hero,FeatureGrid,CTA); land body copy on foreground ink - Cap markdown articles at
max-w-proseso body measure stays ~65ch on wide screens - Make breadcrumbs navigable: group steps link to the group's first page
- After a "No" on page feedback, offer Edit this page and Open an issue when configured
- Label the mobile table-of-contents control ("On this page") instead of an icon-only button
- Add an optional
beforesnippet onCTAso notes can sit above the heading while the section still ends on the actions
- Ship Source Serif 4 with
0.13.0
Minor Changes
- Report the pages an archive copies that import across the freeze boundary, so
archive-versionsays out loud when a frozen page will keep resolving to current code - The notice names each page and the specifiers it crosses on (
$lib, bare npm packages, relative paths that climb out of the docs root), and is informational: the archive is still written and the config block still printed
- Report the pages an archive copies that import across the freeze boundary, so
Patch Changes
- Document every package export and the features they power (versioning, changelog/feed, mermaid, landing sections, generators, archive CLI) so the README matches what ships
- Use the full
git+https://form forrepository.urlso publint stays quiet
Omit git-derived page dates on a shallow clone instead of dating every page the same day. A shallow history makes the walk look successful while stamping every file with the tip commit, which turns sitemap
<lastmod>into uniform noise. The build warns and leaveslastUpdatedunset (frontmatter still wins); use a full clone (fetch-depth: 0) when real dates matter.- Document the 1.0 stability promise: which surface ordinary semver will cover, and that versioning (
DocsVersions,currentOnly, archive marker,archive-version) stays experimental outside it
- Document the 1.0 stability promise: which surface ordinary semver will cover, and that versioning (
0.12.2
Patch Changes
- Scope the code block styles to the component's own
<pre>, so they no longer restyle unrelated code blocks in the consuming app - Fix the layout shift when hovering a link, caused by those styles arriving with a preloaded route and repainting code blocks the component never rendered
- Scope the code block styles to the component's own
0.12.1
Patch Changes
- Date every page from one git history walk instead of a
git logper page, cutting the content index's git cost by about 11x (93ms to 8.5ms on a 23-page site) and scaling with history rather than page count - Reuse that walk for the life of the dev server, so editing a page no longer re-runs git at all; dates now refresh on restart rather than on save
- Report a failed date lookup instead of silently dating only some pages, which a large repo could hit when the walk outgrew the default output buffer
- Freeze archived pages' dates from the same walk, so
archive-versionno longer spawns git per copied page
- Date every page from one git history walk instead of a
0.12.0
Minor Changes
svelte-docsmith/vitenow exports onlydocsmithandDocsmithViteOptions. ThecollectDocs,collectSearchDocs,collectLlmsDocsandcollectReleasesre-exports are gone: they were internal build steps that the plugin's own tests reached through the package entry, never part of its contract.- Build the content, search and llms indexes as projections of one source-page list, instead of three independent scans of the docs root
- Report a missing or empty docs root from the plugin, so index building no longer writes to the console
Patch Changes
- Fix the version switcher sending readers to the landing page instead of the matching page, on sites serving their docs from the routes root
- Accept a path without a leading slash in
generateSitemapentries and ingenerateFeed'spath, joining it to the origin with exactly one slash - Tolerate any number of trailing slashes on a configured
urloreditUrl, not just one, wherever a URL is built from it - Build every doc URL through one internal vocabulary, replacing three disagreeing trailing-slash regexes and three copies of the segment-boundary rule
0.11.0
Minor Changes
Give the
archive-versioncommand one seam into the library, so version identity and commit dates are decided in one place instead of two.- One
lastCommitDate, shared by the command and the Vite plugin. Both now emit a commit day (2026-03-04); archived pages and current pages no longer carry different shapes in the samelastUpdatedfield. - "Last updated" and changelog release dates render as a UTC calendar day, so they read the same in every timezone and match between the server render and hydration. They previously formatted in the ambient zone, which showed the wrong day west of UTC.
- Version ids are validated wherever they are declared, not only in the command. The rule covers
currenttoo, since archiving turns today's current id into an archive folder. - A
versionsconfig that disagrees with your docs folder now fails the build, reporting the config to paste. Both mismatches were previously silent: an undeclared archive was merged into the current version, and a section folder declared as a version dropped out of the current sidebar. .docsmith-archiveis now documented contract. A folder is an archived version when it carries the marker and is declared inversions; an archive copied by hand needs one.
Breaking, for sites already using
versions.DocsContentItem.lastUpdatedis aYYYY-MM-DDday rather than a full ISO timestamp, so a consumer reading time-of-day off it loses that;sitemap.xmlalready truncated to the day and is unaffected. The new checks can also fail a build that previously passed, which is the point: every case they reject was producing a wrong content index. Unversioned sites are unaffected.- One
Patch Changes
- The mobile menu now shows the version switcher on non-doc pages (a landing page, or any
layout="page"route), matching what the desktop header already did there.
- The mobile menu now shows the version switcher on non-doc pages (a landing page, or any
0.10.0
Minor Changes
Add opt-in versioned docs. The current version stays unprefixed at your docs root, so turning versioning on never moves a URL.
- Declare
versions: { current, archived }indocsmith(). The sidebar, search, prev/next, and breadcrumbs scope to the version being read. Noversionsmeans today's single-tree behaviour, unchanged. - Archived versions are served at
/docs/<id>/…, get a banner linking to the current equivalent, and drop their "Edit this page" link. - A header version switcher appears once an archive exists, and keeps you on the same page across versions.
- Archives stay indexable with a self-canonical;
sitemap.xmlandllms.txtscope to the current version via the newcurrentOnlyhelper. svelte-docsmith archive-version <id>freezes the current docs into an archive, rewriting in-content links to stay inside it and preserving each page's real last-updated date.DocsShell'ssearchprop now receives the active version id, so a loader can return one version's records.lastUpdatedfrontmatter, when present, takes precedence over the git commit date.
- Declare
Patch Changes
ErrorPagetakes aversionsprop and forwards it to the shell, so an error under an archived prefix keeps that version's search scope, switcher, andnoindexinstead of falling back to the current version.ErrorPage'ssearchprop now receives the active version id, matchingDocsShell.- The scaffolded
+error.sveltepassesversions(a no-op until you declare versions).
- Fenced code is detected per CommonMark everywhere at build time: a fence now closes only on a marker of the same character, at least as long as the opener, carrying no info string. A page whose samples nest one fence inside another (
```svelteinside````) no longer leaks its code into the search index or phantom headings into the table of contents. - The fence rule and the frontmatter delimiters live in one module the search index, table of contents,
llms.txtcontent and the archive rewriter all cross, instead of a copy per pass.
- Fenced code is detected per CommonMark everywhere at build time: a fence now closes only on a marker of the same character, at least as long as the opener, carrying no info string. A page whose samples nest one fence inside another (
Accessibility polish across the docs chrome.
- Honour
prefers-reduced-motion: overlay (dialog, sheet, popover, dropdown, accordion) and transition animations collapse to instant; opacity fades still play. - The copy button announces "Copied to clipboard" to screen readers via a polite live region, instead of only swapping its icon.
- The header GitHub link sets
rel="noopener noreferrer".
- Honour
0.9.0
Minor Changes
Publish your releases as a page and a feed. The
docsmith()plugin now parses a ChangesetsCHANGELOG.mdinto the generatedsvelte-docsmith/changelogmodule, and the newChangelogcomponent renders it. Because the entries come from the changelog you already ship, the page cannot fall behind what actually went out.Commit hashes are stripped, multi-paragraph entries survive intact, and each entry's markdown is rendered to HTML at build time so your site needs no runtime markdown renderer. Release dates come from git, specifically the commit that first introduced each version's heading; no date is invented when the history isn't available. Point the new
changelogoption at the package you publish (docsmith({ changelog: '../../packages/my-lib/CHANGELOG.md' })) or set it tofalseto skip.generateFeedbuilds an Atom feed from the same index, for achangelog.xml/+server.tsalongside the existing sitemap and llms.txt endpoints. Atom rather than RSS because it requires an unambiguous id and timestamp per entry, which a version and its release date give exactly.A release that deserves more than a terse entry can have a hand-written page at
src/routes/changelog/<version>/, which the generated entry then links to instead of to its anchor, so the ones worth writing up get a proper post while the rest stay generated.Add filenames and line numbers to code blocks. A fence's metadata now drives both:
```ts title="vite.config.ts"puts a filename bar above the block, andshowLineNumbersadds a gutter. PairstartLine=12with numbering when the snippet is lifted out of a longer file so the numbers match the real source.Number every block by default with the new
lineNumberspreprocessor option; an individual fence still opts out withnoLineNumbers. The numbers are a CSS counter over Shiki's existing per-line spans, so they add no markup and stay out of what the copy button copies. When a block has a title, the copy button moves into the filename bar instead of floating over the first line of code.Add landing page sections, so the marketing page in front of your docs is built from the same design tokens as the docs themselves rather than hand-rolled.
Five new components:
Hero(headline, description, call-to-action buttons, and an optional second column for a code sample or screenshot; without one it centres on a single column),FeatureGridandFeature(a two or three column grid of icon-and-text cells, with an optional tinted band for alternating against neighbouring sections),CTA(the closing panel, with a soft glow behind the heading), andAction(the call-to-action link used byHeroandCTA, in filled and outlined variants).Each renders its own full-width
<section>with the container and spacing already set, so a landing page is a handful of components rather than a wall of layout classes. They use only design tokens, so they follow every theme preset and both colour schemes without configuration.Add Mermaid diagram support. A
```mermaidcode fence now renders as a diagram instead of highlighted code, themed to match the site — diagrams draw their colors, borders and text from your design tokens and follow the light/dark toggle. Diagrams render in the browser, andmermaidis an **optional peer dependency** pulled in only on pages that actually contain one — install it (npm i -D mermaid) to use diagrams; sites without them stay lean and need nothing. A<pre>source fallback shows if a diagram fails to parse ormermaidisn't installed.Highlight code lines by number from the fence:
```svelte {4}, with lists and ranges ({1,5},{2-4}) too. This is the only way to mark a line inside a Svelte template region, where Shiki's comment markers cannot reach: an HTML comment there is stripped without highlighting anything, so the marker silently does nothing. Comment markers keep working everywhere they already did.Header nav links now show which one is active. A link is matched on its section rather than its exact path, since a header link is usually the entry point to an area rather than a page you sit on: "Docs" pointing at
/docs/introductionstays lit across all of/docs/*. External links are never marked, and a link to/matches only the root. The active link also carriesaria-current="page".Add Twoslash, so a code sample can show real types on hover. Mark a fence with
```ts twoslashand the block is compiled by TypeScript, then annotated with the types it actually infers rather than ones written by hand beside the code. Svelte fences work too, viatwoslash-svelte.It is opt-in twice:
docsmith({ twoslash: true })in the preprocessor, then per fence.@shikijs/twoslash,twoslash-svelte, andtypescriptare optional peer dependencies, loaded only when a fence asks for them, so sites that don't use Twoslash pay nothing.Because the snippet really is compiled, it has to typecheck, and an unresolved import or a type error means there is no type to show. Rather than fail the build over one block, DocSmith falls back to an ordinary highlight and warns which block it was. The usual Twoslash directives apply:
// @errors: 2322to show an error deliberately,// @noErrorsto silence one, and// ---cut---to keep setup lines out of the rendered output while still compiling them.The hover popup is restyled from the stock rich theme onto your design tokens, so it matches the site in both colour schemes.
Patch Changes
Stop the header showing a stray divider when search isn't wired. The separator between the search trigger and the header action icons rendered unconditionally, so a site that passed no
searchloader toDocsShellgot a rule with nothing before it. It now appears only alongside the trigger it divides.Stop the code block clipping Twoslash hover popups. A code block is a scroll container, so an absolutely positioned popup was cut off at its edges: hovering a token on the last line showed a sliver of the type and nothing else. CSS alone can't solve it, because an element that scrolls horizontally must also clip vertically. The popup is now promoted to fixed positioning on hover, so it escapes the block, and it flips above the token when there isn't room below. Popups also shrink to the width of the type rather than always filling the maximum. Without JavaScript the popup still opens on hover exactly as before.
The popup's documentation also reads as documentation now. Sitting inside a
<pre>, it inherited monospace and whatever token colour the hovered word happened to carry, so the prose looked like more code; it is now sans-serif and muted, with the signature alone staying mono. Each@paramis its own line with a space after the tag, rather than the whole block running together as@paramcallbackfn.The
@paramtags also took on the colour of whatever word you hovered, because the dark-theme swap repaints everyspaninside a code block with--shiki-dark, which those spans inherited from the hovered token. The popup's documentation now defines that variable itself, so tags read as tags and their text as prose.
0.8.0
Minor Changes
Add an announcement bar. Set
announcementin your config ({ text, tag?, href?, external?, id?, dismissible? }) to show a thin bar above the header on every page, with an optional leadingtagpill (e.g."New") carrying the accent color. It's dismissible by default and, once dismissed, stays dismissed (persisted inlocalStorage) until you change itsidortext, so a new announcement shows again. A blocking head script keeps an already-dismissed bar from flashing in and shifting the layout on reload. The bar sits above the sticky header, so it scrolls away as the reader moves down the page.Add nested sidebar sections. A page's
sectionfrontmatter now accepts an array as well as a string:section: [Guides, Advanced]nests the page inside a collapsible Advanced subsection under Guides. Nesting can go any number of levels deep;orderstill sorts each level, and a subsection takes the smallestorderof its pages so it slots into reading order. In the sidebar, nested groups are collapsible (a caret on the right of the row), with the branch containing the current page expanded on load and the rest collapsed. Breadcrumbs and the prev/next pager follow the full nested path. Single-stringsectionvalues are unchanged.Also makes sidebar ordering deterministic: pages that share an
order(for example all defaulting to0) now tie-break by title instead of by filesystem scan order, so the sidebar is stable across machines.Add synced tab groups. Give related
<Tabs>asyncKeyand they share one selection: choosing (say)pnpmin any block selects it in every block with the same key, and the choice is remembered across reloads and navigation vialocalStorage. Ideal for package-manager, runtime, or OS variant blocks that a reader picks once. Tabs without asyncKeyare unchanged, and the server still renders the default tab so there's no hydration flash.
0.7.0
Minor Changes
Make Darkmatter the built-in default theme.
svelte-docsmith/theme.cssnow ships the Darkmatter tokens as its base, so importing it alone gives the Darkmatter look (near-monochrome with a warm orange primary) without importing a preset. Sites that want the previous look can importsvelte-docsmith/themes/tangerine.cssaftertheme.css.Also fixes Darkmatter's dark-mode
destructivetoken, which was a teal carried over from the source preset instead of a red, so delete buttons and error surfaces now read as errors in dark mode.
0.6.0
Minor Changes
Add reading time and a page-feedback widget to
DocsShell.Doc pages now show an estimated reading time (computed at build time from the page's word count, in the content index as
readingTime); toggle it with thereadingTimeprop (defaulttrue). The newfeedbackprop renders a "Was this page helpful?" thumbs up/down widget at the foot of each page: passtruefor the UI alone, or a(vote, path) => voidcallback to record votes.
0.5.1
Patch Changes
Declare
@lucide/svelteas a runtime dependency. The shipped components import icons from@lucide/svelte/icons/*, but it was listed only underdevDependencies, so standalone consumers (anything outside this monorepo, including projects scaffolded withcreate-svelte-docsmith) failed to build with "failed to resolve import @lucide/svelte/icons/...". The dogfood docs site masked it because the workspace already had the package installed.
0.5.0
Minor Changes
Add "Edit this page" and "Last updated" to the bottom of each doc page. Set
editUrlin your config (the GitHub edit URL for your docs directory, e.g.https://github.com/you/repo/edit/main/apps/docs) and each page links to its own source. The "Last updated" date is read from each page's last git commit automatically, no config needed. Both sit just above the prev/next navigation.Add llms.txt and "Copy page" support for AI tooling.
The
docsmith()plugin now emits asvelte-docsmith/llmsmodule with each page's full markdown. Two framework-agnostic helpers,generateLlmsTxtandgenerateLlmsFullTxt, turn it into thellms.txtindex andllms-full.txtcorpus defined by the llmstxt.org standard, both following the sidebar reading order (grouped bysection, sorted byorder). Wire them intosrc/routes/llms.txt/+server.tsandsrc/routes/llms-full.txt/+server.ts.A new
copyPageprop onDocsShelladds a "Copy page" split button to doc pages: copy the page as Markdown, view the raw.md, or open it in ChatGPT / Claude. Back it with a catch-allsrc/routes/[...slug].md/+server.tsover the samesvelte-docsmith/llmsindex. See the SEO docs page.Add a
generateSitemaphelper that builds asitemap.xmlbody from the content index. Wire it into asrc/routes/sitemap.xml/+server.tsand each doc page is listed with a<lastmod>from its last git commit. Pair it with astatic/robots.txtpointing at the sitemap. See the SEO docs page.
Patch Changes
Accessibility pass on the shell: add a "Skip to content" link (visible on keyboard focus) that jumps to the main content, give
<main>an id and focus target, and label the sidebar, header, mobile, and pagination navs so screen readers can tell the landmarks apart.Normalize trailing slashes when matching the current route.
/docs/intro/and/docs/intronow resolve to the same page, so the SEO tags, "Edit this page" link, prev/next nav, sidebar highlight, and canonical URL all work regardless of the app's SvelteKittrailingSlashsetting (they previously broke on a trailing slash).
0.4.0
Minor Changes
Add code-block annotations. On top of Shiki line highlighting, doc code fences now support the full set of comment-driven markers, each styled for light and dark:
- Diff —
// [!code ++]/// [!code --], with colored backgrounds and+/-gutter markers (this finishes a feature that was styled but not wired). - Focus —
// [!code focus]dims the other lines and sharpens them on hover. - Error / warning —
// [!code error]/// [!code warning]tint a line red or amber. - Word highlight —
// [!code word:name]highlights a token.
Markers are stripped from the rendered output. No new dependencies (the transformers ship with the
@shikijs/transformersDocSmith already used). See the new Code blocks page in the docs.- Diff —
Patch Changes
Point the README at the new
create-svelte-docsmithscaffolder as the fastest way to start a new docs site.
0.3.0
Minor Changes
Add an
ErrorPagecomponent for 404 and error routes. Drop it into a SvelteKit+error.svelteto get a styled error screen that keeps the full site chrome — header, search, footer, theme — so a lost reader can navigate away or search instead of hitting a bare stack trace.<script lang="ts"> import { docs } from 'svelte-docsmith/content'; import { ErrorPage } from 'svelte-docsmith'; import { siteConfig } from '$lib/site-config'; </script> <ErrorPage config={siteConfig} content={docs} home="/docs" homeLabel="Back to the docs" />It reads the status and message from the current
pageby default (404 → "Page not found"), and acceptsstatus,title,message,home/homeLabel,search, and achildrensnippet for overrides.Render each doc page's
<h1>and lead subtitle from frontmatter. The markdown layout now emits the page heading fromtitleand a lead paragraph fromdescription, so the visible page title, the sidebar label, and the<title>tag all come from one source — pages start their body at##and never repeat the title.Note: if a page previously wrote its own top-level
# Heading, remove it to avoid twoh1s (the frontmatter title now provides the page heading).Emit a searchable body-text index. The
docsmith()Vite plugin now serves a second virtual module,svelte-docsmith/search, alongsidesvelte-docsmith/content. It exports one record per page —{ path, title, section, description, headings, text }— wheretextis the page's prose and headings reduced to plain text (frontmatter,<script>blocks, fenced code, tags, and markdown punctuation removed). It is a separate chunk from the nav index so it can be lazy-loaded only when needed. This is the data layer for upcoming full-text search; the newSearchDoctype is exported from the package root.Add a full-text search palette.
DocsShellnow accepts asearchloader that enables a ⌘K / Ctrl-K command palette:<DocsShell {config} content={docs} search={() => import('svelte-docsmith/search').then((m) => m.docs)} >The palette lazily fetches the generated
svelte-docsmith/searchindex (a separate chunk, loaded only when search first opens), builds a FlexSearch index over each page's title, headings, description, and body, and links results to their pages with a context snippet. Header (⌘K button) and mobile (search icon) triggers share one dialog and one shortcut. Omit the prop to keep search off.The framework-agnostic engine is also exported for custom search UIs:
createSearchEngine(docs)returning{ search(query, limit?) }, plus theSearchEngineandSearchResulttypes.Adds
flexsearchas a runtime dependency.Emit SEO head tags from frontmatter.
DocsShellnow renders<title>,<meta name="description">, canonical, and Open Graph / Twitter Card tags for every page — no per-page wiring. Doc pages get their title and description straight from frontmatter (via the content index); other pages fall back to the site title and the newconfig.description.- New optional config fields:
description(default meta description),url(canonical origin — enables<link rel="canonical">and absoluteog:url), andogImage(default share image). - New
DocsShellpropseo={{ title?, description? }}to set or override the head on non-doc pages (landing pages, custom routes).
Previously pages shipped with no
<title>or meta description at all.- New optional config fields:
Normalize the public component API ahead of v1.0 (breaking).
Tabsno longer takes anitemsarray. EachTabItemnow declares its ownlabel, andTabsbuilds the trigger row from them, so labels are written once instead of duplicated betweenitemsand eachTabItem'svalue. The first tab is selected by default; passvalueonTabsto start elsewhere.<!-- before --> <Tabs items={['npm', 'pnpm']} value="npm"> <TabItem value="npm">…</TabItem> <TabItem value="pnpm">…</TabItem> </Tabs> <!-- after --> <Tabs> <TabItem label="npm">…</TabItem> <TabItem label="pnpm">…</TabItem> </Tabs>Callout'stypeprop is renamed tovariant, matchingBadgeand the shadcn convention (<Callout variant="tip">). TheCalloutTypetype is renamed toCalloutVariantand is now exported from the package root.Badgegains anexternalprop: a linked badge (href) can now open in a new tab withrel="noopener noreferrer", matchingCardand header/footer links.
Patch Changes
Polish anchor navigation and copy resilience.
- Mobile table of contents is now server-rendered. The mobile TOC button and list are driven by the build-time heading index, so they're present on first paint (and without JavaScript) instead of popping in after hydration — matching the desktop TOC.
- Heading anchor links are keyboard-accessible. The
#link on eachh2/h3now reveals on focus (not just hover) and carries an accessible label, so it's reachable by keyboard and announced by screen readers. - Copying to the clipboard fails quietly. The copy button no longer throws an unhandled rejection in insecure contexts or when clipboard permission is denied; it logs a warning and leaves the button in its normal state.
Refresh the README and clean up stale source comments. The README's exports table now reflects the full public API (
ErrorPage,createSearchEngine, thesvelte-docsmith/searchentry point, the theme presets) and gains short sections for search, SEO, error pages, and themes. Dead references to the old velite pipeline and to an internalPLAN.mdwere removed from the shipped source comments.Fix
PropsTableoverflow on narrow content. The four-column table forced a horizontal scrollbar and crushed the Description column to a sliver whenever a prop had a long type signature (e.g.() => Promise<SearchDoc[]>). Each prop now renders as a stacked row — name, required badge, type chips, and default on one wrapping line, with the description full-width below — so nothing overflows and the description stays readable at every width. ThePropsTable/PropAPI is unchanged.Fix the
pagelayout header on mobile.DocsShell layout="page"(landing pages, the themes gallery, any non-doc page) previously rendered the full desktop header at every breakpoint, so on phones the nav links, version badge, and controls crammed together with no menu — and it sat at a different horizontal inset than the docs pages.Both layouts now share one header system:
DocsHeaderon desktop and the responsive mobile header belowlg, so every page's header lines up and collapses to a hamburger identically. The mobile menu now also lists the configured header nav (config.nav) alongside the doc sidebar, so links like a top-level "Themes" are reachable from the mobile menu on doc pages too.Fix server-rendered TOC anchors that could miss their heading. The build-time TOC extractor used a hand-rolled slugifier that only approximated
rehype-slug, so headings with punctuation or symbols drifted — e.g.## Anchors & copy buttonsrendered the idanchors--copy-buttonsbut the TOC linked#anchors-copy-buttons, a dead anchor until hydration re-scanned the DOM. The extractor now slugs with the samegithub-sluggerrehype-sluguses, including its duplicate-suffixing, so SSR TOC links resolve on first paint for every heading.Fail loudly instead of silently on misconfiguration.
defineConfignow validates the footer.footer.copyright,footer.poweredBy, andfooter.columns(each column'stitle/links, and every link'slabel/href) are checked, so a malformed footer throws a named error instead of rendering blank.- The
docsmith()Vite plugin warns when it finds no pages. A missing content directory, or one with no titled+page.mdfiles, now logs an actionable warning explaining the empty sidebar instead of leaving you guessing. - Invalid YAML frontmatter reports the file. A page with broken frontmatter throws an error naming the offending file, rather than a bare parser message.
0.2.0
Minor Changes
Add the
darkmattertheme preset (svelte-docsmith/themes/darkmatter.css) — a near-monochrome shell with a warm orange primary and muted teal secondary, in light and dark.Add a "Powered by Svelte DocSmith" attribution to the footer. It is shown by default whenever a footer is configured; opt out with
footer.poweredBy: falsein yourDocsmithConfig.
0.1.1
Patch Changes
Declare all runtime dependencies.
@lucide/svelte,clsx,tailwind-merge,tailwind-variants,tw-animate-css, and@fontsource-variable/interwere devDependencies, so installs outside this monorepo failed to resolve imports from the shipped components andtheme.css. They are now regular dependencies.
0.1.0
Minor Changes
Initial public release of svelte-docsmith — a framework for building documentation sites with Svelte 5 + SvelteKit.
docsmith()markdown pipeline (mdsvex + Shiki dual-theme highlighting + heading anchors) and Vite plugin (frontmatter-driven content index +?sourceimports).DocsShelllayout,LiveExample, and docs components:Tabs/TabItem,Callout,Steps/Step,Card/CardGrid,Accordion/AccordionItem,Badge,Kbd,FileTree,PropsTable.- One-import theme contract (
svelte-docsmith/theme.css) with a set of tweakcn-based theme presets and light/dark support. defineConfig()for typed site configuration.