From 31aaaf364b6512a6ecd8e115c7d278eb1ec012ce Mon Sep 17 00:00:00 2001 From: theetherGit Date: Thu, 4 Dec 2025 17:28:06 +0530 Subject: [PATCH 1/5] feat!(package): add navigation neighbor ui --- .../src/lib/components/layout/doc-page.svelte | 19 ++++++--- .../layout/navigation-neighbors.svelte | 39 +++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 packages/kit/src/lib/components/layout/navigation-neighbors.svelte diff --git a/packages/kit/src/lib/components/layout/doc-page.svelte b/packages/kit/src/lib/components/layout/doc-page.svelte index 3e7774e..760b4e2 100644 --- a/packages/kit/src/lib/components/layout/doc-page.svelte +++ b/packages/kit/src/lib/components/layout/doc-page.svelte @@ -2,9 +2,10 @@ import PageHeader from "$lib/components/layout/page-header/page-header.svelte"; import Toc from "$lib/components/toc/toc.svelte"; import type { Component, ComponentProps } from "svelte"; - import type { Contributor, TOCEntry } from "$lib/types.js"; + import type { Contributor, TOCEntry, NavigationNeighbors } from "$lib/types.js"; import Metadata from "../metadata.svelte"; import ContributorSection from "../contributors-section.svelte"; + import NavigationNeighborButtons from "./navigation-neighbors.svelte"; let { component, @@ -14,6 +15,7 @@ toc, metadata = {}, contributors = [], + navigationNeighbors, }: { component: Component; componentProps?: Record; @@ -22,6 +24,7 @@ toc: TOCEntry[]; metadata?: ComponentProps; contributors?: Contributor[]; + navigationNeighbors?: NavigationNeighbors; } = $props(); const PageComponent = $derived(component); @@ -40,9 +43,15 @@ -
- - - +
+
+ + + +
+
diff --git a/packages/kit/src/lib/components/layout/navigation-neighbors.svelte b/packages/kit/src/lib/components/layout/navigation-neighbors.svelte new file mode 100644 index 0000000..ec0acdb --- /dev/null +++ b/packages/kit/src/lib/components/layout/navigation-neighbors.svelte @@ -0,0 +1,39 @@ + + +{#if navigationNeighbors} +
+ {#if navigationNeighbors?.previous} + + {/if} + {#if navigationNeighbors?.next} + + {/if} +
+{/if} \ No newline at end of file From 89047066d3ae21157092ca69976cff555c6a4127 Mon Sep 17 00:00:00 2001 From: theetherGit Date: Thu, 4 Dec 2025 17:28:57 +0530 Subject: [PATCH 2/5] feat!(package): add navigation neighbor utility --- docs/src/lib/navigation-neighbors.ts | 53 +++ docs/src/lib/navigation.ts | 35 +- docs/src/routes/(docs)/docs/+page.svelte | 8 +- .../routes/(docs)/docs/[...slug]/+page.svelte | 8 +- docs/src/routes/api/search.json/search.json | 2 +- packages/kit/src/lib/types.ts | 13 + pnpm-lock.yaml | 396 ++++++++++++------ 7 files changed, 381 insertions(+), 134 deletions(-) create mode 100644 docs/src/lib/navigation-neighbors.ts diff --git a/docs/src/lib/navigation-neighbors.ts b/docs/src/lib/navigation-neighbors.ts new file mode 100644 index 0000000..0b279b1 --- /dev/null +++ b/docs/src/lib/navigation-neighbors.ts @@ -0,0 +1,53 @@ +import type { Navigation, NavigationNeighbor, NavigationNeighbors } from "@svecodocs/kit"; + +export type NavigationNeighborMap = Map; + +function flatNavigationAnchors(navigationAnchors: Navigation["anchors"]): NavigationNeighbor[] { + if (!navigationAnchors) { + return []; + } + return navigationAnchors.filter((anchor) => !anchor.disabled); +} + +function flatNavigationSections(navigationSections: Navigation["sections"]): NavigationNeighbor[] { + const sections: NavigationNeighbor[] = []; + + if (!navigationSections) { + return sections; + } + + for (const section of navigationSections) { + if (section?.items) { + for (const navigation of section.items) { + if (!navigation.disabled && navigation.href) { + sections.push({ + title: navigation.title, + description: navigation.description || "", + href: navigation.href, + }); + } + } + } + } + return sections; +} + +export function getFlattenedNavigableItems(navigationConfig: Navigation): NavigationNeighbor[] { + const anchors = flatNavigationAnchors(navigationConfig.anchors); + const sections = flatNavigationSections(navigationConfig.sections); + return [...anchors, ...sections]; +} + +export function preCalculateNavigationNeighbors(navigation: Navigation): NavigationNeighborMap { + const navigableItems = getFlattenedNavigableItems(navigation); + const lookupMap: NavigationNeighborMap = new Map(); + + const { length } = navigableItems; + for (let i = 0; i < length; i++) { + const previous = i > 0 ? navigableItems[i - 1] : undefined; + const next = i < length - 1 ? navigableItems[i + 1] : undefined; + lookupMap.set(navigableItems[i].href, { previous, next }); + } + + return lookupMap; +} diff --git a/docs/src/lib/navigation.ts b/docs/src/lib/navigation.ts index dbb2cd6..9e03bc7 100644 --- a/docs/src/lib/navigation.ts +++ b/docs/src/lib/navigation.ts @@ -3,37 +3,42 @@ import ChalkboardTeacher from "phosphor-svelte/lib/ChalkboardTeacher"; import RocketLaunch from "phosphor-svelte/lib/RocketLaunch"; import Tag from "phosphor-svelte/lib/Tag"; import { getAllDocs } from "./utils.js"; +import type { Doc } from "$content/index"; +import { preCalculateNavigationNeighbors } from "$lib/navigation-neighbors"; const allDocs = getAllDocs(); -const components = allDocs - .filter((doc) => doc.section === "Components") - .map((doc) => ({ - title: doc.title, - href: `/docs/${doc.slug}`, - })); +export function getSectionDocs(section: Doc["section"], pathPrefix = "/docs/") { + return allDocs + .filter((doc) => doc.section === section) + .map((doc) => ({ + title: doc.title, + href: `${pathPrefix}${doc.slug}`, + description: doc.description, + })); +} -const configuration = allDocs - .filter((doc) => doc.section === "Configuration") - .map((doc) => ({ - title: doc.title, - href: `/docs/${doc.slug}`, - })); +const components = getSectionDocs("Components"); + +const configuration = getSectionDocs("Configuration"); export const navigation = defineNavigation({ anchors: [ { title: "Introduction", href: "/docs", + description: "What exactly is Svecodocs?", icon: ChalkboardTeacher, }, { title: "Getting Started", href: "/docs/getting-started", + description: "A quick guide to get started using Svecodocs", icon: RocketLaunch, }, { title: "Releases", + description: "See the latest changes and updates", href: "https://github.com/svecosystem/svecodocs/releases", icon: Tag, }, @@ -49,3 +54,9 @@ export const navigation = defineNavigation({ }, ], }); + +export const neighborLookup = preCalculateNavigationNeighbors(navigation); + +export function getNavigationNeighbors(pathname: string) { + return neighborLookup.get(pathname); +} diff --git a/docs/src/routes/(docs)/docs/+page.svelte b/docs/src/routes/(docs)/docs/+page.svelte index e59c2b3..799e0fc 100644 --- a/docs/src/routes/(docs)/docs/+page.svelte +++ b/docs/src/routes/(docs)/docs/+page.svelte @@ -1,6 +1,12 @@ - + diff --git a/docs/src/routes/(docs)/docs/[...slug]/+page.svelte b/docs/src/routes/(docs)/docs/[...slug]/+page.svelte index e59c2b3..799e0fc 100644 --- a/docs/src/routes/(docs)/docs/[...slug]/+page.svelte +++ b/docs/src/routes/(docs)/docs/[...slug]/+page.svelte @@ -1,6 +1,12 @@ - + diff --git a/docs/src/routes/api/search.json/search.json b/docs/src/routes/api/search.json/search.json index 2cbdd5c..26c0e58 100644 --- a/docs/src/routes/api/search.json/search.json +++ b/docs/src/routes/api/search.json/search.json @@ -1 +1 @@ -[{"title":"Getting Started","href":"/docs/getting-started","description":"A quick guide to get started using Svecodocs","content":"import { Callout } from \"@svecodocs/kit\"; The following guide will walk you through the process of getting a Svecodocs project up and running. Clone the starter template Clone the Svecodocs starter template: pnpx degit svecosystem/svecodocs/start Navigation The starter template comes with a basic navigation structure to get your started. To customize the navigation, adjust the src/lib/navigation.ts file. import { defineNavigation } from \"@svecodocs/kit\"; export const navigation = defineNavigation({ // Customize the navigation here }); Site config The site config is used to configure site-wide settings, such as the title, description, keywords, ogImage, and other metadata. The config is located in the src/lib/site-config.ts file. import { defineSiteConfig } from \"@svecodocs/kit\"; export const siteConfig = defineSiteConfig({ title: \"Svecodocs\", description: \"A SvelteKit docs starter template\", keywords: \"sveltekit, docs, starter, template\", ogImage: { url: \"https://docs.sveco.dev/og.png\", height: 630, width: 1200, }, }); Per-Route Site Config You can override any part of the site config on a per-route basis using the useSiteConfig hook. This feature is still being worked on. Theme The starter template comes with the default Svecodocs theme (orange). To customize the theme, adjust the import in the src/app.css file to reflect the color scheme you want to use for your project. Each theme has been designed to work well in both light and dark mode. /* @import \"@svecodocs/kit/themes/orange.css\"; */ @import \"@svecodocs/kit/themes/emerald.css\"; @import \"@svecodocs/kit/globals.css\"; Logo To customize the logo displayed in the sidebar header, head to the src/routes/(docs)/+layout.svelte file and adjust the contents of the logo snippet. If the logo has a light and dark version, ensure to handle those similarly to the default Svecosystem logo. {#snippet logo()} The project name here {/snippet} `","category":"Overview"},{"title":"Introduction","href":"/docs/index","description":"What exactly is Svecodocs?","content":"import { Callout } from '@svecodocs/kit' After spending countless hours building documentation sites for various projects, we decided to build a docs package/starter template that we can use for future projects. This project is a result of that effort. Svecodocs is a starting point/utility library for building documentation sites under the $2 umbrella. The code is open source, but it's built and maintained for our own specific needs, so we won't be accepting any public feature requests. You are more than welcome to fork the project and customize it to your own needs. Features Markdown-based docs**. Write docs using Markdown and Svelte components Light and dark mode**. Toggle between light and dark mode Syntax highlighting**. Code blocks are automatically highlighted SEO-friendly**. Meta tags and Open Graph support out of the box Pre-built components**. Tabs, callouts, and more to use within the documentation Custom unified plugins**. Custom remark and rehype plugins to give more flexibility over the rendered HTML shadcn-svelte**. Beautifully designed Svelte components Tailwind v4**. Tailwind CSS v4 is used for styling","category":"Overview"},{"title":"Button","href":"/docs/components/button","description":"A button component to use in examples and documentation.","content":"import { Button, DemoContainer } from \"@svecodocs/kit\"; Usage import { Button } from \"@svecodocs/kit\"; Default Brand Ghost Outline Subtle Link Example Default Size Default Brand Destructive Ghost Outline Subtle Link Small Size Default Brand Destructive Ghost Outline Subtle Link","category":"Components"},{"title":"Callout","href":"/docs/components/callout","description":"A callout component to highlight important information.","content":"import { Callout, PropField } from \"@svecodocs/kit\"; import Avocado from \"phosphor-svelte/lib/Avocado\"; Callouts (also known as admonitions) are used to highlight a block of text. There are five types of callouts available: 'note', 'warning', 'danger', 'tip', and 'success'. You can override the default icon for the callout by passing a component via the icon prop. Usage import { Callout } from \"$lib/components\"; This is a note, used to highlight important information or provide additional context. You can use markdown in here as well! Just ensure you include a space between the component and the content in your Markdown file. Examples Warning This is an example of a warning callout. Note This is an example of a note callout. Danger This is an example of a danger callout. Tip This is an example of a tip callout. Success This is an example of a success callout. Custom Icon This is an example of a note callout with a custom icon. Custom Title This is an example of a warning callout with a custom title. Props The type of callout to display. Override the default title for the callout. Override the default icon for the callout. The content to display inside of the callout's body.","category":"Components"},{"title":"Card Grid","href":"/docs/components/card-grid","description":"Display a grid of cards.","content":"import { CardGrid, Card, PropField } from \"@svecodocs/kit\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; import Blueprint from \"phosphor-svelte/lib/Blueprint\"; import Binary from \"phosphor-svelte/lib/Binary\"; import CloudCheck from \"phosphor-svelte/lib/CloudCheck\"; Use the CardGrid component to display a grid of $2 components. Usage import { CardGrid, Card } from \"@svecodocs/ui\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Examples 2 Columns (default) You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. 3 Columns You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Props The number of columns to display the cards in. Uses flex column layout when in smaller viewports.","category":"Components"},{"title":"Card","href":"/docs/components/card","description":"Display a card with a title and optional icon.","content":"import { Card, PropField } from \"@svecodocs/kit\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; You can use the Card component to display a card with a title and optional icon. Usage With Icon Pass an icon component to the icon prop to display an icon in the card. import { Card } from \"@svecodocs/ui\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Link Card Pass the href prop to convert the card into a link. import { Card } from \"@svecodocs/ui\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Without Icon If you don't want to use an icon, just don't pass the icon prop. import { Card } from \"@svecodocs/ui\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Horizontal You can use the horizontal prop to display the card horizontally. import { Card } from \"@svecodocs/ui\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Props The title to display in the card. The icon to display in the card. If provided, the card will become a link. The target is handled automatically based on what the href starts with. External links will open in a new tab, and internal links will open in the current tab. The body content of the card.","category":"Components"},{"title":"Checkbox","href":"/docs/components/checkbox","description":"A checkbox component to use in examples and documentation.","content":"import { Checkbox, DemoContainer } from \"@svecodocs/kit\"; Usage import { Checkbox } from \"@svecodocs/kit\"; Example Props See $2 for available props.","category":"Components"},{"title":"Collapsible","href":"/docs/components/collapsible","description":"Show and hide content in a collapsible container.","content":"import { Collapsible, DemoContainer, PropField } from \"@svecodocs/kit\"; Usage import { Collapsible, DemoContainer } from \"@svecodocs/kit\"; To learn more about SvelteKit, check out the $2. Example To learn more about SvelteKit, check out the $2. Props The title to display in the trigger. \"Hide\" and \"Show\" prefix will be added automatically. Whether the content should be open or closed. Override the content inside of the trigger button. The content that is collapsible.","category":"Components"},{"title":"DemoContainer","href":"/docs/components/demo-container","description":"Display a container with a border and a background color for examples/demos.","content":"import { DemoContainer, Button } from \"@svecodocs/kit\"; Often times you'll want to display some demo/example components in a container. The DemoContainer component is a great way to do this, as it aligns effortlessly with the rest of the docs theme. Usage import { DemoContainer, Button } from \"@svecodocs/ui\"; Default Brand Outline Ghost Subtle Link Example Default Brand Outline Ghost Subtle Link","category":"Components"},{"title":"Input","href":"/docs/components/input","description":"A form input component to use in examples and documentation.","content":"import { Input, Label, DemoContainer, Button } from \"@svecodocs/kit\"; When building documentation, it's often necessary to provide users with a form input to showcase a specific feature. The Input component is a great way to do this, as it aligns effortlessly with the rest of the docs theme. The Label component is also provided to help with accessibility. Usage import { Input, Label } from \"@svecodocs/kit\"; Your name Example First name Last name Update Profile","category":"Components"},{"title":"NativeSelect","href":"/docs/components/native-select","description":"A styled native select component to use in examples and documentation.","content":"import { NativeSelect, Label, DemoContainer } from \"@svecodocs/kit\"; The NativeSelect component is a styled native select component that you can use in your examples and documentation. Usage import { NativeSelect } from \"@svecodocs/kit\"; Option 1 Option 2 Option 3 Example Select an option Option 1 Option 2 Option 3","category":"Components"},{"title":"PropField","href":"/docs/components/prop-field","description":"Display a prop field with a name, type, and description.","content":"import { PropField, Collapsible } from \"@svecodocs/kit\"; Use the PropField component to annotate props/params in your documentation. Usage import { PropField } from \"@svecodocs/kit\"; The checked state of the checkbox. Examples Basic The checked state of the checkbox. Object You can use PropField in combination with the $2 component to represent more complex types. import { PropField, Collapsible } from \"@svecodocs/kit\"; Configuration options to customize the behavior of the Checkbox component. The width to apply to the checkbox. The height to apply to the checkbox. Configuration options to customize the behavior of the Checkbox component. The width to apply to the checkbox. The height to apply to the checkbox. Props The name of the prop. The type of the prop. The default value of the prop. Whether the prop is required. The description/content to display within the prop field.","category":"Components"},{"title":"Select","href":"/docs/components/select","description":"A select component to use in examples and documentation.","content":"import { Select, DemoContainer } from \"@svecodocs/kit\"; import SelectDemo from \"$lib/components/demos/select-demo.svelte\"; Usage import { Select } from \"@svecodocs/kit\"; Example Props See $2 for available props.","category":"Components"},{"title":"Steps","href":"/docs/components/steps","description":"Display a series of series of steps.","content":"import { Step, Steps, Callout } from \"@svecodocs/kit\"; The Steps and Step components are used to display a series of steps, breaking down a process into more manageable chunks. Usage import { Steps, Step } from \"$lib/components\"; Install the package You can install the project via npm or pnpm. Start your engines You can start the project by running npm run dev or pnpm run dev. Example Install the package You can install the project via npm or pnpm. npm install @svecodocs/ui Start your engines You can start the project by running npm run dev or pnpm dev. npm run dev If you plan to use markdown-specific syntax in your steps, ensure you include a space between the component and the content in your Markdown file.","category":"Components"},{"title":"Switch","href":"/docs/components/switch","description":"A checkbox component to use in examples and documentation.","content":"import { Switch, DemoContainer } from \"@svecodocs/kit\"; Usage import { Switch } from \"@svecodocs/kit\"; Example Props See $2 for available props.","category":"Components"},{"title":"Tabs","href":"/docs/components/tabs","description":"Break content into multiple panes to reduce cognitive load.","content":"import { Tabs, TabItem, Callout, PropField } from \"@svecodocs/kit\"; const itemsA = [\"First tab\", \"Second tab\"]; const itemsB = [\"+page.svelte\", \"+page.server.ts\"]; You can use the Tabs and TabItem components to create tabbed interfaces. A label prop must be provided to each TabItem which will be used to display the label. Whichever tab should be active by default is specified by the value prop on the Tabs component. Usage import { Tabs, TabItem } from \"@svecodocs/kit\"; const items = [\"First tab\", \"Second tab\"]; This is the first tab's content. This is the second tab's content. Examples Simple Text This is the first tab's content. This is the second tab's content. Markdown Syntax import { Button } from \"@svecodocs/kit\"; alert(\"Hello!\")}>Click me export async function load() { return { transactions: [], }; } If you plan to use markdown-specific syntax in your tabs, ensure you include a space between the component and the content in your Markdown file. Props Tabs The tab items to display. The label of the tab to be active by default. TabItem The value that identifies the tab. This value should map to an item within the items prop passed to the Tabs component.","category":"Components"},{"title":"Textarea","href":"/docs/components/textarea","description":"A textarea component to use in examples and documentation.","content":"import { Textarea, Label, DemoContainer, Button } from \"@svecodocs/kit\"; When building documentation, it's often necessary to provide users with a textarea to showcase a specific feature. The Textarea component is a great way to do this, as it aligns effortlessly with the rest of the docs theme. The Label component is also provided to help with accessibility. Usage import { Textarea, Label } from \"@svecodocs/kit\"; Your bio Example Bio Update Profile","category":"Components"},{"title":"Navigation","href":"/docs/configuration/navigation","description":"Learn how to customize the navigation in your Svecodocs project.","content":"Navigation is a key component of every site, documenting the structure of your site and providing a clear path for users to navigate through your content. Svecodocs comes with a navigation structure that is designed to be flexible and customizable. Each page in your site should have a corresponding navigation item, and the navigation items should be nested according to their hierarchy. Navigation Structure Anchors Anchors are links that are displayed at the top of the sidebar and typically used to either highlight important information or provide quick access to linked content. Sections Sections are used to group related navigation items together. They are typically used to organize content into different categories, such as \"Components\", \"Configuration\", and \"Utilities\".","category":"Configuration"},{"title":"Search","href":"/docs/configuration/search","description":"Learn how to customize the search in your Svecodocs project.","content":"The search functionality provides fast, client-side search across your documentation using FlexSearch for indexing and fuzzy matching. How It Works The search system consists of three main parts: Build-time indexing - Documents are processed and indexed during the build Static API endpoint - Search data is served from a static JSON file Client-side search - Fast, interactive search interface Build Process During the build process, the build-search-data.js script is used to generate the search index: import { fileURLToPath } from \"node:url\"; import { writeFileSync } from \"node:fs\"; import { resolve } from \"node:path\"; import { docs } from \"../.velite/index.js\"; import { defineSearchContent, cleanMarkdown } from \"@svecodocs/kit\"; const __dirname = fileURLToPath(new URL(\".\", import.meta.url)); export function buildDocsSearchIndex() { return defineSearchContent( docs.map((doc) => ({ title: doc.title, href: /docs/${doc.slug}, description: doc.description, content: cleanMarkdown(doc.raw), category: doc.section, })) ); } writeFileSync( resolve(__dirname, \"../src/routes/api/search.json/search.json\"), JSON.stringify(buildDocsSearchIndex()), { flag: \"w\" } ); This script: Imports processed documentation data from Velite Maps each document to a search entry with title, href, description, content, and optional category Uses cleanMarkdown() to remove markdown syntax from content for better search Writes the search index to a static JSON file API Endpoint The search data is served through a static API route: import type { RequestHandler } from \"@sveltejs/kit\"; import search from \"./search.json\" assert { type: \"json\" }; export const prerender = true; export const GET: RequestHandler = () => { return Response.json(search); }; This route is prerendered for optimal performance and serves the search index as JSON. Client-Side Search The search interface is implemented as a reusable Svelte component: import { onMount } from \"svelte\"; import { type SearchResult, createContentIndex, searchContentIndex } from \"./search-utils.js\"; let searchState = $state(\"loading\"); let searchQuery = $state(\"\"); onMount(async () => { const content = await fetch(\"/api/search.json\").then((res) => res.json()); if (!content) return; createContentIndex(content); searchState = \"ready\"; }); The component: Fetches search data on mount Creates FlexSearch indexes for fast querying Provides a dialog-based search interface Supports keyboard shortcut (Cmd/Ctrl + K) Search Result Structure Each search result contains: type SearchContent = { title: string; content: string; description: string; href: string; category?: string; }; type SearchResult = SearchContent & { snippet?: string; // Content snippet with highlights highlights?: string[]; // Array of highlighted terms category?: string; // Document category/section }; Search Algorithm The search uses a multi-tiered approach: Primary search: FlexSearch indexes for title and content with different weights Title matches: 10 points Content matches: 5 points Fallback search: Fuzzy matching when no exact results found Fuzzy title matches: 8 points Fuzzy content matches: 3 points Results are ranked by score and limited to 10 items. Usage Basic Integration To use the search component in your site: import Search from \"@svecodocs/kit/components/search/search.svelte\"; `","category":"Configuration"},{"title":"Theme","href":"/docs/configuration/theme","description":"Learn how to customize the theme in your Svecodocs project.","content":"The theme determines the branded color scheme for your site. A theme for each of the TailwindCSS colors is provided by the @svecodocs/kit package. Each theme has been designed to present well in both light and dark mode. Using a theme To use a theme, import the theme file into your src/app.css file before importing the @svecodocs/kit/globals.css file. /* @import \"@svecodocs/kit/theme-orange.css\"; */ @import \"@svecodocs/kit/theme-emerald.css\"; @import \"@svecodocs/kit/globals.css\"; It's not recommended to customize the theme to maintain consistency across the UI components that are provided by Svecodocs and align with the provided themes. Available themes | Theme name | Import path | | ---------- | ---------------------------------- | | orange | @svecodocs/kit/theme-orange.css | | green | @svecodocs/kit/theme-green.css | | blue | @svecodocs/kit/theme-blue.css | | purple | @svecodocs/kit/theme-purple.css | | pink | @svecodocs/kit/theme-pink.css | | lime | @svecodocs/kit/theme-lime.css | | yellow | @svecodocs/kit/theme-yellow.css | | cyan | @svecodocs/kit/theme-cyan.css | | teal | @svecodocs/kit/theme-teal.css | | violet | @svecodocs/kit/theme-violet.css | | amber | @svecodocs/kit/theme-amber.css | | red | @svecodocs/kit/theme-red.css | | sky | @svecodocs/kit/theme-sky.css | | emerald | @svecodocs/kit/theme-emerald.css | | fuchsia | @svecodocs/kit/theme-fuchsia.css | | rose | @svecodocs/kit/theme-rose.css | Tailwind Variables Svecodocs uses TailwindCSS to style the UI components and provides a set of Tailwind variables that can be used to style your examples/custom components. Gray We override the TailwindCSS gray color scale to provide our own grays. Brand You can use the brand color to use the brand color of your project.","category":"Configuration"}] \ No newline at end of file +[{"title":"Getting Started","href":"/docs/getting-started","description":"A quick guide to get started using Svecodocs","content":"import { Callout } from \"@svecodocs/kit\"; The following guide will walk you through the process of getting a Svecodocs project up and running. Clone the starter template Clone the Svecodocs starter template: pnpx degit svecosystem/svecodocs/start Navigation The starter template comes with a basic navigation structure to get your started. To customize the navigation, adjust the src/lib/navigation.ts file. import { defineNavigation } from \"@svecodocs/kit\"; export const navigation = defineNavigation({ // Customize the navigation here }); Site config The site config is used to configure site-wide settings, such as the title, description, keywords, ogImage, and other metadata. The config is located in the src/lib/site-config.ts file. import { defineSiteConfig } from \"@svecodocs/kit\"; export const siteConfig = defineSiteConfig({ title: \"Svecodocs\", description: \"A SvelteKit docs starter template\", keywords: \"sveltekit, docs, starter, template\", ogImage: { url: \"https://docs.sveco.dev/og.png\", height: 630, width: 1200, }, }); Per-Route Site Config You can override any part of the site config on a per-route basis using the useSiteConfig hook. This feature is still being worked on. Theme The starter template comes with the default Svecodocs theme (orange). To customize the theme, adjust the import in the src/app.css file to reflect the color scheme you want to use for your project. Each theme has been designed to work well in both light and dark mode. /* @import \"@svecodocs/kit/themes/orange.css\"; */ @import \"@svecodocs/kit/themes/emerald.css\"; @import \"@svecodocs/kit/globals.css\"; Logo To customize the logo displayed in the sidebar header, head to the src/routes/(docs)/+layout.svelte file and adjust the contents of the logo snippet. If the logo has a light and dark version, ensure to handle those similarly to the default Svecosystem logo. {#snippet logo()} The project name here {/snippet} `","category":"Overview"},{"title":"Introduction","href":"/docs/index","description":"What exactly is Svecodocs?","content":"import { Callout } from '@svecodocs/kit' After spending countless hours building documentation sites for various projects, we decided to build a docs package/starter template that we can use for future projects. This project is a result of that effort. Svecodocs is a starting point/utility library for building documentation sites under the $2 umbrella. The code is open source, but it's built and maintained for our own specific needs, so we won't be accepting any public feature requests. You are more than welcome to fork the project and customize it to your own needs. Features Markdown-based docs**. Write docs using Markdown and Svelte components Light and dark mode**. Toggle between light and dark mode Syntax highlighting**. Code blocks are automatically highlighted SEO-friendly**. Meta tags and Open Graph support out of the box Pre-built components**. Tabs, callouts, and more to use within the documentation Custom unified plugins**. Custom remark and rehype plugins to give more flexibility over the rendered HTML shadcn-svelte**. Beautifully designed Svelte components Tailwind v4**. Tailwind CSS v4 is used for styling","category":"Overview"},{"title":"Button","href":"/docs/components/button","description":"A button component to use in examples and documentation.","content":"import { Button, DemoContainer } from \"@svecodocs/kit\"; Usage import { Button } from \"@svecodocs/kit\"; Default Brand Ghost Outline Subtle Link Example Default Size Default Brand Destructive Ghost Outline Subtle Link Small Size Default Brand Destructive Ghost Outline Subtle Link","category":"Components"},{"title":"Callout","href":"/docs/components/callout","description":"A callout component to highlight important information.","content":"import { Callout, PropField } from \"@svecodocs/kit\"; import Avocado from \"phosphor-svelte/lib/Avocado\"; Callouts (also known as admonitions) are used to highlight a block of text. There are five types of callouts available: 'note', 'warning', 'danger', 'tip', and 'success'. You can override the default icon for the callout by passing a component via the icon prop. Usage import { Callout } from \"$lib/components\"; This is a note, used to highlight important information or provide additional context. You can use markdown in here as well! Just ensure you include a space between the component and the content in your Markdown file. Examples Warning This is an example of a warning callout. Note This is an example of a note callout. Danger This is an example of a danger callout. Tip This is an example of a tip callout. Success This is an example of a success callout. Custom Icon This is an example of a note callout with a custom icon. Custom Title This is an example of a warning callout with a custom title. Props The type of callout to display. Override the default title for the callout. Override the default icon for the callout. The content to display inside of the callout's body.","category":"Components"},{"title":"Card Grid","href":"/docs/components/card-grid","description":"Display a grid of cards.","content":"import { CardGrid, Card, PropField } from \"@svecodocs/kit\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; import Blueprint from \"phosphor-svelte/lib/Blueprint\"; import Binary from \"phosphor-svelte/lib/Binary\"; import CloudCheck from \"phosphor-svelte/lib/CloudCheck\"; Use the CardGrid component to display a grid of $2 components. Usage import { CardGrid, Card } from \"@svecodocs/ui\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Examples 2 Columns (default) You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. 3 Columns You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Props The number of columns to display the cards in. Uses flex column layout when in smaller viewports.","category":"Components"},{"title":"Card","href":"/docs/components/card","description":"Display a card with a title and optional icon.","content":"import { Card, PropField } from \"@svecodocs/kit\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; You can use the Card component to display a card with a title and optional icon. Usage With Icon Pass an icon component to the icon prop to display an icon in the card. import { Card } from \"@svecodocs/ui\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Link Card Pass the href prop to convert the card into a link. import { Card } from \"@svecodocs/ui\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Without Icon If you don't want to use an icon, just don't pass the icon prop. import { Card } from \"@svecodocs/ui\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Horizontal You can use the horizontal prop to display the card horizontally. import { Card } from \"@svecodocs/ui\"; import RocketLaunch from \"phosphor-svelte/lib/RocketLaunch\"; You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. You can use markdown in here, just ensure to include a space between the component and the content in your Markdown file. Props The title to display in the card. The icon to display in the card. If provided, the card will become a link. The target is handled automatically based on what the href starts with. External links will open in a new tab, and internal links will open in the current tab. The body content of the card.","category":"Components"},{"title":"Checkbox","href":"/docs/components/checkbox","description":"A checkbox component to use in examples and documentation.","content":"import { Checkbox, DemoContainer } from \"@svecodocs/kit\"; Usage import { Checkbox } from \"@svecodocs/kit\"; Example Props See $2 for available props.","category":"Components"},{"title":"Collapsible","href":"/docs/components/collapsible","description":"Show and hide content in a collapsible container.","content":"import { Collapsible, DemoContainer, PropField } from \"@svecodocs/kit\"; Usage import { Collapsible, DemoContainer } from \"@svecodocs/kit\"; To learn more about SvelteKit, check out the $2. Example To learn more about SvelteKit, check out the $2. Props The title to display in the trigger. \"Hide\" and \"Show\" prefix will be added automatically. Whether the content should be open or closed. Override the content inside of the trigger button. The content that is collapsible.","category":"Components"},{"title":"DemoContainer","href":"/docs/components/demo-container","description":"Display a container with a border and a background color for examples/demos.","content":"import { DemoContainer, Button } from \"@svecodocs/kit\"; Often times you'll want to display some demo/example components in a container. The DemoContainer component is a great way to do this, as it aligns effortlessly with the rest of the docs theme. Usage import { DemoContainer, Button } from \"@svecodocs/ui\"; Default Brand Outline Ghost Subtle Link Example Default Brand Outline Ghost Subtle Link","category":"Components"},{"title":"Input","href":"/docs/components/input","description":"A form input component to use in examples and documentation.","content":"import { Input, Label, DemoContainer, Button } from \"@svecodocs/kit\"; When building documentation, it's often necessary to provide users with a form input to showcase a specific feature. The Input component is a great way to do this, as it aligns effortlessly with the rest of the docs theme. The Label component is also provided to help with accessibility. Usage import { Input, Label } from \"@svecodocs/kit\"; Your name Example First name Last name Update Profile","category":"Components"},{"title":"NativeSelect","href":"/docs/components/native-select","description":"A styled native select component to use in examples and documentation.","content":"import { NativeSelect, Label, DemoContainer } from \"@svecodocs/kit\"; The NativeSelect component is a styled native select component that you can use in your examples and documentation. Usage import { NativeSelect } from \"@svecodocs/kit\"; Option 1 Option 2 Option 3 Example Select an option Option 1 Option 2 Option 3","category":"Components"},{"title":"PropField","href":"/docs/components/prop-field","description":"Display a prop field with a name, type, and description.","content":"import { PropField, Collapsible } from \"@svecodocs/kit\"; Use the PropField component to annotate props/params in your documentation. Usage import { PropField } from \"@svecodocs/kit\"; The checked state of the checkbox. Examples Basic The checked state of the checkbox. Object You can use PropField in combination with the $2 component to represent more complex types. import { PropField, Collapsible } from \"@svecodocs/kit\"; Configuration options to customize the behavior of the Checkbox component. The width to apply to the checkbox. The height to apply to the checkbox. Configuration options to customize the behavior of the Checkbox component. The width to apply to the checkbox. The height to apply to the checkbox. Some Really Long Title That will Wrap Props The name of the prop. The type of the prop. The default value of the prop. Whether the prop is required. The description/content to display within the prop field.","category":"Components"},{"title":"Select","href":"/docs/components/select","description":"A select component to use in examples and documentation.","content":"import { Select, DemoContainer } from \"@svecodocs/kit\"; import SelectDemo from \"$lib/components/demos/select-demo.svelte\"; Usage import { Select } from \"@svecodocs/kit\"; Example Props See $2 for available props.","category":"Components"},{"title":"Steps","href":"/docs/components/steps","description":"Display a series of series of steps.","content":"import { Step, Steps, Callout } from \"@svecodocs/kit\"; The Steps and Step components are used to display a series of steps, breaking down a process into more manageable chunks. Usage import { Steps, Step } from \"$lib/components\"; Install the package You can install the project via npm or pnpm. Start your engines You can start the project by running npm run dev or pnpm run dev. Example Install the package You can install the project via npm or pnpm. npm install @svecodocs/ui Start your engines You can start the project by running npm run dev or pnpm dev. npm run dev If you plan to use markdown-specific syntax in your steps, ensure you include a space between the component and the content in your Markdown file.","category":"Components"},{"title":"Switch","href":"/docs/components/switch","description":"A checkbox component to use in examples and documentation.","content":"import { Switch, DemoContainer } from \"@svecodocs/kit\"; Usage import { Switch } from \"@svecodocs/kit\"; Example Props See $2 for available props.","category":"Components"},{"title":"Tabs","href":"/docs/components/tabs","description":"Break content into multiple panes to reduce cognitive load.","content":"import { Tabs, TabItem, Callout, PropField } from \"@svecodocs/kit\"; const itemsA = [\"First tab\", \"Second tab\"]; const itemsB = [\"+page.svelte\", \"+page.server.ts\"]; You can use the Tabs and TabItem components to create tabbed interfaces. A label prop must be provided to each TabItem which will be used to display the label. Whichever tab should be active by default is specified by the value prop on the Tabs component. Usage import { Tabs, TabItem } from \"@svecodocs/kit\"; const items = [\"First tab\", \"Second tab\"]; This is the first tab's content. This is the second tab's content. Examples Simple Text This is the first tab's content. This is the second tab's content. Markdown Syntax import { Button } from \"@svecodocs/kit\"; alert(\"Hello!\")}>Click me export async function load() { return { transactions: [], }; } If you plan to use markdown-specific syntax in your tabs, ensure you include a space between the component and the content in your Markdown file. Props Tabs The tab items to display. The label of the tab to be active by default. TabItem The value that identifies the tab. This value should map to an item within the items prop passed to the Tabs component.","category":"Components"},{"title":"Textarea","href":"/docs/components/textarea","description":"A textarea component to use in examples and documentation.","content":"import { Textarea, Label, DemoContainer, Button } from \"@svecodocs/kit\"; When building documentation, it's often necessary to provide users with a textarea to showcase a specific feature. The Textarea component is a great way to do this, as it aligns effortlessly with the rest of the docs theme. The Label component is also provided to help with accessibility. Usage import { Textarea, Label } from \"@svecodocs/kit\"; Your bio Example Bio Update Profile","category":"Components"},{"title":"Navigation","href":"/docs/configuration/navigation","description":"Learn how to customize the navigation in your Svecodocs project.","content":"Navigation is a key component of every site, documenting the structure of your site and providing a clear path for users to navigate through your content. Svecodocs comes with a navigation structure that is designed to be flexible and customizable. Each page in your site should have a corresponding navigation item, and the navigation items should be nested according to their hierarchy. Navigation Structure Anchors Anchors are links that are displayed at the top of the sidebar and typically used to either highlight important information or provide quick access to linked content. Sections Sections are used to group related navigation items together. They are typically used to organize content into different categories, such as \"Components\", \"Configuration\", and \"Utilities\".","category":"Configuration"},{"title":"Search","href":"/docs/configuration/search","description":"Learn how to customize the search in your Svecodocs project.","content":"The search functionality provides fast, client-side search across your documentation using FlexSearch for indexing and fuzzy matching. How It Works The search system consists of three main parts: Build-time indexing - Documents are processed and indexed during the build Static API endpoint - Search data is served from a static JSON file Client-side search - Fast, interactive search interface Build Process During the build process, the build-search-data.js script is used to generate the search index: import { fileURLToPath } from \"node:url\"; import { writeFileSync } from \"node:fs\"; import { resolve } from \"node:path\"; import { docs } from \"../.velite/index.js\"; import { defineSearchContent, cleanMarkdown } from \"@svecodocs/kit\"; const __dirname = fileURLToPath(new URL(\".\", import.meta.url)); export function buildDocsSearchIndex() { return defineSearchContent( docs.map((doc) => ({ title: doc.title, href: /docs/${doc.slug}, description: doc.description, content: cleanMarkdown(doc.raw), category: doc.section, })) ); } writeFileSync( resolve(__dirname, \"../src/routes/api/search.json/search.json\"), JSON.stringify(buildDocsSearchIndex()), { flag: \"w\" } ); This script: Imports processed documentation data from Velite Maps each document to a search entry with title, href, description, content, and optional category Uses cleanMarkdown() to remove markdown syntax from content for better search Writes the search index to a static JSON file API Endpoint The search data is served through a static API route: import type { RequestHandler } from \"@sveltejs/kit\"; import search from \"./search.json\" assert { type: \"json\" }; export const prerender = true; export const GET: RequestHandler = () => { return Response.json(search); }; This route is prerendered for optimal performance and serves the search index as JSON. Client-Side Search The search interface is implemented as a reusable Svelte component: import { onMount } from \"svelte\"; import { type SearchResult, createContentIndex, searchContentIndex } from \"./search-utils.js\"; let searchState = $state(\"loading\"); let searchQuery = $state(\"\"); onMount(async () => { const content = await fetch(\"/api/search.json\").then((res) => res.json()); if (!content) return; createContentIndex(content); searchState = \"ready\"; }); The component: Fetches search data on mount Creates FlexSearch indexes for fast querying Provides a dialog-based search interface Supports keyboard shortcut (Cmd/Ctrl + K) Search Result Structure Each search result contains: type SearchContent = { title: string; content: string; description: string; href: string; category?: string; }; type SearchResult = SearchContent & { snippet?: string; // Content snippet with highlights highlights?: string[]; // Array of highlighted terms category?: string; // Document category/section }; Search Algorithm The search uses a multi-tiered approach: Primary search: FlexSearch indexes for title and content with different weights Title matches: 10 points Content matches: 5 points Fallback search: Fuzzy matching when no exact results found Fuzzy title matches: 8 points Fuzzy content matches: 3 points Results are ranked by score and limited to 10 items. Usage Basic Integration To use the search component in your site: import Search from \"@svecodocs/kit/components/search/search.svelte\"; `","category":"Configuration"},{"title":"Theme","href":"/docs/configuration/theme","description":"Learn how to customize the theme in your Svecodocs project.","content":"The theme determines the branded color scheme for your site. A theme for each of the TailwindCSS colors is provided by the @svecodocs/kit package. Each theme has been designed to present well in both light and dark mode. Using a theme To use a theme, import the theme file into your src/app.css file before importing the @svecodocs/kit/globals.css file. /* @import \"@svecodocs/kit/theme-orange.css\"; */ @import \"@svecodocs/kit/theme-emerald.css\"; @import \"@svecodocs/kit/globals.css\"; It's not recommended to customize the theme to maintain consistency across the UI components that are provided by Svecodocs and align with the provided themes. Available themes | Theme name | Import path | | ---------- | ---------------------------------- | | orange | @svecodocs/kit/theme-orange.css | | green | @svecodocs/kit/theme-green.css | | blue | @svecodocs/kit/theme-blue.css | | purple | @svecodocs/kit/theme-purple.css | | pink | @svecodocs/kit/theme-pink.css | | lime | @svecodocs/kit/theme-lime.css | | yellow | @svecodocs/kit/theme-yellow.css | | cyan | @svecodocs/kit/theme-cyan.css | | teal | @svecodocs/kit/theme-teal.css | | violet | @svecodocs/kit/theme-violet.css | | amber | @svecodocs/kit/theme-amber.css | | red | @svecodocs/kit/theme-red.css | | sky | @svecodocs/kit/theme-sky.css | | emerald | @svecodocs/kit/theme-emerald.css | | fuchsia | @svecodocs/kit/theme-fuchsia.css | | rose | @svecodocs/kit/theme-rose.css | Tailwind Variables Svecodocs uses TailwindCSS to style the UI components and provides a set of Tailwind variables that can be used to style your examples/custom components. Gray We override the TailwindCSS gray color scale to provide our own grays. Brand You can use the brand color to use the brand color of your project.","category":"Configuration"}] \ No newline at end of file diff --git a/packages/kit/src/lib/types.ts b/packages/kit/src/lib/types.ts index df64604..df891f1 100644 --- a/packages/kit/src/lib/types.ts +++ b/packages/kit/src/lib/types.ts @@ -21,6 +21,7 @@ export type AnchorNavItem = { title: string; href: string; icon: Component; + description: string; disabled?: boolean; }; @@ -36,6 +37,7 @@ export type SidebarNavSection = { export type SidebarNavItem = { title: string; + description: string; href?: string; disabled?: boolean; external?: boolean; @@ -49,6 +51,17 @@ export type Navigation = { items?: SidebarNavItem[]; }; +export type NavigationNeighbor = { + title: string; + description: string; + href: string; +}; + +export type NavigationNeighbors = { + previous?: NavigationNeighbor; + next?: NavigationNeighbor; +}; + export type TOCEntry = { title: string; url: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a562fef..c1bea06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -103,22 +103,22 @@ importers: version: link:../packages/kit '@sveltejs/adapter-cloudflare': specifier: ^7.2.3 - version: 7.2.3(@sveltejs/kit@2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(wrangler@4.38.0(@cloudflare/workers-types@4.20250920.0)) + version: 7.2.3(@sveltejs/kit@2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(wrangler@4.38.0(@cloudflare/workers-types@4.20250920.0)) '@sveltejs/kit': specifier: 'catalog:' - version: 2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) '@sveltejs/vite-plugin-svelte': specifier: 'catalog:' - version: 6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.13(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.1.13(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) mdsx: specifier: ^0.0.6 version: 0.0.6(svelte@5.39.3) phosphor-svelte: specifier: ^3.0.1 - version: 3.0.1(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 3.0.1(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) svelte: specifier: 'catalog:' version: 5.39.3 @@ -136,10 +136,10 @@ importers: version: 0.2.4 vite: specifier: 'catalog:' - version: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-devtools-json: specifier: ^1.0.0 - version: 1.0.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 1.0.0(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) packages/kit: dependencies: @@ -238,6 +238,48 @@ importers: specifier: 'catalog:' version: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + start: + devDependencies: + '@svecodocs/kit': + specifier: latest + version: 0.5.1(@sveltejs/kit@2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(bits-ui@2.11.0(@internationalized/date@3.9.0)(svelte@5.39.3))(svelte@5.39.3)(tailwindcss@4.1.13)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@sveltejs/adapter-cloudflare': + specifier: ^7.2.3 + version: 7.2.3(@sveltejs/kit@2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(wrangler@4.38.0(@cloudflare/workers-types@4.20250920.0)) + '@sveltejs/kit': + specifier: ^2.42.0 + version: 2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': + specifier: ^6.2.0 + version: 6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@tailwindcss/vite': + specifier: ^4.1.13 + version: 4.1.13(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + mdsx: + specifier: ^0.0.6 + version: 0.0.6(svelte@5.39.3) + phosphor-svelte: + specifier: ^3.0.1 + version: 3.0.1(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + svelte: + specifier: ^5.39.3 + version: 5.39.3 + svelte-check: + specifier: ^4.3.1 + version: 4.3.1(picomatch@4.0.3)(svelte@5.39.3)(typescript@5.9.2) + tailwindcss: + specifier: ^4.1.13 + version: 4.1.13 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + velite: + specifier: ^0.2.1 + version: 0.2.4 + vite: + specifier: ^7.1.5 + version: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + packages: '@babel/runtime@7.28.4': @@ -733,18 +775,14 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} - engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-arm64@0.34.4': - resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] @@ -755,8 +793,8 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-darwin-x64@0.34.4': - resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] @@ -766,8 +804,8 @@ packages: cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.3': - resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} cpu: [arm64] os: [darwin] @@ -776,8 +814,8 @@ packages: cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.3': - resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} cpu: [x64] os: [darwin] @@ -786,8 +824,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm64@1.2.3': - resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} cpu: [arm64] os: [linux] @@ -796,13 +834,13 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.3': - resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.3': - resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} cpu: [ppc64] os: [linux] @@ -811,8 +849,8 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.3': - resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} cpu: [s390x] os: [linux] @@ -821,8 +859,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.3': - resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} cpu: [x64] os: [linux] @@ -831,8 +869,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': - resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} cpu: [arm64] os: [linux] @@ -841,8 +879,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.3': - resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} cpu: [x64] os: [linux] @@ -852,8 +890,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linux-arm64@0.34.4': - resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] @@ -864,14 +902,14 @@ packages: cpu: [arm] os: [linux] - '@img/sharp-linux-arm@0.34.4': - resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.4': - resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] @@ -882,8 +920,8 @@ packages: cpu: [s390x] os: [linux] - '@img/sharp-linux-s390x@0.34.4': - resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] @@ -894,8 +932,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-x64@0.34.4': - resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] @@ -906,8 +944,8 @@ packages: cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.4': - resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] @@ -918,8 +956,8 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.4': - resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] @@ -929,13 +967,13 @@ packages: engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-wasm32@0.34.4': - resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.4': - resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] @@ -946,8 +984,8 @@ packages: cpu: [ia32] os: [win32] - '@img/sharp-win32-ia32@0.34.4': - resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] @@ -958,8 +996,8 @@ packages: cpu: [x64] os: [win32] - '@img/sharp-win32-x64@0.34.4': - resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1220,6 +1258,14 @@ packages: '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@svecodocs/kit@0.5.1': + resolution: {integrity: sha512-+4LHoOR6/XcOmt/lwkMkfjciezYqzwb8wGQK2unkVjVX4IC0U0mJFWL80VRH+3YcqLWhsj+MSD1kPjk5cMY2Kw==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + bits-ui: ^2.11.0 + svelte: ^5.0.0 + tailwindcss: ^4.0.0 + '@sveltejs/acorn-typescript@1.0.5': resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} peerDependencies: @@ -1396,6 +1442,9 @@ packages: '@types/node@22.18.6': resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==} + '@types/node@24.1.0': + resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -2804,8 +2853,8 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - sharp@0.34.4: - resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -3020,6 +3069,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + undici@7.14.0: resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} engines: {node: '>=20.18.1'} @@ -3624,16 +3676,14 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/colour@1.0.0': {} - '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-arm64@0.34.4': + '@img/sharp-darwin-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 optional: true '@img/sharp-darwin-x64@0.33.5': @@ -3641,60 +3691,60 @@ snapshots: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.34.4': + '@img/sharp-darwin-x64@0.34.3': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.0 optional: true '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.3': + '@img/sharp-libvips-darwin-arm64@1.2.0': optional: true '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.3': + '@img/sharp-libvips-darwin-x64@1.2.0': optional: true '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.3': + '@img/sharp-libvips-linux-arm64@1.2.0': optional: true '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-arm@1.2.3': + '@img/sharp-libvips-linux-arm@1.2.0': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.3': + '@img/sharp-libvips-linux-ppc64@1.2.0': optional: true '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-s390x@1.2.3': + '@img/sharp-libvips-linux-s390x@1.2.0': optional: true '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.3': + '@img/sharp-libvips-linux-x64@1.2.0': optional: true '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': optional: true '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.3': + '@img/sharp-libvips-linuxmusl-x64@1.2.0': optional: true '@img/sharp-linux-arm64@0.33.5': @@ -3702,9 +3752,9 @@ snapshots: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm64@0.34.4': + '@img/sharp-linux-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.0 optional: true '@img/sharp-linux-arm@0.33.5': @@ -3712,14 +3762,14 @@ snapshots: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-arm@0.34.4': + '@img/sharp-linux-arm@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.0 optional: true - '@img/sharp-linux-ppc64@0.34.4': + '@img/sharp-linux-ppc64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.0 optional: true '@img/sharp-linux-s390x@0.33.5': @@ -3727,9 +3777,9 @@ snapshots: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-s390x@0.34.4': + '@img/sharp-linux-s390x@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.0 optional: true '@img/sharp-linux-x64@0.33.5': @@ -3737,9 +3787,9 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linux-x64@0.34.4': + '@img/sharp-linux-x64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.0 optional: true '@img/sharp-linuxmusl-arm64@0.33.5': @@ -3747,9 +3797,9 @@ snapshots: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.4': + '@img/sharp-linuxmusl-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 optional: true '@img/sharp-linuxmusl-x64@0.33.5': @@ -3757,9 +3807,9 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.4': + '@img/sharp-linuxmusl-x64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 optional: true '@img/sharp-wasm32@0.33.5': @@ -3767,24 +3817,24 @@ snapshots: '@emnapi/runtime': 1.5.0 optional: true - '@img/sharp-wasm32@0.34.4': + '@img/sharp-wasm32@0.34.3': dependencies: '@emnapi/runtime': 1.5.0 optional: true - '@img/sharp-win32-arm64@0.34.4': + '@img/sharp-win32-arm64@0.34.3': optional: true '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-ia32@0.34.4': + '@img/sharp-win32-ia32@0.34.3': optional: true '@img/sharp-win32-x64@0.33.5': optional: true - '@img/sharp-win32-x64@0.34.4': + '@img/sharp-win32-x64@0.34.3': optional: true '@inquirer/external-editor@1.0.2(@types/node@22.18.6)': @@ -4036,14 +4086,39 @@ snapshots: '@standard-schema/spec@1.0.0': {} + '@svecodocs/kit@0.5.1(@sveltejs/kit@2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(bits-ui@2.11.0(@internationalized/date@3.9.0)(svelte@5.39.3))(svelte@5.39.3)(tailwindcss@4.1.13)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@sveltejs/kit': 2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + bits-ui: 2.11.0(@internationalized/date@3.9.0)(svelte@5.39.3) + clsx: 2.1.1 + flexsearch: 0.7.43 + mode-watcher: 1.1.0(svelte@5.39.3) + phosphor-svelte: 3.0.1(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + rehype-autolink-headings: 7.1.0 + rehype-pretty-code: 0.14.1(shiki@1.29.2) + rehype-slug: 6.0.0 + remark-gfm: 4.0.1 + remove-markdown: 0.5.5 + shiki: 1.29.2 + svelte: 5.39.3 + svelte-toolbelt: 0.10.5(svelte@5.39.3) + tailwind-merge: 3.3.1 + tailwind-variants: 1.0.0(tailwindcss@4.1.13) + tailwindcss: 4.1.13 + tw-animate-css: 1.3.8 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + - vite + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': dependencies: acorn: 8.15.0 - '@sveltejs/adapter-cloudflare@7.2.3(@sveltejs/kit@2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(wrangler@4.38.0(@cloudflare/workers-types@4.20250920.0))': + '@sveltejs/adapter-cloudflare@7.2.3(@sveltejs/kit@2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(wrangler@4.38.0(@cloudflare/workers-types@4.20250920.0))': dependencies: '@cloudflare/workers-types': 4.20250920.0 - '@sveltejs/kit': 2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@sveltejs/kit': 2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) worktop: 0.8.0-next.18 wrangler: 4.38.0(@cloudflare/workers-types@4.20250920.0) @@ -4066,6 +4141,25 @@ snapshots: svelte: 5.39.3 vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + '@sveltejs/kit@2.42.2(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@standard-schema/spec': 1.0.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.3.2 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.19 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.2 + svelte: 5.39.3 + vite: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + '@sveltejs/package@2.5.0(svelte@5.39.3)(typescript@5.9.2)': dependencies: chokidar: 4.0.3 @@ -4086,6 +4180,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + debug: 4.4.3 + svelte: 5.39.3 + vite: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + '@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) @@ -4098,6 +4201,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.0(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + debug: 4.4.3 + deepmerge: 4.3.1 + magic-string: 0.30.19 + svelte: 5.39.3 + vite: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color + '@svitejs/changesets-changelog-github-compact@1.2.0': dependencies: '@changesets/get-github-info': 0.6.0 @@ -4180,6 +4295,13 @@ snapshots: tailwindcss: 4.1.13 vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + '@tailwindcss/vite@4.1.13(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.1.13 + '@tailwindcss/oxide': 4.1.13 + tailwindcss: 4.1.13 + vite: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + '@types/cookie@0.6.0': {} '@types/debug@4.1.12': @@ -4212,6 +4334,11 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@24.1.0': + dependencies: + undici-types: 7.8.0 + optional: true + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -5707,6 +5834,14 @@ snapshots: optionalDependencies: vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + phosphor-svelte@3.0.1(svelte@5.39.3)(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): + dependencies: + estree-walker: 3.0.3 + magic-string: 0.30.19 + svelte: 5.39.3 + optionalDependencies: + vite: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -6008,34 +6143,34 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - sharp@0.34.4: + sharp@0.34.3: dependencies: - '@img/colour': 1.0.0 + color: 4.2.3 detect-libc: 2.1.0 semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.4 - '@img/sharp-darwin-x64': 0.34.4 - '@img/sharp-libvips-darwin-arm64': 1.2.3 - '@img/sharp-libvips-darwin-x64': 1.2.3 - '@img/sharp-libvips-linux-arm': 1.2.3 - '@img/sharp-libvips-linux-arm64': 1.2.3 - '@img/sharp-libvips-linux-ppc64': 1.2.3 - '@img/sharp-libvips-linux-s390x': 1.2.3 - '@img/sharp-libvips-linux-x64': 1.2.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - '@img/sharp-linux-arm': 0.34.4 - '@img/sharp-linux-arm64': 0.34.4 - '@img/sharp-linux-ppc64': 0.34.4 - '@img/sharp-linux-s390x': 0.34.4 - '@img/sharp-linux-x64': 0.34.4 - '@img/sharp-linuxmusl-arm64': 0.34.4 - '@img/sharp-linuxmusl-x64': 0.34.4 - '@img/sharp-wasm32': 0.34.4 - '@img/sharp-win32-arm64': 0.34.4 - '@img/sharp-win32-ia32': 0.34.4 - '@img/sharp-win32-x64': 0.34.4 + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 shebang-command@2.0.0: dependencies: @@ -6257,6 +6392,9 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.8.0: + optional: true + undici@7.14.0: {} unenv@2.0.0-rc.21: @@ -6318,7 +6456,7 @@ snapshots: dependencies: '@mdx-js/mdx': 3.1.1 esbuild: 0.25.10 - sharp: 0.34.4 + sharp: 0.34.3 terser: 5.44.0 transitivePeerDependencies: - supports-color @@ -6338,10 +6476,10 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-devtools-json@1.0.0(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): + vite-plugin-devtools-json@1.0.0(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: uuid: 11.1.0 - vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): dependencies: @@ -6359,10 +6497,30 @@ snapshots: terser: 5.44.0 yaml: 2.8.1 + vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.1.0 + fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + terser: 5.44.0 + yaml: 2.8.1 + vitefu@1.1.1(vite@7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): optionalDependencies: vite: 7.1.6(@types/node@22.18.6)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vitefu@1.1.1(vite@7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): + optionalDependencies: + vite: 7.1.6(@types/node@24.1.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + web-namespaces@2.0.1: {} webidl-conversions@3.0.1: {} From ebc627028d59b45fea2ec47d954be2affae35b1b Mon Sep 17 00:00:00 2001 From: theetherGit Date: Thu, 4 Dec 2025 17:29:49 +0530 Subject: [PATCH 3/5] chore: formatting --- .../layout/navigation-neighbors.svelte | 64 ++++++++++++++----- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/packages/kit/src/lib/components/layout/navigation-neighbors.svelte b/packages/kit/src/lib/components/layout/navigation-neighbors.svelte index ec0acdb..e60b2b1 100644 --- a/packages/kit/src/lib/components/layout/navigation-neighbors.svelte +++ b/packages/kit/src/lib/components/layout/navigation-neighbors.svelte @@ -1,39 +1,69 @@ {#if navigationNeighbors} -
+
{#if navigationNeighbors?.previous} - {/if} {#if navigationNeighbors?.next} - {/if}
-{/if} \ No newline at end of file +{/if} From 748ef2bc6bd0f8251a7e5555e3de359a1a637759 Mon Sep 17 00:00:00 2001 From: theetherGit Date: Thu, 4 Dec 2025 17:47:06 +0530 Subject: [PATCH 4/5] fix(package): handle external links --- .../src/lib/components/layout/navigation-neighbors.svelte | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/lib/components/layout/navigation-neighbors.svelte b/packages/kit/src/lib/components/layout/navigation-neighbors.svelte index e60b2b1..0f8677e 100644 --- a/packages/kit/src/lib/components/layout/navigation-neighbors.svelte +++ b/packages/kit/src/lib/components/layout/navigation-neighbors.svelte @@ -12,9 +12,11 @@ {#if navigationNeighbors}
{#if navigationNeighbors?.previous} + {@const isExternalLink = !navigationNeighbors.previous.href.startsWith("/")} {/if} {#if navigationNeighbors?.next} + {@const isExternalLink = !navigationNeighbors.next.href.startsWith("/")}
diff --git a/packages/kit/src/lib/components/layout/navigation-neighbors.svelte b/packages/kit/src/lib/components/layout/navigation-neighbors.svelte index 0f8677e..20c503a 100644 --- a/packages/kit/src/lib/components/layout/navigation-neighbors.svelte +++ b/packages/kit/src/lib/components/layout/navigation-neighbors.svelte @@ -2,20 +2,18 @@ import type { NavigationNeighbors } from "$lib/types.js"; import { Button } from "$lib/components/ui/button/index.js"; - type Props = { - navigationNeighbors: NavigationNeighbors; - }; + type Props = NavigationNeighbors; - let { navigationNeighbors }: Props = $props(); + let { previous, next }: Props = $props(); -{#if navigationNeighbors} +{#if previous || next}
- {#if navigationNeighbors?.previous} - {@const isExternalLink = !navigationNeighbors.previous.href.startsWith("/")} + {#if previous} + {@const isExternalLink = !previous.href.startsWith("/")}

- {navigationNeighbors.previous.description} + {previous.description}

{/if} - {#if navigationNeighbors?.next} - {@const isExternalLink = !navigationNeighbors.next.href.startsWith("/")} + {#if next} + {@const isExternalLink = !next.href.startsWith("/")} {/if}