diff --git a/.github/workflows/build-preview.yml b/.github/workflows/build-preview.yml index 34ec19f..e00db0f 100644 --- a/.github/workflows/build-preview.yml +++ b/.github/workflows/build-preview.yml @@ -30,5 +30,5 @@ jobs: uses: actions/upload-artifact@v4 with: name: preview-build - path: sites/docs/.svelte-kit + path: docs/.svelte-kit include-hidden-files: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 134ca19..e77eff3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,10 @@ jobs: - run: pnpm --filter "./packages/*" build + # Build the docs site before `pnpm check`: it generates the `content-collections` + # module at build time, which the type-check then consumes. + - run: pnpm --filter "./docs" build + - run: pnpm check - run: pnpm lint @@ -36,5 +40,3 @@ jobs: - run: pnpm test:unit env: CI: true - - - run: pnpm --filter "./sites/*" build diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml index aa201e4..5515868 100644 --- a/.github/workflows/deploy-prod.yml +++ b/.github/workflows/deploy-prod.yml @@ -4,7 +4,7 @@ on: branches: - main paths: - - sites/docs/** + - docs/** - packages/** jobs: @@ -36,5 +36,5 @@ jobs: githubToken: ${{ secrets.GITHUB_TOKEN }} projectName: layerstack directory: ./.svelte-kit/cloudflare - workingDirectory: sites/docs + workingDirectory: docs deploymentName: Production diff --git a/.gitignore b/.gitignore index 5535d88..a825ad2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,11 @@ coverage/ .env .DS_Store +# Generated by @content-collections and the docs markdown live-code pipeline +.content-collections/ +.live-code/ + +# Playwright MCP run artifacts +.playwright-mcp/ + test-* \ No newline at end of file diff --git a/docs/.prettierignore b/docs/.prettierignore new file mode 100644 index 0000000..0c08ad4 --- /dev/null +++ b/docs/.prettierignore @@ -0,0 +1,18 @@ +.DS_Store +node_modules +/build +/dist +/.svelte-kit +/.content-collections +/.live-code +/.wrangler +/package +.env +.env.* +!.env.example +coverage/ + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/sites/docs/CHANGELOG.md b/docs/CHANGELOG.md similarity index 100% rename from sites/docs/CHANGELOG.md rename to docs/CHANGELOG.md diff --git a/sites/docs/LICENSE b/docs/LICENSE similarity index 100% rename from sites/docs/LICENSE rename to docs/LICENSE diff --git a/sites/docs/README.md b/docs/README.md similarity index 100% rename from sites/docs/README.md rename to docs/README.md diff --git a/docs/content-collections.ts b/docs/content-collections.ts new file mode 100644 index 0000000..2177078 --- /dev/null +++ b/docs/content-collections.ts @@ -0,0 +1,10 @@ +import { createContentConfig } from '@layerstack/docs/content-collections'; + +export default createContentConfig({ + // LayerStack is a multi-package monorepo; docs are authored as `reference` content + // organized by package under `src/content/reference//.md`. + packageName: 'layerstack', + repo: 'techniq/layerstack', + // `docs` -> repo root `packages` + packagesRoot: '../packages', +}); diff --git a/docs/mdsx.config.js b/docs/mdsx.config.js new file mode 100644 index 0000000..b89cf6c --- /dev/null +++ b/docs/mdsx.config.js @@ -0,0 +1,7 @@ +import { createMdsxConfig } from '@layerstack/docs/markdown/config'; + +export const mdsxConfig = createMdsxConfig({ + markdownComponentsPath: '@layerstack/docs/markdown/components', + exampleComponentPath: '$lib/components', + liveCodeComponent: '@layerstack/docs/markdown/components/LiveCode.svelte', +}); diff --git a/sites/docs/package.json b/docs/package.json similarity index 76% rename from sites/docs/package.json rename to docs/package.json index e2e4a1c..0da8a6a 100644 --- a/sites/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { - "name": "@layerstack/docs", - "description": "A collection of Svelte actions, stores and general utils", + "name": "@layerstack/docs-site", + "description": "Documentation site for LayerStack", "author": "Sean Lynch ", "license": "MIT", "private": true, @@ -12,16 +12,19 @@ "preview": "vite preview", "package": "svelte-package", "prepublishOnly": "svelte-package", - "check": "svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --check .", - "format": "prettier --write .", - "prepare": "svelte-kit sync" + "format": "prettier --write ." }, "devDependencies": { "@changesets/cli": "^2.29.4", + "@content-collections/core": "^0.14.3", + "@content-collections/markdown": "^0.1.4", + "@content-collections/vite": "^0.2.9", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@iconify-json/lucide": "^1.2.53", + "@iconify-json/simple-icons": "^1.2.84", "@sveltejs/adapter-cloudflare": "^7.0.3", "@sveltejs/kit": "^2.21.0", "@sveltejs/package": "^2.3.11", @@ -29,16 +32,14 @@ "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.1.5", "@types/d3-array": "^3.2.1", - "@types/prismjs": "^1.26.5", - "mdsvex": "^0.12.5", + "mdsx": "^0.0.7", "posthog-js": "^1.239.0", "prettier": "^3.5.3", "prettier-plugin-svelte": "^3.3.3", "rehype-slug": "^6.0.0", "svelte": "^5.28.2", "svelte-check": "^4.1.6", - "svelte-json-tree": "^2.2.0", - "svelte-ux": "2.0.0-next.13", + "svelte-ux": "2.0.0-next.22", "svelte2tsx": "^0.7.36", "tailwindcss": "^4.1.5", "tslib": "^2.8.1", @@ -49,7 +50,9 @@ }, "type": "module", "dependencies": { + "@fontsource-variable/inter": "^5.2.8", "@fortawesome/fontawesome-common-types": "^6.7.2", + "@layerstack/docs": "workspace:*", "@layerstack/svelte-actions": "workspace:*", "@layerstack/svelte-state": "workspace:*", "@layerstack/svelte-stores": "workspace:*", @@ -59,10 +62,6 @@ "@mdi/js": "^7.4.47", "clsx": "^2.1.1", "d3-array": "^3.2.4", - "prism-svelte": "^0.5.0", - "prism-themes": "^1.9.0", - "prismjs": "^1.30.0", - "sveld": "^0.22.1", "tailwind-merge": "^3.2.0" }, "peerDependencies": { diff --git a/sites/docs/src/app.d.ts b/docs/src/app.d.ts similarity index 88% rename from sites/docs/src/app.d.ts rename to docs/src/app.d.ts index 23f62aa..637b6ee 100644 --- a/sites/docs/src/app.d.ts +++ b/docs/src/app.d.ts @@ -1,4 +1,4 @@ -/// +/// export * from 'unplugin-icons/types/svelte'; // See https://kit.svelte.dev/docs/types#app diff --git a/sites/docs/src/app.html b/docs/src/app.html similarity index 100% rename from sites/docs/src/app.html rename to docs/src/app.html diff --git a/docs/src/content/guides/LLMs.md b/docs/src/content/guides/LLMs.md new file mode 100644 index 0000000..cacec19 --- /dev/null +++ b/docs/src/content/guides/LLMs.md @@ -0,0 +1,49 @@ +--- +title: LLMs +description: Using the LayerStack documentation with LLMs +order: 99 +--- + + + +The LayerStack documentation is designed to be useful both for human developers working alongside LLMs and for large language models ingesting the docs directly. + +## :icon{name="lucide:user" class="relative -top-1"} For the humans + + + +At the top of each documentation page — and demonstrated above — you'll find a button that copies the page's documentation as Markdown to your clipboard. The dropdown also offers handy options such as viewing the source or opening the page in a chat assistant. + +::note +The `View Component source` option is only shown for pages with a linked source file. +:: + +## :icon{name="lucide:bot" class="relative -top-1"} For the bots + +LayerStack adopts the [llms.txt](https://llmstxt.org/) proposal — a structured, machine-readable format optimized for LLMs — so tools and AI systems can efficiently parse the documentation. + +## LLM-friendly documentation + +::steps + +### Per page + +Append `/llms.txt` to any documentation page's URL to get its content as plain-text, LLM-optimized Markdown — the same text the `Copy Page` button copies. + +:::tip +**Standard page**: [/docs/svelte-stores/debounceStore](/docs/svelte-stores/debounceStore) + +**LLM-friendly version**: [/docs/svelte-stores/debounceStore/llms.txt](/docs/svelte-stores/debounceStore/llms.txt) +::: + +### Root index + +To explore every page in LLM-friendly format, visit the root index at [llms.txt](/llms.txt). + +### Complete documentation + +For a single, consolidated document containing all of the documentation, see [/docs/llms.txt](/docs/llms.txt). + +:: diff --git a/docs/src/content/guides/docs/authoring.md b/docs/src/content/guides/docs/authoring.md new file mode 100644 index 0000000..0437750 --- /dev/null +++ b/docs/src/content/guides/docs/authoring.md @@ -0,0 +1,65 @@ +--- +title: Authoring content +description: Directory layout, frontmatter, source inference, and examples. +order: 3 +--- + +Docs are plain markdown under `src/content/`, with live Svelte examples under +`src/examples/`. Adding a page is usually just dropping in a `.md` file — the nav, table of +contents, search index, and edit link all derive from it automatically. + +## Directory layout + +``` +src/content/ + reference//.md # references collection (hand-authored) + guides/.md # guides — nest in subdirs to form categories +src/examples/ + components//.svelte # referenced by :example{name="…"} +``` + +This page lives at `src/content/guides/docs/authoring.md` — the `docs/` subdirectory becomes +the **Docs** category you see in the sidebar. + +## Frontmatter + +```md +--- +title: SelectionState # required; becomes the page `name` +description: Manage a set of selected items +related: # cross-links (slug, or full URL) + - svelte-state/UniqueState +order: 1 # optional manual sort within a group +status: beta # optional badge (reference) +hideTableOfContents: false +--- +``` + +Guides accept `title`, `description`, `category`, `order`, `draft`. References add `related`, +`features`, `status`, `kind`, `sourceFile`, `hideUsage`, and more. Full schemas live in the +framework's `content-collections` config. + +## Source-file inference (reference) + +A reference doc's source file is inferred from its path — +`src/content/reference//.md` → `//src/lib/.{ts,svelte.ts}` +(with a camelCase fallback: `Duration` → `duration.ts`, `SelectionState` → +`selectionState.svelte.ts`). Add a `sourceFile:` frontmatter only to override. + +## Examples + +Reference a Svelte example from markdown with the `:example` directive: + +```md +:example{name="basic" showCode} +``` + +The `name` resolves to `src/examples/components//.svelte`. Supported props: +`name`, `component`, `path`, `showCode`, `highlight` (e.g. `"7"` or `"7-9"`), and `class`. +The example's `?raw` source powers both the show-code toggle and the inlined `llms.txt` +output. + +:::note +For all the markdown rendering features — callouts, tabs, steps, code highlighting, live +code — see [Markdown & directives](/docs/guides/docs/markdown). +::: diff --git a/docs/src/content/guides/docs/cli.md b/docs/src/content/guides/docs/cli.md new file mode 100644 index 0000000..267000c --- /dev/null +++ b/docs/src/content/guides/docs/cli.md @@ -0,0 +1,46 @@ +--- +title: CLI & generators +description: Build-time generation for component docs via the layerstack-docs CLI. +order: 5 +--- + +`@layerstack/docs` ships a `layerstack-docs` binary with build-time generators. Hand-authored +reference sites (like this one) don't need them; **generated** component-doc sites (like +[LayerChart](https://layerchart.com)) use them to produce API tables, example catalogs, +screenshots, StackBlitz bundles, and release notes. + +## Wiring + +Run cheap generators in `prebuild`; run heavy/committed artifacts (catalogs, screenshots) +manually. + +```jsonc title="package.json" +{ + "scripts": { + "prebuild": "pnpm generate:api && pnpm generate:stackblitz && pnpm generate:releases", + "generate:api": "layerstack-docs generate-api ../packages//src/lib/components generated/api", + "generate:catalog": "layerstack-docs generate-catalog ../packages//src/lib/components src/examples/components src/examples/catalog", + "generate:screenshots": "layerstack-docs generate-screenshots src/examples/components static/screenshots", + "generate:stackblitz": "layerstack-docs generate-stackblitz src static/stackblitz-files.json [remote-sources.json]", + "generate:releases": "layerstack-docs generate-releases techniq/ generated/releases", + }, +} +``` + +## Commands + +| Command | Arguments | Generates | +| ---------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------- | +| `generate-api` | ` ` | Per-component prop API JSON (via the TypeScript compiler) | +| `generate-catalog` | ` ` | Per-component example + cross-usage catalogs | +| `generate-screenshots` | ` [--base-url] [--route-base] [--all]` | Responsive light/dark WebP screenshots (Playwright + sharp) | +| `generate-stackblitz` | ` [remote-sources-file] [--template-dir] [--source] [--remote]` | A StackBlitz/WebContainer file bundle | +| `generate-releases` | ` ` | GitHub releases → frontmatter markdown files | + +The output under `generated/api/*` and `generated/releases/*` is picked up automatically by +the `references`/`components`/`releases` collections. + +:::note +`generate-stackblitz` uses the package's bundled template at `templates/stackblitz-template` +by default; pass `--template-dir` to override it. +::: diff --git a/docs/src/content/guides/docs/getting-started.md b/docs/src/content/guides/docs/getting-started.md new file mode 100644 index 0000000..9aaa7cd --- /dev/null +++ b/docs/src/content/guides/docs/getting-started.md @@ -0,0 +1,56 @@ +--- +title: Getting started +description: What @layerstack/docs is, and how a documentation site fits together. +order: 1 +--- + +`@layerstack/docs` is a reusable documentation framework. It turns a folder of markdown +and Svelte example files into a full documentation site — markdown rendering, content +collections, doc UI components, client-side search, `llms.txt` output, and a build-time +CLI — so each project only writes content and a thin layer of glue. + +These very pages are built with it. + +## What it provides + +- **Markdown rendering** — a shared [mdsx](https://github.com/huntabyte/mdsx) config with + GFM, MDC directives, Shiki syntax highlighting, automatic heading slugs, and styled + element components. +- **Content collections** — a [content-collections](https://www.content-collections.dev/) + factory that turns `src/content/**/*.md` into typed collections (`references`, `guides`, + `components`, `utils`, `releases`) with TOC, source links, and generated data attached. +- **Doc UI components** — `Code`, `Search`, `TableOfContents`, `OpenWithButton`, + `RelatedLink`, `ExampleScreenshot`, and more. +- **Search** — a FlexSearch index served from a prerendered `/api/search.json`, surfaced by + the `Search` command palette (`⌘K`). +- **`llms.txt`** — helpers that emit LLM-friendly markdown endpoints. +- **CLI (`layerstack-docs`)** — generators for component API JSON, example catalogs, + screenshots, StackBlitz bundles, and release notes. + +## How it fits together + +The framework owns the **mechanics**; your app owns the **content** and a small amount of +**glue** (mostly because `import.meta.glob` must be evaluated in your project root). + +| Responsibility | Owner | +| --------------------------------------------------------------- | -------------- | +| Markdown/mdsx pipeline, content-collection schemas & transforms | **framework** | +| Doc UI components, search, `llms.txt` assembly, CLI generators | **framework** | +| `content/**/*.md` + `examples/**/*.svelte` source | **you** | +| `import.meta.glob` wiring (`src/lib/content.ts`, `examples.ts`) | **you** (thin) | +| Routes, app shell, nav, theme | **you** | + +## Two shapes of docs site + +- **Hand-authored reference docs** — like LayerStack. Uses the `references` + `guides` + collections; source files are inferred by convention; no generators. +- **Generated component docs** — like [LayerChart](https://layerchart.com). Uses + `components`/`utils`/`guides` collections plus the CLI generators (API tables, example + catalogs, screenshots, StackBlitz, releases). + +## Next + +- [Setup](/docs/guides/docs/setup) — wire up a new docs site. +- [Authoring content](/docs/guides/docs/authoring) — directory layout, frontmatter, examples. +- [Markdown & directives](/docs/guides/docs/markdown) — the rendering features, live. +- [CLI & generators](/docs/guides/docs/cli) — build-time generation for component docs. diff --git a/docs/src/content/guides/docs/markdown.md b/docs/src/content/guides/docs/markdown.md new file mode 100644 index 0000000..d6f3434 --- /dev/null +++ b/docs/src/content/guides/docs/markdown.md @@ -0,0 +1,235 @@ +--- +title: Markdown & directives +description: Syntax highlighting, callouts, tabs, steps, live code, and more — rendered live. +order: 4 +--- + +Every page is markdown processed by the framework's [mdsx](https://github.com/huntabyte/mdsx) +pipeline: GFM, [MDC directives](https://content.nuxt.com/docs/files/markdown#mdc-syntax), and +[Shiki](https://shiki.style/) highlighting. Each feature below shows its source followed by +the rendered result. + +## Code blocks + +Supported meta: `title`, `live`, `diff`, `showLineNumbers`, and line highlighting like +`{2,5-7}`. + +````md +```svelte + + +
Hello
+``` +```` + +```svelte + + +
Hello
+``` + +### Line numbers + +````md +```ts showLineNumbers +const items = await load(); +const total = items.reduce((sum, d) => sum + d.value, 0); +const average = total / items.length; +``` +```` + +```ts showLineNumbers +const items = await load(); +const total = items.reduce((sum, d) => sum + d.value, 0); +const average = total / items.length; +``` + +### Diff + +````md +```diff +- const label = 'old'; ++ const label = 'new'; +``` +```` + +```diff +- const label = 'old'; ++ const label = 'new'; +``` + +### Line highlighting + +````md +```ts {2,4} +const a = 1; +const b = 2; // highlighted +const c = 3; +const d = 4; // highlighted +``` +```` + +```ts {2,4} +const a = 1; +const b = 2; // highlighted +const c = 3; +const d = 4; // highlighted +``` + +### Title + +````md +```svelte title="+layout.svelte" + +``` +```` + +```svelte title="+layout.svelte" + +``` + +### Live code + +A ` ```svelte live ` block renders an interactive preview above its source. + +````md +```svelte live title="Counter.svelte" + + + +``` +```` + +```svelte live title="Counter.svelte" + + + +``` + +## Callouts + +```md +:::note +A neutral aside. +::: +``` + +:::note +A neutral aside. +::: + +:::tip +A helpful suggestion. +::: + +:::warning +Something to be careful about. +::: + +:::caution +This action cannot be undone. +::: + +## Steps + +````md +:::steps + +## Install + +```bash +pnpm add @layerstack/docs +``` + +## Configure + +Wire up `content-collections.ts` and `mdsx.config.js`. + +## Profit + +Author markdown and you're done. +::: +```` + +:::steps + +## Install + +```bash +pnpm add @layerstack/docs +``` + +## Configure + +Wire up `content-collections.ts` and `mdsx.config.js`. + +## Profit + +Author markdown and you're done. +::: + +## Tabs + +```md +:::tabs + +::tab{label="npm" icon="simple-icons:npm"} +`npm i @layerstack/docs` +:: + +::tab{label="pnpm" icon="simple-icons:pnpm"} +`pnpm add @layerstack/docs` +:: + +::: +``` + +:::tabs + +::tab{label="npm" icon="simple-icons:npm"} +`npm i @layerstack/docs` +:: + +::tab{label="pnpm" icon="simple-icons:pnpm"} +`pnpm add @layerstack/docs` +:: + +::: + +## Icons + +```md +A :icon{name="lucide:rocket" class="text-primary"} rocket and a +:icon{name="simple-icons:github"} GitHub logo, inline. +``` + +A :icon{name="lucide:rocket" class="text-primary"} rocket and a +:icon{name="simple-icons:github"} GitHub logo, inline. + +## Tables + +`:---` left-aligns, `---:` right-aligns, `:---:` centers. + +```md +| First | Second | Third | +| :---- | :----: | ----: | +| 1 | 2 | 3 | +``` + +| First | Second | Third | +| :---- | :----: | ----: | +| 1 | 2 | 3 | + +## Links + +- On-domain links open in the same tab: [Setup](/docs/guides/docs/setup) +- External links open in a new tab with an arrow: [LayerStack](https://layerstack.dev) +- Hash links jump to a heading: [Back to top](#markdown--directives) diff --git a/docs/src/content/guides/docs/setup.md b/docs/src/content/guides/docs/setup.md new file mode 100644 index 0000000..b9367cd --- /dev/null +++ b/docs/src/content/guides/docs/setup.md @@ -0,0 +1,154 @@ +--- +title: Setup +description: Wire up a new documentation site with @layerstack/docs. +order: 2 +--- + +A docs app is a SvelteKit project that depends on `@layerstack/docs` and follows this shape: + +``` +docs-app/ + content-collections.ts # createContentConfig({ packageName, repo }) + mdsx.config.js # createMdsxConfig({ exampleComponentPath }) + svelte.config.js # mdsx preprocessor + `content-collections` alias + vite.config.js # tailwind + sveltekit + contentCollections + Icons + src/ + routes/ + app.css # tailwind + @layerstack/*/…css imports + docs/[…]/+page.{ts,svelte} # markdown renderers (+ llms.txt/+server.ts) + api/search.json/+server.ts # prerendered search index + lib/ + content.ts # createContentLoaders(...) + examples.ts # createGlobExampleLoaders(...) + content/ # *.md docs (reference/ | guides/ | …) + examples/ # *.svelte examples referenced from markdown +``` + +:::tip +The fastest path is to copy this site (`@layerstack/docs-site`) or +[LayerChart's docs](https://github.com/techniq/layerchart/tree/main/docs) and adjust. +::: + +## Content collections + +```ts title="content-collections.ts" +import { createContentConfig } from '@layerstack/docs/content-collections'; + +export default createContentConfig({ + packageName: 'layerstack', + repo: 'techniq/layerstack', + packagesRoot: '../packages', // used to infer source files +}); +``` + +The factory defines all five collections with their schemas, slug/name derivation, TOC +extraction, and GitHub source-URL inference — you author zero schema logic. + +## Markdown + +```js title="mdsx.config.js" +import { createMdsxConfig } from '@layerstack/docs/markdown/config'; + +export const mdsxConfig = createMdsxConfig({ + markdownComponentsPath: '@layerstack/docs/markdown/components', + exampleComponentPath: '$lib/components', // your local renderer + liveCodeComponent: '@layerstack/docs/markdown/components/LiveCode.svelte', +}); +``` + +## SvelteKit & Vite + +```js title="svelte.config.js" +extensions: ['.svelte', '.md'], +preprocess: [mdsx(mdsxConfig), vitePreprocess()], +kit: { + alias: { + $examples: 'src/examples', + // required so `import { allReferences } from 'content-collections'` resolves: + 'content-collections': './.content-collections/generated', + }, +}, +``` + +```js title="vite.config.js" +plugins: [tailwindcss(), sveltekit(), contentCollections(), Icons({ compiler: 'svelte' })], +``` + +:::warning +`@layerstack/docs` is consumed from its built `dist/` (it relies on its `exports` map), so +**the framework must be built before the docs app builds.** Don't source-alias it. +::: + +## Styles + +```css title="app.css" +@import 'tailwindcss'; +@import '@layerstack/tailwind/core.css'; +@import '@layerstack/tailwind/utils.css'; +@import '@layerstack/tailwind/themes/all.css'; +@import '@layerstack/docs/styles.css'; + +/* Tailwind must scan the framework's compiled components: */ +@source '../../node_modules/svelte-ux/dist'; +@source '../../node_modules/@layerstack/docs/dist'; + +@plugin '@tailwindcss/typography'; +``` + +## The `src/lib` glue + +Two small files hand your `import.meta.glob` (which must live in your project root) to the +framework factories. + +```ts title="src/lib/examples.ts" +import type { Component } from 'svelte'; +import { createGlobExampleLoaders } from '@layerstack/docs/examples'; + +export const { loadExample, loadExamples, loadExampleByPath } = createGlobExampleLoaders({ + loadComponentExample: (type, component, name) => + import(`../examples/${type}/${component}/${name}.svelte`), + loadRawExampleModule: (type, component, name) => + import(`../examples/${type}/${component}/${name}.svelte?raw`), + pathExamples: import.meta.glob<{ default: Component }>([ + '/src/routes/**/*.svelte', + '/src/content/**/*.svelte', + ]), + rawPathExamples: import.meta.glob( + ['/src/routes/**/*.svelte', '/src/content/**/*.svelte'], + { query: '?raw', import: 'default' } + ), +}); +``` + +```ts title="src/lib/content.ts" +import { error } from '@sveltejs/kit'; +import { allReferences, allGuides, type Reference, type Guide } from 'content-collections'; +import { createContentLoaders, type ContentType } from '@layerstack/docs/content'; +import { loadExample, loadExampleByPath } from '$lib/examples.js'; + +type Metadata = Reference | Guide; + +const modules = import.meta.glob<{ default: import('svelte').Component; metadata: Metadata }>( + '/src/content/**/*.md' +); + +export const { getMarkdownComponent, loadExamplesFromMarkdown } = createContentLoaders({ + modules, + getMetadata: (slug, type: ContentType) => + type === 'guides' + ? allGuides.find((g) => g.slug === slug) + : allReferences.find((r) => r.slug === slug), + loadExample, + loadExampleByPath, + notFound: () => error(404, 'Could not find the document.'), +}); +``` + +## Routes + +The dynamic renderers, `llms.txt` endpoints, and `api/search.json` are boilerplate that +delegates to the framework — copy them from this site and adjust collection/slug shapes. +Build the search index with `buildSearchEntries` from `@layerstack/docs/search`, and add +`` + `` to your shell layout. + +Next: [Authoring content](/docs/guides/docs/authoring). diff --git a/docs/src/content/reference/svelte-actions/dataBackground.md b/docs/src/content/reference/svelte-actions/dataBackground.md new file mode 100644 index 0000000..5c1fd8c --- /dev/null +++ b/docs/src/content/reference/svelte-actions/dataBackground.md @@ -0,0 +1,19 @@ +--- +title: dataBackground +description: Set background gradient based on data, similar to Excel. Typically used within a table +related: [components/Table, svelte-table/actions/table] +--- + +## Usage + +```js +import { dataBackground } from '@layerstack/svelte-actions'; +``` + +## Basic + +:example{name="basic" showCode} + +## Tailwind gradient + +:example{name="tailwind-gradient" showCode} diff --git a/docs/src/content/reference/svelte-actions/input.md b/docs/src/content/reference/svelte-actions/input.md new file mode 100644 index 0000000..ac73dec --- /dev/null +++ b/docs/src/content/reference/svelte-actions/input.md @@ -0,0 +1,47 @@ +--- +title: input +description: Input element actions — `autoFocus`, `autoHeight`, `blurOnEscape`, `selectOnFocus`, and `debounceEvent` +related: [components/TextField, components/Input] +--- + +## Usage + +```js +import { + autoFocus, + autoHeight, + blurOnEscape, + selectOnFocus, + debounceEvent, +} from '@layerstack/svelte-actions'; +``` + +## autoFocus + +Auto focus node when rendered + +:example{name="auto-focus" showCode} + +## selectOnFocus + +Selects the text inside a text node when the node is focused + +:example{name="select-on-focus"} + +## blurOnEscape + +Blurs the node when Escape is pressed + +:example{name="blur-on-escape"} + +## autoHeight + +Automatically resize textarea based on content + +:example{name="auto-height"} + +## debounceEvent + +Debounce any event (input, change, etc) + +:example{name="debounce-event"} diff --git a/docs/src/content/reference/svelte-actions/layout.md b/docs/src/content/reference/svelte-actions/layout.md new file mode 100644 index 0000000..9a07891 --- /dev/null +++ b/docs/src/content/reference/svelte-actions/layout.md @@ -0,0 +1,33 @@ +--- +title: layout +description: Layout actions — `remainingViewportHeight`, `remainingViewportWidth`, and `overflow` +related: [components/Overflow] +--- + +## Usage + +```js +import { + remainingViewportHeight, + remainingViewportWidth, + overflow, +} from '@layerstack/svelte-actions'; +``` + +## remainingViewportHeight + +Set `height` or `max-height` to viewport height excluding node's current viewport top + +> TODO + +## remainingViewportWidth + +Set `width` or `max-width` to viewport width excluding node's current viewport left + +> TODO + +## overflow + +Watch for overflow changes (x or y) and dispatch `overflow` event with amount + +:example{name="overflow" showCode} diff --git a/docs/src/content/reference/svelte-actions/mouse.md b/docs/src/content/reference/svelte-actions/mouse.md new file mode 100644 index 0000000..8903ef9 --- /dev/null +++ b/docs/src/content/reference/svelte-actions/mouse.md @@ -0,0 +1,34 @@ +--- +title: mouse +description: Mouse interaction actions — `longpress` (press-and-hold) and `movable` (drag tracking) +--- + +## Usage + +```js +import { longpress, movable } from '@layerstack/svelte-actions'; +``` + +## longpress + +Dispatch event after element has been pressed for a duration of time + +:example{name="longpress"} + +## movable + +Track mouse position changes from mouse down on node to mouse up + +:example{name="movable"} + +### With pixel steps / snapping + +:example{name="movable-step"} + +### With percentage of parent steps / snapping + +:example{name="movable-step-percent"} + +### x-axis only + +:example{name="movable-x-axis"} diff --git a/docs/src/content/reference/svelte-actions/multi.md b/docs/src/content/reference/svelte-actions/multi.md new file mode 100644 index 0000000..6b384ca --- /dev/null +++ b/docs/src/content/reference/svelte-actions/multi.md @@ -0,0 +1,11 @@ +--- +title: multi +description: Helper action to handle multiple actions as a single action. Useful for adding actions for custom components +related: [components/Button, components/Input, components/TextField] +--- + +## Usage + +```js +import { multi } from '@layerstack/svelte-actions'; +``` diff --git a/docs/src/content/reference/svelte-actions/observer.md b/docs/src/content/reference/svelte-actions/observer.md new file mode 100644 index 0000000..00c6a37 --- /dev/null +++ b/docs/src/content/reference/svelte-actions/observer.md @@ -0,0 +1,39 @@ +--- +title: observer +description: Actions for ResizeObserver, IntersectionObserver, and MutationObserver +related: [components/InfiniteScroll, components/Lazy] +--- + +## Usage + +```js +import { resize, intersection, mutate } from '@layerstack/svelte-actions'; +``` + +## use:resize + +### Basic + +:example{name="basic" showCode} + +### Full coordinates (using `getBoundingClientRect()`) + +:example{name="full-coordinates" showCode} + +### Setting CSS variable + +:example{name="setting-css-variable" showCode} + +## use:intersection + +### Adding class when fully visible + +:example{name="adding-class-when-fully-visible" showCode} + +### Show header on scroll away + +:example{name="show-header-on-scroll-away" showCode} + +## use:mutate + +> TODO diff --git a/docs/src/content/reference/svelte-actions/popover.md b/docs/src/content/reference/svelte-actions/popover.md new file mode 100644 index 0000000..88af2e1 --- /dev/null +++ b/docs/src/content/reference/svelte-actions/popover.md @@ -0,0 +1,11 @@ +--- +title: popover +description: Svelte action for floating-ui with simplier setup, especially for middlware +related: [components/Popover] +--- + +## Usage + +```js +import { popover } from '@layerstack/svelte-actions'; +``` diff --git a/docs/src/content/reference/svelte-actions/portal.md b/docs/src/content/reference/svelte-actions/portal.md new file mode 100644 index 0000000..d67d281 --- /dev/null +++ b/docs/src/content/reference/svelte-actions/portal.md @@ -0,0 +1,33 @@ +--- +title: portal +description: Render component outside current DOM hierarchy +related: [components/Dialog, components/Drawer, components/Backdrop] +--- + +## Usage + +```js +import { portal } from '@layerstack/svelte-actions'; +``` + +## Examples + +### basic + +:example{name="basic" showCode} + +### first/sibling `.PortalTarget` + +:example{name="first-sibling-portal-target"} + +### ancestor `.PortalTarget` + +:example{name="ancestor-portal-target"} + +### custom target + +:example{name="custom-target"} + +### Destroyable + +:example{name="destroyable"} diff --git a/docs/src/content/reference/svelte-actions/scroll.md b/docs/src/content/reference/svelte-actions/scroll.md new file mode 100644 index 0000000..b9e36db --- /dev/null +++ b/docs/src/content/reference/svelte-actions/scroll.md @@ -0,0 +1,55 @@ +--- +title: scroll +--- + +## Usage + +```js +import { scrollIntoView, scrollFade, scrollShadow } from '@layerstack/svelte-actions'; +``` + +## scrollIntoView + +Smootly scroll element into center of view + +:example{name="basic" showCode} + +### Only if needed + +:example{name="only-if-needed"} + +## scrollShadow + +Add shadows to indicate scrolling available + +:example{name="scroll-shadow"} + +### with flip'd children + +:example{name="scroll-shadow-flip"} + +### Horizontal scroll + +:example{name="scroll-shadow-horizontal"} + +### Surface shadow on bottom (fade content) + +:example{name="scroll-shadow-bottom-surface"} + +### with truncation + +:example{name="scroll-shadow-truncation"} + +## scrollFade + +Add shadows to indicate scrolling available + +:example{name="scroll-fade"} + +### with flip'd children + +:example{name="scroll-fade-flip"} + +### Horizontal scroll + +:example{name="scroll-fade-horizontal"} diff --git a/docs/src/content/reference/svelte-actions/spotlight.md b/docs/src/content/reference/svelte-actions/spotlight.md new file mode 100644 index 0000000..2bf38dc --- /dev/null +++ b/docs/src/content/reference/svelte-actions/spotlight.md @@ -0,0 +1,22 @@ +--- +title: spotlight +related: [components/Shine] +--- + +## Usage + +```js +import { spotlight } from '@layerstack/svelte-actions'; +``` + +## Using global context and options + +:example{name="global-context-and-options" showCode} + +## Using global context and CSS variables + +:example{name="global-context-and-css-variables"} + +## Line example + +:example{name="line"} diff --git a/docs/src/content/reference/svelte-actions/sticky.md b/docs/src/content/reference/svelte-actions/sticky.md new file mode 100644 index 0000000..f3c9471 --- /dev/null +++ b/docs/src/content/reference/svelte-actions/sticky.md @@ -0,0 +1,19 @@ +--- +title: sticky +description: Sticky positioning actions — `sticky` and `stickyContext` +related: [components/Table, svelte-table/actions/table] +--- + +## Usage + +```js +import { sticky, stickyContext } from '@layerstack/svelte-actions'; +``` + +## sticky + +> TODO + +## stickyContext + +> TODO diff --git a/docs/src/content/reference/svelte-actions/styles.md b/docs/src/content/reference/svelte-actions/styles.md new file mode 100644 index 0000000..481096f --- /dev/null +++ b/docs/src/content/reference/svelte-actions/styles.md @@ -0,0 +1,22 @@ +--- +title: styles +description: Actions to conveniently work with CSS styles +--- + +## Usage + +```js +import { computedStyles, styleProps } from '@layerstack/svelte-actions'; +``` + +## computedStyles + +Retrieve all computed styles for element. Useful to resolve CSS variable values or working with `canvas`. + +:example{name="computed-styles" showCode} + +## styleProps + +Reactively set style properties using a single object. + +:example{name="style-props"} diff --git a/docs/src/content/reference/svelte-state/MediaQueryPresets.md b/docs/src/content/reference/svelte-state/MediaQueryPresets.md new file mode 100644 index 0000000..cb4d45c --- /dev/null +++ b/docs/src/content/reference/svelte-state/MediaQueryPresets.md @@ -0,0 +1,25 @@ +--- +title: MediaQueryPresets +description: Presets to monitor media query matching, including screen width/height, orientation, print media, prefers dark/light scheme, and prefers reduced motion +--- + +## Usage + +```svelte + + +{#if mdScreen.current} +
Only visible on 768px+ screens
+{/if} + +{#if print.current} +
Only visable when printing
+{/if} +``` + +## Examples + +:example{name="basic" showCode} diff --git a/docs/src/content/reference/svelte-state/PaginationState.md b/docs/src/content/reference/svelte-state/PaginationState.md new file mode 100644 index 0000000..5cac383 --- /dev/null +++ b/docs/src/content/reference/svelte-state/PaginationState.md @@ -0,0 +1,25 @@ +--- +title: PaginationState +description: Manage pagination state including current page and page navigation (next/previous/first/last). See related Paginate/Pagination components +related: [components/Paginate, components/Pagination] +--- + +## Usage + +```js +import { PaginationState } from '@layerstack/svelte-state'; + +const state = new PaginationState({ total: 100 }); + +state.page; +state.perPage; +state.total; +state.totalPages; +state.from; +state.to; +state.isFirst; +state.isLast; +state.hasPrevious; +state.hasNext; +state.slice(data); +``` diff --git a/docs/src/content/reference/svelte-state/SelectionState.md b/docs/src/content/reference/svelte-state/SelectionState.md new file mode 100644 index 0000000..b86db8c --- /dev/null +++ b/docs/src/content/reference/svelte-state/SelectionState.md @@ -0,0 +1,43 @@ +--- +title: SelectionState +description: Manage item selection state including toggling values, selecting all, and clear or reset selection +related: [svelte-state/UniqueState, components/MultiSelect, components/Selection] +--- + +## Usage + +```js +import { SelectionState } from '@layerstack/svelte-state'; + +const state = new SelectionState(); + +state.current.has(value); +state.current.size; +state.add(value); +state.delete(value); +state.toggle(value); +``` + +## Basic + +:example{name="basic" showCode} + +## Initial selection + +:example{name="initial-selection" showCode} + +## Max + +:example{name="max" showCode} + +## Select all + +:example{name="select-all" showCode} + +## Single + +:example{name="single" showCode} + +## Set selection + +:example{name="set-selection" showCode} diff --git a/docs/src/content/reference/svelte-state/TimerState.md b/docs/src/content/reference/svelte-state/TimerState.md new file mode 100644 index 0000000..ac5ef3f --- /dev/null +++ b/docs/src/content/reference/svelte-state/TimerState.md @@ -0,0 +1,23 @@ +--- +title: TimerState +description: Manage interval ticks, useful for timely updates and countdowns +related: [components/Duration, components/ScrollingValue] +--- + +## Usage + +```js +const timer = new TimerState(); +``` + +```js +const timer = new TimerState({ initial?: T, tick?: (value: T) => {...}, delay?: number, disabled?: boolean }) +``` + +## Default + +:example{name="basic" showCode} + +## Tick count + +:example{name="tick-count"} diff --git a/docs/src/content/reference/svelte-state/UniqueState.md b/docs/src/content/reference/svelte-state/UniqueState.md new file mode 100644 index 0000000..c3eac56 --- /dev/null +++ b/docs/src/content/reference/svelte-state/UniqueState.md @@ -0,0 +1,26 @@ +--- +title: UniqueState +description: State to manage unique values using `Set` with improves ergonomics and better control of updates +related: [svelte-state/SelectionState] +--- + +## Usage + +```js +import { UniqueState } from '@layerstack/svelte-state'; + +const state = new UniqueState(); + +state.current.has(value); +state.current.size; +state.add(value); +state.addEach([value1, value2]); +state.delete(value); +state.toggle(value); +state.reset(); +state.clear(); +``` + +## Basic + +:example{name="basic" showCode} diff --git a/docs/src/content/reference/svelte-stores/changeStore.md b/docs/src/content/reference/svelte-stores/changeStore.md new file mode 100644 index 0000000..e2343ff --- /dev/null +++ b/docs/src/content/reference/svelte-stores/changeStore.md @@ -0,0 +1,12 @@ +--- +title: changeStore +description: Track previous value. Calls onChange callback only after first change (not initial value) +--- + +## Usage + +:example{name="basic" showCode} + +## Pagination + +:example{name="pagination"} diff --git a/docs/src/content/reference/svelte-stores/debounceStore.md b/docs/src/content/reference/svelte-stores/debounceStore.md new file mode 100644 index 0000000..4c11811 --- /dev/null +++ b/docs/src/content/reference/svelte-stores/debounceStore.md @@ -0,0 +1,8 @@ +--- +title: debounceStore +description: Delay store update until some time has passed since the last update +--- + +## Usage + +:example{name="basic" showCode} diff --git a/docs/src/content/reference/svelte-stores/dirtyStore.md b/docs/src/content/reference/svelte-stores/dirtyStore.md new file mode 100644 index 0000000..46f84cd --- /dev/null +++ b/docs/src/content/reference/svelte-stores/dirtyStore.md @@ -0,0 +1,9 @@ +--- +title: dirtyStore +description: Track when a store becomes dirty (changed), with ability to reset. Useful to enable an apply button, etc +related: [components/MultiSelect] +--- + +## Usage + +:example{name="basic" showCode} diff --git a/sites/docs/src/routes/docs/svelte-stores/fetchStore/+page.md b/docs/src/content/reference/svelte-stores/fetchStore.md similarity index 86% rename from sites/docs/src/routes/docs/svelte-stores/fetchStore/+page.md rename to docs/src/content/reference/svelte-stores/fetchStore.md index 0195551..b931787 100644 --- a/sites/docs/src/routes/docs/svelte-stores/fetchStore/+page.md +++ b/docs/src/content/reference/svelte-stores/fetchStore.md @@ -1,9 +1,10 @@ - +--- +title: fetchStore +description: Fetch request as a store, with support for body parsing (json, text, arrayBuffer, etc), out of order responses, context configuration, and global errors +related: [svelte-stores/graphStore] +--- -

Usage

+## Usage ```js import { fetchStore, initFetchClient } from '@layerstack/svelte-stores'; diff --git a/docs/src/content/reference/svelte-stores/formStore.md b/docs/src/content/reference/svelte-stores/formStore.md new file mode 100644 index 0000000..300c821 --- /dev/null +++ b/docs/src/content/reference/svelte-stores/formStore.md @@ -0,0 +1,11 @@ +--- +title: formStore +description: Manage form state via immer draft and zod schema, with undo history +related: [components/Form] +--- + +## Usage + +```js +import { formStore } from '@layerstack/svelte-stores'; +``` diff --git a/docs/src/content/reference/svelte-stores/graphStore.md b/docs/src/content/reference/svelte-stores/graphStore.md new file mode 100644 index 0000000..e87d2fc --- /dev/null +++ b/docs/src/content/reference/svelte-stores/graphStore.md @@ -0,0 +1,11 @@ +--- +title: graphStore +description: GraphQL requests powered by fetchStore +related: [svelte-stores/fetchStore] +--- + +## Usage + +```js +import { graphStore } from '@layerstack/svelte-stores'; +``` diff --git a/docs/src/content/reference/svelte-stores/localStore.md b/docs/src/content/reference/svelte-stores/localStore.md new file mode 100644 index 0000000..c63099c --- /dev/null +++ b/docs/src/content/reference/svelte-stores/localStore.md @@ -0,0 +1,17 @@ +--- +title: localStore +description: Read and write to localStorage with expiration support +--- + +## Usage + +```svelte + +``` diff --git a/sites/docs/src/routes/docs/svelte-stores/mapStore/+page.md b/docs/src/content/reference/svelte-stores/mapStore.md similarity index 56% rename from sites/docs/src/routes/docs/svelte-stores/mapStore/+page.md rename to docs/src/content/reference/svelte-stores/mapStore.md index d53dad9..749254e 100644 --- a/sites/docs/src/routes/docs/svelte-stores/mapStore/+page.md +++ b/docs/src/content/reference/svelte-stores/mapStore.md @@ -1,18 +1,10 @@ - - -

Usage

+## Usage ```js import { mapStore } from '@layerstack/svelte-stores'; diff --git a/docs/src/content/reference/svelte-stores/matchMedia.md b/docs/src/content/reference/svelte-stores/matchMedia.md new file mode 100644 index 0000000..05f07d3 --- /dev/null +++ b/docs/src/content/reference/svelte-stores/matchMedia.md @@ -0,0 +1,36 @@ +--- +title: matchMedia +description: Store to monitor media query matching, including screen width/height, orientation, print media, prefers dark/light scheme, and prefers reduced motion +--- + +## Usage + +The returned store is truthy while its media query matches, so it can be used directly in markup (`{#if $isLargeScreen}…{/if}`). + +```svelte + +``` + +Convenient width helper: + +```svelte + +``` + +Convenient presets (Tailwind defaults) — `smScreen`, `mdScreen`, `lgScreen`, `xlScreen`, `xxlScreen` — plus `screen`, `print`, `darkColorScheme`, and `motionReduce`: + +```svelte + +``` + +## Example + +:example{name="basic"} diff --git a/docs/src/content/reference/svelte-stores/paginationStore.md b/docs/src/content/reference/svelte-stores/paginationStore.md new file mode 100644 index 0000000..afdeedb --- /dev/null +++ b/docs/src/content/reference/svelte-stores/paginationStore.md @@ -0,0 +1,11 @@ +--- +title: paginationStore +description: Manage pagination state including current page and page navigation (next/previous/first/last). See related Paginate/Pagination components +related: [components/Paginate, components/Pagination] +--- + +## Usage + +```js +import { paginationStore } from '@layerstack/svelte-stores'; +``` diff --git a/docs/src/content/reference/svelte-stores/promiseStore.md b/docs/src/content/reference/svelte-stores/promiseStore.md new file mode 100644 index 0000000..2df943d --- /dev/null +++ b/docs/src/content/reference/svelte-stores/promiseStore.md @@ -0,0 +1,10 @@ +--- +title: promiseStore +description: Wraps a Promise as a store. Useful for SvelteKit streamed data handling +--- + +## Usage + +```js +import { promiseStore } from '@layerstack/svelte-stores'; +``` diff --git a/sites/docs/src/routes/docs/svelte-stores/queryParamsStore/+page.md b/docs/src/content/reference/svelte-stores/queryParamsStore.md similarity index 90% rename from sites/docs/src/routes/docs/svelte-stores/queryParamsStore/+page.md rename to docs/src/content/reference/svelte-stores/queryParamsStore.md index 13aa1d6..594128e 100644 --- a/sites/docs/src/routes/docs/svelte-stores/queryParamsStore/+page.md +++ b/docs/src/content/reference/svelte-stores/queryParamsStore.md @@ -1,10 +1,11 @@ - - -

queryParamStore()

+## queryParamStore() Manage a single query param @@ -52,7 +53,7 @@ const filters = queryParamStore({ $dataRange = newValue; ``` -

queryParamsStore()

+## queryParamsStore() Manage all query params as a single store @@ -122,8 +123,10 @@ const filters = queryParamsStore({ $filters = newFilters; ``` -

Param types

-

string

+## Param types + +### string + input ```js @@ -136,7 +139,8 @@ output ?value=example ``` -

string[]

+### string[] + input ```js @@ -149,7 +153,8 @@ output ?value=one_two_three ``` -

number

+### number + input ```js @@ -162,7 +167,8 @@ output ?value=1234 ``` -

number[]

+### number[] + input ```js @@ -175,7 +181,8 @@ output ?value=1_2_3_4 ``` -

boolean

+### boolean + input ```js @@ -188,7 +195,8 @@ output ?value=1 ``` -

date

+### date + input ```js @@ -201,7 +209,7 @@ output ?value=1982-03-30 ``` -

datetime

+### datetime input @@ -215,7 +223,7 @@ output ?value=1982-03-30T05:00:00.000Z ``` -

json

+### json input @@ -234,7 +242,7 @@ output ?value={"number":1234,"string":"example","bool":true,"date":"1982-03-30T05:00:00.000Z"} ``` -

object

+### object input diff --git a/docs/src/content/reference/svelte-stores/selectionStore.md b/docs/src/content/reference/svelte-stores/selectionStore.md new file mode 100644 index 0000000..8346ad3 --- /dev/null +++ b/docs/src/content/reference/svelte-stores/selectionStore.md @@ -0,0 +1,25 @@ +--- +title: selectionStore +description: Manage item selection state including toggling values, selecting all, and clear or reset selection +related: [components/MultiSelect, components/Selection] +--- + +## Basic + +:example{name="basic" showCode} + +## Initial selection + +:example{name="initial-selection" showCode} + +## Select all + +:example{name="select-all" showCode} + +## Single + +:example{name="single" showCode} + +## Max + +:example{name="max" showCode} diff --git a/docs/src/content/reference/svelte-stores/timerStore.md b/docs/src/content/reference/svelte-stores/timerStore.md new file mode 100644 index 0000000..10238a6 --- /dev/null +++ b/docs/src/content/reference/svelte-stores/timerStore.md @@ -0,0 +1,19 @@ +--- +title: timerStore +description: Manage interval ticks, useful for timely updates and countdowns +related: [components/Duration, components/ScrollingValue] +--- + +## Usage + +```js +const timer = timerStore(); +``` + +## Default + +:example{name="default" showCode} + +## Tick count + +:example{name="tick-count" showCode} diff --git a/docs/src/content/reference/svelte-stores/uniqueStore.md b/docs/src/content/reference/svelte-stores/uniqueStore.md new file mode 100644 index 0000000..e75d2f5 --- /dev/null +++ b/docs/src/content/reference/svelte-stores/uniqueStore.md @@ -0,0 +1,22 @@ +--- +title: uniqueStore +description: Store to manage unique values using `Set` with improved ergonomics and better control of updates +related: [svelte-stores/selectionStore, svelte-stores/mapStore, components/MultiSelect] +--- + +## Usage + +```js +import { uniqueStore } from '@layerstack/svelte-stores'; + +const store = uniqueStore(); +// $store.has(value) +// $store.size +// store.add(value); +// store.delete(value); +// store.toggle(value); +``` + +## Example + +:example{name="basic" showCode} diff --git a/docs/src/content/reference/svelte-table/actions.md b/docs/src/content/reference/svelte-table/actions.md new file mode 100644 index 0000000..c80dfe7 --- /dev/null +++ b/docs/src/content/reference/svelte-table/actions.md @@ -0,0 +1,11 @@ +--- +title: actions +description: 'Apply ColumnDef to a table cell ``. Includes order by, dataBackground, and sticky support' +related: [components/Table, svelte-actions/dataBackground] +--- + +## Usage + +```js +import { tableCell } from '@layerstack/svelte-table'; +``` diff --git a/docs/src/content/reference/svelte-table/stores.md b/docs/src/content/reference/svelte-table/stores.md new file mode 100644 index 0000000..0f2b1cb --- /dev/null +++ b/docs/src/content/reference/svelte-table/stores.md @@ -0,0 +1,11 @@ +--- +title: stores +description: Manage table column sorting selection and direction. Compliments Table component +related: [svelte-table/actions, components/Table] +--- + +## Usage + +```js +import { tableOrderStore } from '@layerstack/svelte-table'; +``` diff --git a/docs/src/content/reference/tailwind/utils.md b/docs/src/content/reference/tailwind/utils.md new file mode 100644 index 0000000..e3a53f3 --- /dev/null +++ b/docs/src/content/reference/tailwind/utils.md @@ -0,0 +1,15 @@ +--- +title: utils +description: Wrapper around `tailwind-merge` and `clsx` for easy style overriding +related: ['https://github.com/dcastil/tailwind-merge', 'https://github.com/lukeed/clsx'] +--- + +## Usage + +```svelte + + + + +{#each data as d} +
+ selection.toggle(d.id)}> + {d.id} + +
+{/each} +selected: {JSON.stringify(selection.current)} diff --git a/docs/src/examples/components/SelectionState/max.svelte b/docs/src/examples/components/SelectionState/max.svelte new file mode 100644 index 0000000..554a62a --- /dev/null +++ b/docs/src/examples/components/SelectionState/max.svelte @@ -0,0 +1,25 @@ + + +{#each data as d} +
+ selection.toggle(d.id)} + disabled={selection.isDisabled(d.id)} + > + {d.id} + +
+{/each} +selected: {JSON.stringify(selection.current)} diff --git a/docs/src/examples/components/SelectionState/select-all.svelte b/docs/src/examples/components/SelectionState/select-all.svelte new file mode 100644 index 0000000..c669068 --- /dev/null +++ b/docs/src/examples/components/SelectionState/select-all.svelte @@ -0,0 +1,28 @@ + + + selection.toggleAll()} +> + Select all + +{#each data as d} +
+ selection.toggle(d.id)}> + {d.id} + +
+{/each} +selected: {JSON.stringify(selection.current)} diff --git a/docs/src/examples/components/SelectionState/set-selection.svelte b/docs/src/examples/components/SelectionState/set-selection.svelte new file mode 100644 index 0000000..9e17bb2 --- /dev/null +++ b/docs/src/examples/components/SelectionState/set-selection.svelte @@ -0,0 +1,24 @@ + + + + + +{#each data as d} +
+ selection.toggle(d.id)}> + {d.id} + +
+{/each} +selected: {JSON.stringify(selection.current)} diff --git a/docs/src/examples/components/SelectionState/single.svelte b/docs/src/examples/components/SelectionState/single.svelte new file mode 100644 index 0000000..5dc608f --- /dev/null +++ b/docs/src/examples/components/SelectionState/single.svelte @@ -0,0 +1,21 @@ + + +{#each data as d} +
+ selection.toggle(d.id)}> + {d.id} + +
+{/each} +selected: {JSON.stringify(selection.current)} diff --git a/docs/src/examples/components/TimerState/basic.svelte b/docs/src/examples/components/TimerState/basic.svelte new file mode 100644 index 0000000..20e1582 --- /dev/null +++ b/docs/src/examples/components/TimerState/basic.svelte @@ -0,0 +1,15 @@ + + +
{dateTimer.current}
+ { + // @ts-expect-error + e.target?.checked ? dateTimer.start() : dateTimer.stop(); + }} +/> diff --git a/docs/src/examples/components/TimerState/tick-count.svelte b/docs/src/examples/components/TimerState/tick-count.svelte new file mode 100644 index 0000000..c99f3bc --- /dev/null +++ b/docs/src/examples/components/TimerState/tick-count.svelte @@ -0,0 +1,15 @@ + + +
{tickTimer.current}
+ { + // @ts-expect-error + e.target?.checked ? tickTimer.start() : tickTimer.stop(); + }} +/> diff --git a/docs/src/examples/components/UniqueState/basic.svelte b/docs/src/examples/components/UniqueState/basic.svelte new file mode 100644 index 0000000..073ef5c --- /dev/null +++ b/docs/src/examples/components/UniqueState/basic.svelte @@ -0,0 +1,21 @@ + + +{#each data as d} +
+ state.toggle(d.id)}> + {d.id} + +
+{/each} +selected: {JSON.stringify([...state.current])} diff --git a/docs/src/examples/components/changeStore/basic.svelte b/docs/src/examples/components/changeStore/basic.svelte new file mode 100644 index 0000000..0fa1e1f --- /dev/null +++ b/docs/src/examples/components/changeStore/basic.svelte @@ -0,0 +1,11 @@ + + + +
changed: {JSON.stringify($changed)}
diff --git a/docs/src/examples/components/changeStore/pagination.svelte b/docs/src/examples/components/changeStore/pagination.svelte new file mode 100644 index 0000000..67b2e1a --- /dev/null +++ b/docs/src/examples/components/changeStore/pagination.svelte @@ -0,0 +1,12 @@ + + + +
{JSON.stringify($paginationChanged, null, 2)}
diff --git a/docs/src/examples/components/dataBackground/basic.svelte b/docs/src/examples/components/dataBackground/basic.svelte new file mode 100644 index 0000000..80dade0 --- /dev/null +++ b/docs/src/examples/components/dataBackground/basic.svelte @@ -0,0 +1,116 @@ + + +
+
+ + + Original + Derived + + + + + + + + + + +
+ +
+ +
+ min: + + max: + +
+
+ + +
+ x: + + y: + +
+
+
+ +
+ + {duration} +
+
+ + +
+ + + + {#each sorted ? sort(values) : values as value} + + {#key duration} + + + + {/key} + {/each} + +
0 ? 'hsl(140 80% 80%)' : 'hsl(0 80% 80%)', + domain, + inset, + baseline, + tweened: { duration }, + }} + > + +
diff --git a/sites/docs/src/routes/docs/svelte-actions/dataBackground/+page.svelte b/docs/src/examples/components/dataBackground/tailwind-gradient.svelte similarity index 59% rename from sites/docs/src/routes/docs/svelte-actions/dataBackground/+page.svelte rename to docs/src/examples/components/dataBackground/tailwind-gradient.svelte index 3e4d4ca..1c8adbd 100644 --- a/sites/docs/src/routes/docs/svelte-actions/dataBackground/+page.svelte +++ b/docs/src/examples/components/dataBackground/tailwind-gradient.svelte @@ -15,9 +15,6 @@ import { dataBackground } from '@layerstack/svelte-actions'; import { cls } from '@layerstack/tailwind'; - import Preview from '$docs/Preview.svelte'; - import Code from '$docs/Code.svelte'; - import { randomInteger } from '@layerstack/utils'; const originalDomain: [number, number] = [-100, 100]; @@ -42,15 +39,7 @@ : ([Math.min(...values), Math.max(...values)] as [number, number]); -

Usage

- - - -
+
@@ -102,62 +91,29 @@ >
-

Basic

- - - - - {#each sorted ? sort(values) : values as value} - - {#key duration} - - - - {/key} - {/each} - -
0 ? 'hsl(140 80% 80%)' : 'hsl(0 80% 80%)', - domain, - inset, - baseline, - tweened: { duration }, - }} - > - -
-
- -

Tailwind gradient

- - - - - {#each sorted ? sort(values) : values as value} - - {#key duration} - - - - {/key} - {/each} - -
0 ? 'from-success-100 to-success-500' : 'from-danger-500 to-danger-100' - )} - use:dataBackground={{ - value, - domain, - inset, - baseline, - tweened: { duration }, - }} - > - -
-
+ + + {#each sorted ? sort(values) : values as value} + + {#key duration} + + + + {/key} + {/each} + +
0 ? 'from-success-100 to-success-500' : 'from-danger-500 to-danger-100' + )} + use:dataBackground={{ + value, + domain, + inset, + baseline, + tweened: { duration }, + }} + > + +
diff --git a/docs/src/examples/components/debounceStore/basic.svelte b/docs/src/examples/components/debounceStore/basic.svelte new file mode 100644 index 0000000..da84cfb --- /dev/null +++ b/docs/src/examples/components/debounceStore/basic.svelte @@ -0,0 +1,12 @@ + + + +
value: {$value}
+
debouncedValue: {$debouncedValue}
diff --git a/docs/src/examples/components/dirtyStore/basic.svelte b/docs/src/examples/components/dirtyStore/basic.svelte new file mode 100644 index 0000000..0cb9b50 --- /dev/null +++ b/docs/src/examples/components/dirtyStore/basic.svelte @@ -0,0 +1,12 @@ + + + +
isDirty: {$isDirty}
+ diff --git a/docs/src/examples/components/format/dates-custom.svelte b/docs/src/examples/components/format/dates-custom.svelte new file mode 100644 index 0000000..d66440d --- /dev/null +++ b/docs/src/examples/components/format/dates-custom.svelte @@ -0,0 +1,26 @@ + + +
+
+

With format string

+ {format(myDate, 'custom', { + custom: 'eee, MMMM do', + })} +
+
+

With descriptive tokens

+ {format(myDate, 'custom', { + custom: [DateToken.DayOfWeek_short, DateToken.Month_long, DateToken.DayOfMonth_withOrdinal], + })} +
+
+

With full intl

+ {format(myDate, 'custom', { + custom: { weekday: 'short', month: 'long', day: 'numeric', withOrdinal: true }, + })} +
+
diff --git a/docs/src/examples/components/format/dates-period-types.svelte b/docs/src/examples/components/format/dates-period-types.svelte new file mode 100644 index 0000000..ddbb2b3 --- /dev/null +++ b/docs/src/examples/components/format/dates-period-types.svelte @@ -0,0 +1,55 @@ + + +{#each periodTypeCodes as periodType} +

{periodType}

+ + {#if periodType === 'week' || periodType === 'biweek1'} + + It will take your default weekStartsOn + settings, if you want to be specific, you can also use + {periodType === 'week' ? 'PeriodType.WeekSun' : 'PeriodType.BiWeek1Sun'} + + {/if} + +
+
+

short

+ {format(myDate, periodType, { + variant: 'short', + })} +
+
+

default

+ {format(myDate, periodType, { + // variant: 'default', + })} +
+
+

long

+ {format(myDate, periodType, { + variant: 'long', + })} +
+
+{/each} diff --git a/docs/src/examples/components/format/numbers-config.svelte b/docs/src/examples/components/format/numbers-config.svelte new file mode 100644 index 0000000..fe93ce4 --- /dev/null +++ b/docs/src/examples/components/format/numbers-config.svelte @@ -0,0 +1,17 @@ + + +
{format(1234.56, { type: 'integer', options: { maximumSignificantDigits: 2 } })}
+
{format(1234.56, { type: 'decimal', options: { maximumSignificantDigits: 5 } })}
+
{format(1234.56, { type: 'currency', options: { currency: 'EUR' } })}
+
+ {format(123_456_789.99, { + type: 'currency', + options: { notation: 'compact', maximumSignificantDigits: 3 }, + })} +
+
{format(0.5678, { type: 'percent', options: { signDisplay: 'always' } })}
+
{format(0.5678, { type: 'percentRound', options: { signDisplay: 'always' } })}
+
{format(1_234_567, { type: 'metric', options: { minimumSignificantDigits: 12 } })}
+
{format(0.5678, { type: 'percent', options: { fractionDigits: 1 } })}
diff --git a/docs/src/examples/components/format/numbers-default.svelte b/docs/src/examples/components/format/numbers-default.svelte new file mode 100644 index 0000000..2f4fc3b --- /dev/null +++ b/docs/src/examples/components/format/numbers-default.svelte @@ -0,0 +1,12 @@ + + +
{format(1234.56, 'integer')}
+
{format(1234.56, 'decimal')}
+
{format(1234.56, 'currency')}
+
{format(0.5678, 'percent')}
+
{format(0.5678, 'percentRound')}
+
{format(1_234_567, 'metric')}
+
{format(1_200_000, 'metric')}
+
{format(0.5678, 'percent')}
diff --git a/docs/src/examples/components/format/numbers-options.svelte b/docs/src/examples/components/format/numbers-options.svelte new file mode 100644 index 0000000..e4c60ba --- /dev/null +++ b/docs/src/examples/components/format/numbers-options.svelte @@ -0,0 +1,14 @@ + + +
{format(1234.56, 'integer', { maximumSignificantDigits: 2 })}
+
{format(1234.56, 'decimal', { maximumSignificantDigits: 5 })}
+
{format(1234.56, 'currency', { currency: 'EUR' })}
+
+ {format(123_456_789.99, 'currency', { notation: 'compact', maximumSignificantDigits: 3 })} +
+
{format(0.5678, 'percent', { signDisplay: 'always' })}
+
{format(0.5678, 'percentRound', { signDisplay: 'always' })}
+
{format(1_234_567, 'metric', { minimumSignificantDigits: 12 })}
+
{format(0.5678, 'percent', { fractionDigits: 1 })}
diff --git a/docs/src/examples/components/format/playground-dates.svelte b/docs/src/examples/components/format/playground-dates.svelte new file mode 100644 index 0000000..dec40f7 --- /dev/null +++ b/docs/src/examples/components/format/playground-dates.svelte @@ -0,0 +1,43 @@ + + +
+ + + ({ label: value, value }))} + stepper + /> + + ({ label: value, value }))} + stepper + /> +
+ +
{format(myDate, { type: periodType, locale })}
diff --git a/docs/src/examples/components/format/playground-numbers.svelte b/docs/src/examples/components/format/playground-numbers.svelte new file mode 100644 index 0000000..1df5546 --- /dev/null +++ b/docs/src/examples/components/format/playground-numbers.svelte @@ -0,0 +1,61 @@ + + +
+ + + ({ label: value, value }))} + stepper + /> + + ({ + label: value ?? 'None', + value, + }))} + stepper + disabled={numberType !== 'currency' && numberType !== 'currencyRound'} + /> + + ({ label: value, value }))} + stepper + /> + + ({ + label: value, + value, + }))} + stepper + /> +
+ +
{format(value, { type: numberType, locale, options: { currency, notation } })}
diff --git a/docs/src/examples/components/input/auto-focus.svelte b/docs/src/examples/components/input/auto-focus.svelte new file mode 100644 index 0000000..a91e809 --- /dev/null +++ b/docs/src/examples/components/input/auto-focus.svelte @@ -0,0 +1,5 @@ + + + diff --git a/docs/src/examples/components/input/auto-height.svelte b/docs/src/examples/components/input/auto-height.svelte new file mode 100644 index 0000000..8dc58ce --- /dev/null +++ b/docs/src/examples/components/input/auto-height.svelte @@ -0,0 +1,5 @@ + + + diff --git a/docs/src/examples/components/input/blur-on-escape.svelte b/docs/src/examples/components/input/blur-on-escape.svelte new file mode 100644 index 0000000..36d9625 --- /dev/null +++ b/docs/src/examples/components/input/blur-on-escape.svelte @@ -0,0 +1,5 @@ + + + diff --git a/docs/src/examples/components/input/debounce-event.svelte b/docs/src/examples/components/input/debounce-event.svelte new file mode 100644 index 0000000..4154273 --- /dev/null +++ b/docs/src/examples/components/input/debounce-event.svelte @@ -0,0 +1,16 @@ + + + { + // @ts-expect-error + console.log(e.target.value); + }, + timeout: 1000, + }} + class="border" +/> diff --git a/docs/src/examples/components/input/select-on-focus.svelte b/docs/src/examples/components/input/select-on-focus.svelte new file mode 100644 index 0000000..87d7587 --- /dev/null +++ b/docs/src/examples/components/input/select-on-focus.svelte @@ -0,0 +1,5 @@ + + + diff --git a/docs/src/examples/components/layout/overflow.svelte b/docs/src/examples/components/layout/overflow.svelte new file mode 100644 index 0000000..da06615 --- /dev/null +++ b/docs/src/examples/components/layout/overflow.svelte @@ -0,0 +1,31 @@ + + +
+ + +
+
{ + overflowX = e.detail.overflowX; + overflowY = e.detail.overflowY; + }} +> + {#each { length: overflowItems } as _} +
Resize the window to see text truncate and watch values
+ {/each} +
+
overflowX: {overflowX}
+
overflowY: {overflowY}
diff --git a/docs/src/examples/components/matchMedia/basic.svelte b/docs/src/examples/components/matchMedia/basic.svelte new file mode 100644 index 0000000..c73f566 --- /dev/null +++ b/docs/src/examples/components/matchMedia/basic.svelte @@ -0,0 +1,88 @@ + + +
+ {#if $smScreen}{:else}{/if} + $smScreen (640px) + + {#if $mdScreen}{:else}{/if} + $mdScreen (768px) + + {#if $lgScreen}{:else}{/if} + $lgScreen (1024px) + + {#if $xlScreen}{:else}{/if} + $xlScreen (1280px) + + {#if $xxlScreen}{:else}{/if} + $xxlScreen (1536px) + + {#if $screen}{:else}{/if} + $screen + + {#if $print}{:else}{/if} + $print + + {#if $darkColorScheme}{:else}{/if} + $darkColorScheme + + {#if $motionReduce}{:else}{/if} + $motionReduce +
+ +
+ current width: {innerWidth}px +
+ + diff --git a/docs/src/examples/components/mouse/longpress.svelte b/docs/src/examples/components/mouse/longpress.svelte new file mode 100644 index 0000000..5e6647d --- /dev/null +++ b/docs/src/examples/components/mouse/longpress.svelte @@ -0,0 +1,16 @@ + + + +{#if longpressed} + Success! Repeat to hide +{/if} diff --git a/docs/src/examples/components/mouse/movable-step-percent.svelte b/docs/src/examples/components/mouse/movable-step-percent.svelte new file mode 100644 index 0000000..c6efef5 --- /dev/null +++ b/docs/src/examples/components/mouse/movable-step-percent.svelte @@ -0,0 +1,27 @@ + + +
+
{ + coords.stiffness = 1; + coords.damping = 1; + }} + on:move={(e) => { + $coords.x += e.detail.dx; + $coords.y += e.detail.dy; + }} + on:moveend={() => { + coords.stiffness = 0.2; + coords.damping = 0.4; + coords.set({ x: 0, y: 0 }); + }} + style="transform: translate({$coords.x}px,{$coords.y}px) rotate({$coords.x * 0.2}deg)" + >
+
diff --git a/docs/src/examples/components/mouse/movable-step.svelte b/docs/src/examples/components/mouse/movable-step.svelte new file mode 100644 index 0000000..a156ee0 --- /dev/null +++ b/docs/src/examples/components/mouse/movable-step.svelte @@ -0,0 +1,27 @@ + + +
+
{ + coords.stiffness = 1; + coords.damping = 1; + }} + on:move={(e) => { + $coords.x += e.detail.dx; + $coords.y += e.detail.dy; + }} + on:moveend={() => { + coords.stiffness = 0.2; + coords.damping = 0.4; + coords.set({ x: 0, y: 0 }); + }} + style="transform: translate({$coords.x}px,{$coords.y}px) rotate({$coords.x * 0.2}deg)" + >
+
diff --git a/docs/src/examples/components/mouse/movable-x-axis.svelte b/docs/src/examples/components/mouse/movable-x-axis.svelte new file mode 100644 index 0000000..3e8c4b2 --- /dev/null +++ b/docs/src/examples/components/mouse/movable-x-axis.svelte @@ -0,0 +1,27 @@ + + +
+
{ + coords.stiffness = 1; + coords.damping = 1; + }} + on:move={(e) => { + $coords.x += e.detail.dx; + $coords.y += e.detail.dy; + }} + on:moveend={() => { + coords.stiffness = 0.2; + coords.damping = 0.4; + coords.set({ x: 0, y: 0 }); + }} + style="transform: translate({$coords.x}px,{$coords.y}px) rotate({$coords.x * 0.2}deg)" + >
+
diff --git a/docs/src/examples/components/mouse/movable.svelte b/docs/src/examples/components/mouse/movable.svelte new file mode 100644 index 0000000..ebd907c --- /dev/null +++ b/docs/src/examples/components/mouse/movable.svelte @@ -0,0 +1,27 @@ + + +
+
{ + coords.stiffness = 1; + coords.damping = 1; + }} + on:move={(e) => { + $coords.x += e.detail.dx; + $coords.y += e.detail.dy; + }} + on:moveend={() => { + coords.stiffness = 0.2; + coords.damping = 0.4; + coords.set({ x: 0, y: 0 }); + }} + style="transform: translate({$coords.x}px,{$coords.y}px) rotate({$coords.x * 0.2}deg)" + >
+
diff --git a/docs/src/examples/components/observer/adding-class-when-fully-visible.svelte b/docs/src/examples/components/observer/adding-class-when-fully-visible.svelte new file mode 100644 index 0000000..415c82b --- /dev/null +++ b/docs/src/examples/components/observer/adding-class-when-fully-visible.svelte @@ -0,0 +1,27 @@ + + +
+ {#each { length: 10 } as _} +
Scroll down
+ {/each} +
{ + if (e.detail.isIntersecting) { + // @ts-expect-error + e.target.classList.add('bg-danger'); + } else { + // @ts-expect-error + e.target.classList.remove('bg-danger'); + } + }} + class="transition-colors duration-500" + > + Watch me scroll away +
+ {#each { length: 10 } as _} +
Scroll up
+ {/each} +
diff --git a/docs/src/examples/components/observer/basic.svelte b/docs/src/examples/components/observer/basic.svelte new file mode 100644 index 0000000..aebbae8 --- /dev/null +++ b/docs/src/examples/components/observer/basic.svelte @@ -0,0 +1,13 @@ + + +
{ + console.log(e.detail); + // @ts-expect-error + e.target.innerText = JSON.stringify(e.detail.contentRect, null, 2); + }} + class="resize overflow-auto whitespace-pre outline rounded-sm" +>
diff --git a/docs/src/examples/components/observer/full-coordinates.svelte b/docs/src/examples/components/observer/full-coordinates.svelte new file mode 100644 index 0000000..3dddcf2 --- /dev/null +++ b/docs/src/examples/components/observer/full-coordinates.svelte @@ -0,0 +1,12 @@ + + +
{ + // @ts-expect-error + e.target.innerText = JSON.stringify(e.target.getBoundingClientRect(), null, 2); + }} + class="resize overflow-auto whitespace-pre outline rounded-sm" +>
diff --git a/docs/src/examples/components/observer/setting-css-variable.svelte b/docs/src/examples/components/observer/setting-css-variable.svelte new file mode 100644 index 0000000..11567ba --- /dev/null +++ b/docs/src/examples/components/observer/setting-css-variable.svelte @@ -0,0 +1,15 @@ + + +
{ + // @ts-expect-error + e.target.style.setProperty('--color', e.detail.contentRect.width % 255); + }} + style:background-color="hsl(var(--color), 100%, 70%)" + class="resize overflow-auto p-2 rounded-sm" +> + Resize and watch me change colors +
diff --git a/docs/src/examples/components/observer/show-header-on-scroll-away.svelte b/docs/src/examples/components/observer/show-header-on-scroll-away.svelte new file mode 100644 index 0000000..c0ac471 --- /dev/null +++ b/docs/src/examples/components/observer/show-header-on-scroll-away.svelte @@ -0,0 +1,44 @@ + + + +
+ {#if showHeader} +
+ Header +
+ {/if} +
+ {#each { length: 10 } as _} +
Scroll down
+ {/each} +
{ + if (e.detail.isIntersecting) { + // Visible + toggleOff(); + } else { + if (e.detail.boundingClientRect.top < (e.detail.rootBounds?.top ?? 0)) { + // Scrolled off top + toggleOn(); + } else { + // Scrolled off bottom + } + } + }} + > + Watch me scroll away +
+ {#each { length: 10 } as _} +
Scroll up
+ {/each} +
+
+
diff --git a/docs/src/examples/components/portal/ancestor-portal-target.svelte b/docs/src/examples/components/portal/ancestor-portal-target.svelte new file mode 100644 index 0000000..323dfaa --- /dev/null +++ b/docs/src/examples/components/portal/ancestor-portal-target.svelte @@ -0,0 +1,23 @@ + + + +
+
+ +
+
Portal content
+ {#if enabled} + + {/if} +
+
+
+
diff --git a/docs/src/examples/components/portal/basic.svelte b/docs/src/examples/components/portal/basic.svelte new file mode 100644 index 0000000..c5bdd2d --- /dev/null +++ b/docs/src/examples/components/portal/basic.svelte @@ -0,0 +1,19 @@ + + +
+ + +
+
Portal content
+ {#if enabled} + + {/if} +
+
+
diff --git a/docs/src/examples/components/portal/custom-target.svelte b/docs/src/examples/components/portal/custom-target.svelte new file mode 100644 index 0000000..1e303c9 --- /dev/null +++ b/docs/src/examples/components/portal/custom-target.svelte @@ -0,0 +1,22 @@ + + + +
+ +
+
Portal content
+ {#if enabled} + + {/if} +
+
+
+
diff --git a/docs/src/examples/components/portal/destroyable.svelte b/docs/src/examples/components/portal/destroyable.svelte new file mode 100644 index 0000000..f086f3f --- /dev/null +++ b/docs/src/examples/components/portal/destroyable.svelte @@ -0,0 +1,29 @@ + + + + + {#if !destroyed} +
+
+ + +
+
Portal content
+ {#if enabled} + + {/if} +
+
+
+
+ {:else} + + {/if} +
+
diff --git a/docs/src/examples/components/portal/first-sibling-portal-target.svelte b/docs/src/examples/components/portal/first-sibling-portal-target.svelte new file mode 100644 index 0000000..888f10d --- /dev/null +++ b/docs/src/examples/components/portal/first-sibling-portal-target.svelte @@ -0,0 +1,22 @@ + + + +
+ +
+
Portal content
+ {#if enabled} + + {/if} +
+
+
+
diff --git a/docs/src/examples/components/scroll/basic.svelte b/docs/src/examples/components/scroll/basic.svelte new file mode 100644 index 0000000..5b79b76 --- /dev/null +++ b/docs/src/examples/components/scroll/basic.svelte @@ -0,0 +1,21 @@ + + + +{scrolledIndex} +
+ {#each items as item, i} +
+ {item} +
+ {/each} +
diff --git a/docs/src/examples/components/scroll/only-if-needed.svelte b/docs/src/examples/components/scroll/only-if-needed.svelte new file mode 100644 index 0000000..0fa464d --- /dev/null +++ b/docs/src/examples/components/scroll/only-if-needed.svelte @@ -0,0 +1,21 @@ + + + +{scrolledIndex} +
+ {#each items as item, i} +
+ {item} +
+ {/each} +
diff --git a/docs/src/examples/components/scroll/scroll-fade-flip.svelte b/docs/src/examples/components/scroll/scroll-fade-flip.svelte new file mode 100644 index 0000000..eb10e5c --- /dev/null +++ b/docs/src/examples/components/scroll/scroll-fade-flip.svelte @@ -0,0 +1,24 @@ + + +
+ {#each items as item, i (item)} +
{item}
+ {/each} +
+ +
+ +
diff --git a/docs/src/examples/components/scroll/scroll-fade-horizontal.svelte b/docs/src/examples/components/scroll/scroll-fade-horizontal.svelte new file mode 100644 index 0000000..84a249f --- /dev/null +++ b/docs/src/examples/components/scroll/scroll-fade-horizontal.svelte @@ -0,0 +1,14 @@ + + +
+
+ {#each items as item, i} +
{item}
+ {/each} +
+
diff --git a/docs/src/examples/components/scroll/scroll-fade.svelte b/docs/src/examples/components/scroll/scroll-fade.svelte new file mode 100644 index 0000000..c8544c7 --- /dev/null +++ b/docs/src/examples/components/scroll/scroll-fade.svelte @@ -0,0 +1,12 @@ + + +
+ {#each items as item, i (item)} +
{item}
+ {/each} +
diff --git a/docs/src/examples/components/scroll/scroll-shadow-bottom-surface.svelte b/docs/src/examples/components/scroll/scroll-shadow-bottom-surface.svelte new file mode 100644 index 0000000..1426818 --- /dev/null +++ b/docs/src/examples/components/scroll/scroll-shadow-bottom-surface.svelte @@ -0,0 +1,17 @@ + + +
+ {#each items as item, i} +
{item}
+ {/each} +
diff --git a/docs/src/examples/components/scroll/scroll-shadow-flip.svelte b/docs/src/examples/components/scroll/scroll-shadow-flip.svelte new file mode 100644 index 0000000..e8edba5 --- /dev/null +++ b/docs/src/examples/components/scroll/scroll-shadow-flip.svelte @@ -0,0 +1,24 @@ + + +
+ {#each items as item, i (item)} +
{item}
+ {/each} +
+ +
+ +
diff --git a/docs/src/examples/components/scroll/scroll-shadow-horizontal.svelte b/docs/src/examples/components/scroll/scroll-shadow-horizontal.svelte new file mode 100644 index 0000000..647ac7a --- /dev/null +++ b/docs/src/examples/components/scroll/scroll-shadow-horizontal.svelte @@ -0,0 +1,14 @@ + + +
+
+ {#each items as item, i} +
{item}
+ {/each} +
+
diff --git a/docs/src/examples/components/scroll/scroll-shadow-truncation.svelte b/docs/src/examples/components/scroll/scroll-shadow-truncation.svelte new file mode 100644 index 0000000..6660864 --- /dev/null +++ b/docs/src/examples/components/scroll/scroll-shadow-truncation.svelte @@ -0,0 +1,12 @@ + + +
+ {#each items as item, i} +
{item} with a really long description
+ {/each} +
diff --git a/docs/src/examples/components/scroll/scroll-shadow.svelte b/docs/src/examples/components/scroll/scroll-shadow.svelte new file mode 100644 index 0000000..1b76a8c --- /dev/null +++ b/docs/src/examples/components/scroll/scroll-shadow.svelte @@ -0,0 +1,12 @@ + + +
+ {#each items as item, i (item)} +
{item}
+ {/each} +
diff --git a/docs/src/examples/components/selectionStore/basic.svelte b/docs/src/examples/components/selectionStore/basic.svelte new file mode 100644 index 0000000..f850747 --- /dev/null +++ b/docs/src/examples/components/selectionStore/basic.svelte @@ -0,0 +1,20 @@ + + +{#each data as d} +
+ $selection.toggleSelected(d.id)} + > + {d.id} + +
+{/each} +selected: {JSON.stringify($selection.selected)} diff --git a/docs/src/examples/components/selectionStore/initial-selection.svelte b/docs/src/examples/components/selectionStore/initial-selection.svelte new file mode 100644 index 0000000..13ba31f --- /dev/null +++ b/docs/src/examples/components/selectionStore/initial-selection.svelte @@ -0,0 +1,20 @@ + + +{#each data as d} +
+ $selection.toggleSelected(d.id)} + > + {d.id} + +
+{/each} +selected: {JSON.stringify($selection.selected)} diff --git a/docs/src/examples/components/selectionStore/max.svelte b/docs/src/examples/components/selectionStore/max.svelte new file mode 100644 index 0000000..0e35e1a --- /dev/null +++ b/docs/src/examples/components/selectionStore/max.svelte @@ -0,0 +1,21 @@ + + +{#each data as d} +
+ $selection.toggleSelected(d.id)} + disabled={$selection.isDisabled(d.id)} + > + {d.id} + +
+{/each} +selected: {JSON.stringify($selection.selected)} diff --git a/docs/src/examples/components/selectionStore/select-all.svelte b/docs/src/examples/components/selectionStore/select-all.svelte new file mode 100644 index 0000000..4b288d4 --- /dev/null +++ b/docs/src/examples/components/selectionStore/select-all.svelte @@ -0,0 +1,27 @@ + + + $selection.toggleAll()} +> + Select all + +{#each data as d} +
+ $selection.toggleSelected(d.id)} + > + {d.id} + +
+{/each} +selected: {JSON.stringify($selection.selected)} diff --git a/docs/src/examples/components/selectionStore/single.svelte b/docs/src/examples/components/selectionStore/single.svelte new file mode 100644 index 0000000..b28f160 --- /dev/null +++ b/docs/src/examples/components/selectionStore/single.svelte @@ -0,0 +1,21 @@ + + +{#each data as d} +
+ $selection.toggleSelected(d.id)} + > + {d.id} + +
+{/each} +selected: {JSON.stringify($selection.selected)} diff --git a/docs/src/examples/components/spotlight/global-context-and-css-variables.svelte b/docs/src/examples/components/spotlight/global-context-and-css-variables.svelte new file mode 100644 index 0000000..e973db8 --- /dev/null +++ b/docs/src/examples/components/spotlight/global-context-and-css-variables.svelte @@ -0,0 +1,35 @@ + + + { + const body = window.document.body; + body.style.setProperty('--x', e.clientX + 'px'); + body.style.setProperty('--y', e.clientY + 'px'); + }} +/> + +
+ {#each items as item, i} +
+ {item} +
+ {/each} +
diff --git a/docs/src/examples/components/spotlight/global-context-and-options.svelte b/docs/src/examples/components/spotlight/global-context-and-options.svelte new file mode 100644 index 0000000..267d1a7 --- /dev/null +++ b/docs/src/examples/components/spotlight/global-context-and-options.svelte @@ -0,0 +1,45 @@ + + + { + const body = window.document.body; + body.style.setProperty('--x', e.clientX + 'px'); + body.style.setProperty('--y', e.clientY + 'px'); + }} +/> + +
+ {#each items as item, i} +
+ {item} +
+ {/each} +
diff --git a/docs/src/examples/components/spotlight/line.svelte b/docs/src/examples/components/spotlight/line.svelte new file mode 100644 index 0000000..777a3c3 --- /dev/null +++ b/docs/src/examples/components/spotlight/line.svelte @@ -0,0 +1,36 @@ + + + { + const body = window.document.body; + body.style.setProperty('--x', e.clientX + 'px'); + body.style.setProperty('--y', e.clientY + 'px'); + }} +/> + +
+ {#each items as item, i} +
+ {item} +
+ {/each} +
diff --git a/docs/src/examples/components/string/truncate-middle-ellipsis.svelte b/docs/src/examples/components/string/truncate-middle-ellipsis.svelte new file mode 100644 index 0000000..431cdaa --- /dev/null +++ b/docs/src/examples/components/string/truncate-middle-ellipsis.svelte @@ -0,0 +1,7 @@ + + +
{truncate(str, 20, 10)}
diff --git a/docs/src/examples/components/string/truncate-playground.svelte b/docs/src/examples/components/string/truncate-playground.svelte new file mode 100644 index 0000000..6bb68a4 --- /dev/null +++ b/docs/src/examples/components/string/truncate-playground.svelte @@ -0,0 +1,14 @@ + + +
+ + +
+
{truncate(str, totalChars, endChars)}
diff --git a/docs/src/examples/components/string/truncate-total-only.svelte b/docs/src/examples/components/string/truncate-total-only.svelte new file mode 100644 index 0000000..c984600 --- /dev/null +++ b/docs/src/examples/components/string/truncate-total-only.svelte @@ -0,0 +1,7 @@ + + +
{truncate(str, 20)}
diff --git a/docs/src/examples/components/string/unique-basic.svelte b/docs/src/examples/components/string/unique-basic.svelte new file mode 100644 index 0000000..66b0932 --- /dev/null +++ b/docs/src/examples/components/string/unique-basic.svelte @@ -0,0 +1,8 @@ + + +
{uniqueId('checkbox-')}
+
{uniqueId('checkbox-')}
+
{uniqueId('checkbox-')}
+
{uniqueId('radio-')}
diff --git a/docs/src/examples/components/styles/computed-styles.svelte b/docs/src/examples/components/styles/computed-styles.svelte new file mode 100644 index 0000000..4b773cb --- /dev/null +++ b/docs/src/examples/components/styles/computed-styles.svelte @@ -0,0 +1,47 @@ + + +
+
(_styles = styles)} + class={cls('size-10 rounded-sm outline-offset-2', backgroundClass)} + style:outline-style={outlineStyle} + >
+ +
+ + + primary + secondary + + + + + + solid + dashed + dotted + + +
+ + + + + + + + +
diff --git a/docs/src/examples/components/styles/style-props.svelte b/docs/src/examples/components/styles/style-props.svelte new file mode 100644 index 0000000..32f39d4 --- /dev/null +++ b/docs/src/examples/components/styles/style-props.svelte @@ -0,0 +1,21 @@ + + +
+
+
+ + +
+
diff --git a/docs/src/examples/components/timerStore/default.svelte b/docs/src/examples/components/timerStore/default.svelte new file mode 100644 index 0000000..94358ac --- /dev/null +++ b/docs/src/examples/components/timerStore/default.svelte @@ -0,0 +1,13 @@ + + +
{$dateTimer}
+ ((e.target as HTMLInputElement).checked ? dateTimer.start() : dateTimer.stop())} +/> diff --git a/docs/src/examples/components/timerStore/tick-count.svelte b/docs/src/examples/components/timerStore/tick-count.svelte new file mode 100644 index 0000000..2af4c9f --- /dev/null +++ b/docs/src/examples/components/timerStore/tick-count.svelte @@ -0,0 +1,13 @@ + + +
{$tickTimer}
+ ((e.target as HTMLInputElement).checked ? tickTimer.start() : tickTimer.stop())} +/> diff --git a/docs/src/examples/components/uniqueStore/basic.svelte b/docs/src/examples/components/uniqueStore/basic.svelte new file mode 100644 index 0000000..9884760 --- /dev/null +++ b/docs/src/examples/components/uniqueStore/basic.svelte @@ -0,0 +1,17 @@ + + +{#each data as d} +
+ selected.toggle(d.id)}> + {d.id} + +
+{/each} +selected: {JSON.stringify([...$selected])} diff --git a/docs/src/lib/components/Example.svelte b/docs/src/lib/components/Example.svelte new file mode 100644 index 0000000..113f334 --- /dev/null +++ b/docs/src/lib/components/Example.svelte @@ -0,0 +1,77 @@ + + +
+ {#if example} + {@const ExampleComponent = example.component} +
+
+ +
+
+ + {#if example.source} + + + {#if codeVisible} +
+ +
+ {/if} + {/if} + {:else} +
+ Example not found{name ? `: ${resolvedComponent}/${name}` : path ? `: ${path}` : ''} +
+ {/if} +
diff --git a/docs/src/lib/components/OpenWithButton.svelte b/docs/src/lib/components/OpenWithButton.svelte new file mode 100644 index 0000000..b86b858 --- /dev/null +++ b/docs/src/lib/components/OpenWithButton.svelte @@ -0,0 +1,16 @@ + + + diff --git a/docs/src/lib/content.ts b/docs/src/lib/content.ts new file mode 100644 index 0000000..39ada13 --- /dev/null +++ b/docs/src/lib/content.ts @@ -0,0 +1,32 @@ +import { error } from '@sveltejs/kit'; +import { + allReferences, + type Reference as ReferenceMetadata, + allGuides, + type Guide as GuideMetadata, +} from 'content-collections'; +import { createContentLoaders, type ContentType } from '@layerstack/docs/content'; +import { loadExample, loadExampleByPath } from '$lib/examples.js'; + +type Metadata = ReferenceMetadata | GuideMetadata; + +const modules = import.meta.glob<{ default: import('svelte').Component; metadata: Metadata }>( + '/src/content/**/*.md' +); + +const contentLoaders = createContentLoaders({ + modules, + getMetadata, + loadExample, + loadExampleByPath, + notFound: () => error(404, 'Could not find the document.'), +}); + +function getMetadata(slug: string, type: ContentType): Metadata | undefined { + if (type === 'guides') { + return allGuides.find((g) => g.slug === slug); + } + return allReferences.find((r) => r.slug === slug); +} + +export const { getMarkdownComponent, loadExamplesFromMarkdown } = contentLoaders; diff --git a/docs/src/lib/examples.ts b/docs/src/lib/examples.ts new file mode 100644 index 0000000..ab0e426 --- /dev/null +++ b/docs/src/lib/examples.ts @@ -0,0 +1,20 @@ +import type { Component } from 'svelte'; +import { createGlobExampleLoaders } from '@layerstack/docs/examples'; + +export const { loadExample, loadExamples, loadExampleByPath } = createGlobExampleLoaders({ + loadComponentExample: (type, component, name) => + import(`../examples/${type}/${component}/${name}.svelte`), + loadRawExampleModule: (type, component, name) => + import(`../examples/${type}/${component}/${name}.svelte?raw`), + pathExamples: import.meta.glob<{ default: Component }>([ + '/src/routes/**/*.svelte', + '/src/content/**/*.svelte', + ]), + rawPathExamples: import.meta.glob( + ['/src/routes/**/*.svelte', '/src/content/**/*.svelte'], + { + query: '?raw', + import: 'default', + } + ), +}); diff --git a/docs/src/lib/llms.ts b/docs/src/lib/llms.ts new file mode 100644 index 0000000..07ee4af --- /dev/null +++ b/docs/src/lib/llms.ts @@ -0,0 +1,108 @@ +import { allReferences, allGuides, type Reference } from 'content-collections'; +import { sortCollection } from '@layerstack/docs/collections'; +import { + generateGuideMarkdown as generateGuideMarkdownContent, + generateReferenceMarkdown as generateReferenceMarkdownDoc, + groupBySlugSegment, + linkListSection, + type ExampleSourceResolver, +} from '@layerstack/docs/llms'; + +const exampleSources = import.meta.glob('/src/examples/**/*.svelte', { + eager: true, + query: '?raw', + import: 'default', +}); + +const guideSources = import.meta.glob('/src/content/guides/**/*.md', { + eager: true, + query: '?raw', + import: 'default', +}); + +const resolveExampleSource: ExampleSourceResolver = (component, name) => { + if (!component) return undefined; + return exampleSources[`/src/examples/components/${component}/${name}.svelte`]; +}; + +/** Group reference docs by their package (first slug segment), sorted within each group. */ +function referencesByPackage(): [string, Reference[]][] { + return groupBySlugSegment(allReferences, { sort: sortCollection }); +} + +/** LLM-optimized markdown for a single reference doc (examples inlined). */ +export function generateReferenceMarkdown(doc: Reference): string { + return generateReferenceMarkdownDoc(doc, { + inlineExamples: true, + resolveSource: resolveExampleSource, + defaultComponent: doc.slug.split('/').pop(), + }); +} + +/** LLM-optimized markdown for a guide. */ +export function generateGuideMarkdown(name: string): string { + const raw = guideSources[`/src/content/guides/${name}.md`]; + if (!raw) throw new Error(`Guide "${name}" not found`); + return generateGuideMarkdownContent(raw, { fallbackTitle: name }); +} + +/** Root `/llms.txt` index — links to each page's `/llms.txt`. */ +export function generateLlmsTxt(baseUrl: string): string { + const sections: string[] = [ + `# LayerStack Documentation for LLMs + +> LayerStack is a collection of Svelte actions, stores, state, table utilities, and general utils for Svelte. + +This file links to LLM-optimized documentation in markdown format. Append \`/llms.txt\` to any page URL for its markdown, or see [/docs/llms.txt](${baseUrl}/docs/llms.txt) for everything in one file.`, + ]; + + const guides = sortCollection(allGuides.filter((g) => !g.draft)); + if (guides.length) { + sections.push( + linkListSection( + 'Guides', + guides.map((g) => ({ + name: g.name, + url: `${baseUrl}/docs/guides/${g.slug}/llms.txt`, + description: g.description, + })) + ) + ); + } + + for (const [pkg, docs] of referencesByPackage()) { + sections.push( + linkListSection( + pkg, + docs.map((d) => ({ + name: d.name, + url: `${baseUrl}/docs/${d.slug}/llms.txt`, + description: d.description, + })) + ) + ); + } + + return sections.join('\n\n'); +} + +/** `/docs/llms.txt` — the full documentation inlined into one file. */ +export function generateFullLlmsTxt(baseUrl: string): string { + const sections: string[] = [ + `# LayerStack Full Documentation for LLMs + +> LayerStack is a collection of Svelte actions, stores, state, table utilities, and general utils for Svelte. + +This file contains the complete LLM-optimized documentation. Index: [/llms.txt](${baseUrl}/llms.txt).`, + ]; + + for (const [pkg, docs] of referencesByPackage()) { + sections.push('---'); + sections.push(`# ${pkg}`); + for (const doc of docs) { + sections.push(generateReferenceMarkdown(doc)); + } + } + + return sections.join('\n\n'); +} diff --git a/docs/src/lib/searchContent.ts b/docs/src/lib/searchContent.ts new file mode 100644 index 0000000..2443915 --- /dev/null +++ b/docs/src/lib/searchContent.ts @@ -0,0 +1,24 @@ +import { allReferences, allGuides } from 'content-collections'; +import { buildSearchEntries, type SearchEntry } from '@layerstack/docs/search'; + +const topLevelPages: SearchEntry[] = [ + { + title: 'Introduction', + slug: '', + content: + 'LayerStack — a collection of Svelte actions, stores, state, table utilities, and general utils', + type: 'page', + }, +]; + +const guides = allGuides.filter((g) => !g.draft); + +export const searchContent: SearchEntry[] = [ + ...topLevelPages, + ...buildSearchEntries(guides, { type: 'guide', slugPrefix: 'docs/guides' }), + ...buildSearchEntries(allReferences, { + type: 'reference', + slugPrefix: 'docs', + category: (doc) => doc.slug.split('/')[0], + }), +]; diff --git a/sites/docs/src/routes/+error.svelte b/docs/src/routes/+error.svelte similarity index 100% rename from sites/docs/src/routes/+error.svelte rename to docs/src/routes/+error.svelte diff --git a/sites/docs/src/routes/+layout.server.ts b/docs/src/routes/+layout.server.ts similarity index 100% rename from sites/docs/src/routes/+layout.server.ts rename to docs/src/routes/+layout.server.ts diff --git a/docs/src/routes/+layout.svelte b/docs/src/routes/+layout.svelte new file mode 100644 index 0000000..84f6cd7 --- /dev/null +++ b/docs/src/routes/+layout.svelte @@ -0,0 +1,231 @@ + + + + {title} + + {#if page.url.origin.includes('https')} + + + + {/if} + + + + + +
+
+ +
+ + +
+ +
+ + + + { + window.open(e.detail.value, '_blank'); + }} + class="inline-block md:hidden" + > + + +
+ + +
+ + + + (showDrawer = false)} /> + + +
+ {@render children()} +
+ + + {#if !page.data.metadata?.hideTableOfContents && page.data.metadata?.toc?.length} + + {/if} +
diff --git a/sites/docs/src/routes/+layout.ts b/docs/src/routes/+layout.ts similarity index 81% rename from sites/docs/src/routes/+layout.ts rename to docs/src/routes/+layout.ts index 9502b08..bf67ffe 100644 --- a/sites/docs/src/routes/+layout.ts +++ b/docs/src/routes/+layout.ts @@ -8,7 +8,6 @@ export const ssr = false; export const load = async ({ data }) => { // Setup Posthog if (browser && !dev) { - // @ts-expect-error: `posthog.init()` is valid - https://posthog.com/docs/product-analytics/installation posthog.init('phc_F78mUWQpKPpsXS1mamJFzDWM8bivZrwIx4Nm1cI8BSb', { api_host: 'https://app.posthog.com', capture_pageview: false, diff --git a/sites/docs/src/routes/+page.svelte b/docs/src/routes/+page.svelte similarity index 100% rename from sites/docs/src/routes/+page.svelte rename to docs/src/routes/+page.svelte diff --git a/docs/src/routes/_NavMenu.svelte b/docs/src/routes/_NavMenu.svelte new file mode 100644 index 0000000..c9ad4e3 --- /dev/null +++ b/docs/src/routes/_NavMenu.svelte @@ -0,0 +1,127 @@ + + + + +{#snippet navItem({ label, path, icon }: { label: string; path: string; icon?: IconProp })} + onItemClick?.()} + /> +{/snippet} diff --git a/docs/src/routes/api/search.json/+server.ts b/docs/src/routes/api/search.json/+server.ts new file mode 100644 index 0000000..0c50b69 --- /dev/null +++ b/docs/src/routes/api/search.json/+server.ts @@ -0,0 +1,8 @@ +import { json } from '@sveltejs/kit'; +import { searchContent } from '$lib/searchContent'; + +export const prerender = true; + +export const GET = async () => { + return json(searchContent); +}; diff --git a/sites/docs/src/routes/app.css b/docs/src/routes/app.css similarity index 63% rename from sites/docs/src/routes/app.css rename to docs/src/routes/app.css index 39331aa..da4f5a5 100644 --- a/sites/docs/src/routes/app.css +++ b/docs/src/routes/app.css @@ -4,10 +4,50 @@ /* @import '@layerstack/tailwind/themes/basic.css'; */ @import '@layerstack/tailwind/themes/all.css'; @import '@layerstack/tailwind/utils.css'; +@import '@layerstack/docs/styles.css'; @source '../../node_modules/svelte-ux/dist'; +@source '../../node_modules/@layerstack/docs/dist'; @plugin '@tailwindcss/typography'; +@theme { + --font-sans: 'Inter Variable', sans-serif; + --font-pixel: 'Departure Mono', monospace; +} + +@font-face { + font-family: 'Departure Mono'; + src: url('/fonts/DepartureMono-Regular.woff2') format('woff2'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +/* Match LayerChart: inline code uses the Departure Mono pixel font */ +code:not(pre > code):not(.custom) { + @apply font-pixel px-2; +} + +@layer utilities { + .background-gradient { + background: radial-gradient( + 49.63% 57.02% at 58.99% -7.2%, + color-mix(in oklab, var(--color-primary) 5%, transparent) 39.4%, + transparent 100% + ); + } + + .background-grid { + --size: 50px; + --_g: #0000 90deg, color-mix(in srgb, var(--color-primary) 5%, transparent) 0; + + background: + conic-gradient(from 90deg at 2px 2px, var(--_g)) 0 0 / var(--size) var(--size), + conic-gradient(from 90deg at 1px 1px, var(--_g)) 0 0 / calc(var(--size) / 5) + calc(var(--size) / 5); + } +} + /* Useful with `basic.css` */ /* :root { --color-primary: light-dark(var(--color-emerald-600), var(--color-indigo-700)); @@ -37,17 +77,8 @@ */ html { @apply bg-surface-200 accent-primary scroll-smooth; - /* background-image: - radial-gradient(at 0% 0%, hsl(var(--color-secondary) / 0.33) 0px, transparent 50%), - radial-gradient(at 98% 1%, hsl(var(--color-primary) / 0.33) 0px, transparent 50%); */ -} - -nav h1 { - @apply py-2 pl-4 mt-4 text-sm text-surface-content font-bold bg-surface-200 border-t border-b; -} - -nav h2 { - @apply pt-4 pb-2 pl-4 text-xs text-surface-content font-bold; + /* App header height (was provided by svelte-ux AppLayout; now a custom shell) */ + --headerHeight: 4rem; } .prose { diff --git a/docs/src/routes/docs/+layout.svelte b/docs/src/routes/docs/+layout.svelte new file mode 100644 index 0000000..d32d464 --- /dev/null +++ b/docs/src/routes/docs/+layout.svelte @@ -0,0 +1,11 @@ + + + diff --git a/docs/src/routes/docs/[packageName]/[name]/+page.svelte b/docs/src/routes/docs/[packageName]/[name]/+page.svelte new file mode 100644 index 0000000..ff081aa --- /dev/null +++ b/docs/src/routes/docs/[packageName]/[name]/+page.svelte @@ -0,0 +1,92 @@ + + +
+
+ Docs + + {page.params.packageName} +
+ +
+ {metadata.name} + {#if metadata.status} + + {metadata.status} + + {/if} +
+ + {#if metadata.description} +
+ {metadata.description} +
+ {/if} + +
+ +
+
+ +
+ {#if metadata.features?.length} +

Features

+
    + {#each metadata.features as feature (feature)} +
  • {@html feature}
  • + {/each} +
+ {/if} + + {#key page.url.pathname} + + {/key} + + {#if metadata.related?.length} + +
+ {#each metadata.related as related (related)} + + {/each} +
+ {/if} + + +
diff --git a/docs/src/routes/docs/[packageName]/[name]/+page.ts b/docs/src/routes/docs/[packageName]/[name]/+page.ts new file mode 100644 index 0000000..5caec57 --- /dev/null +++ b/docs/src/routes/docs/[packageName]/[name]/+page.ts @@ -0,0 +1,13 @@ +import { getMarkdownComponent, loadExamplesFromMarkdown } from '$lib/content.js'; + +export const load = async ({ params }) => { + const slug = `${params.packageName}/${params.name}`; + + const { PageComponent, metadata } = await getMarkdownComponent(slug, 'reference'); + + // Eagerly load any examples referenced by the markdown (`:example{name="..."}`), + // defaulting the component to the current item name. + const examples = await loadExamplesFromMarkdown(metadata.content, params.name, 'reference'); + + return { PageComponent, metadata, examples }; +}; diff --git a/docs/src/routes/docs/[packageName]/[name]/llms.txt/+server.ts b/docs/src/routes/docs/[packageName]/[name]/llms.txt/+server.ts new file mode 100644 index 0000000..4fcdde6 --- /dev/null +++ b/docs/src/routes/docs/[packageName]/[name]/llms.txt/+server.ts @@ -0,0 +1,16 @@ +import { allReferences } from 'content-collections'; +import { error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { generateReferenceMarkdown } from '$lib/llms'; +import { markdownResponse } from '@layerstack/docs/llms'; + +/** LLM-optimized markdown for a reference doc (page content + inlined examples). */ +export const GET: RequestHandler = async ({ params }) => { + const slug = `${params.packageName}/${params.name}`; + const doc = allReferences.find((r) => r.slug === slug); + if (!doc) { + error(404, 'Not found'); + } + + return markdownResponse(generateReferenceMarkdown(doc), `${params.name}.md`); +}; diff --git a/docs/src/routes/docs/guides/[...name]/+page.svelte b/docs/src/routes/docs/guides/[...name]/+page.svelte new file mode 100644 index 0000000..606eb0a --- /dev/null +++ b/docs/src/routes/docs/guides/[...name]/+page.svelte @@ -0,0 +1,58 @@ + + +
+
+ Docs + + Guides +
+ +
{metadata.name}
+ + {#if metadata.description} +
+ {metadata.description} +
+ {/if} + +
+ +
+
+ +
+ {#key page.url.pathname} + + {/key} + + +
diff --git a/docs/src/routes/docs/guides/[...name]/+page.ts b/docs/src/routes/docs/guides/[...name]/+page.ts new file mode 100644 index 0000000..f74122b --- /dev/null +++ b/docs/src/routes/docs/guides/[...name]/+page.ts @@ -0,0 +1,8 @@ +import { getMarkdownComponent, loadExamplesFromMarkdown } from '$lib/content.js'; + +export const load = async ({ params }) => { + const { PageComponent, metadata } = await getMarkdownComponent(params.name, 'guides'); + const examples = await loadExamplesFromMarkdown(metadata.content, undefined, 'guides'); + + return { PageComponent, metadata, examples }; +}; diff --git a/docs/src/routes/docs/guides/[...name]/llms.txt/+server.ts b/docs/src/routes/docs/guides/[...name]/llms.txt/+server.ts new file mode 100644 index 0000000..020e424 --- /dev/null +++ b/docs/src/routes/docs/guides/[...name]/llms.txt/+server.ts @@ -0,0 +1,12 @@ +import { error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { generateGuideMarkdown } from '$lib/llms'; +import { markdownResponse } from '@layerstack/docs/llms'; + +export const GET: RequestHandler = async ({ params }) => { + try { + return markdownResponse(generateGuideMarkdown(params.name), `${params.name}.md`); + } catch { + error(404, 'Not found'); + } +}; diff --git a/docs/src/routes/docs/llms.txt/+server.ts b/docs/src/routes/docs/llms.txt/+server.ts new file mode 100644 index 0000000..0dd50a9 --- /dev/null +++ b/docs/src/routes/docs/llms.txt/+server.ts @@ -0,0 +1,7 @@ +import type { RequestHandler } from './$types'; +import { generateFullLlmsTxt } from '$lib/llms'; +import { markdownResponse } from '@layerstack/docs/llms'; + +export const GET: RequestHandler = async ({ url }) => { + return markdownResponse(generateFullLlmsTxt(url.origin), 'llms-full.md'); +}; diff --git a/sites/docs/src/routes/docs/svelte-actions/+page.server.ts b/docs/src/routes/docs/svelte-actions/+page.server.ts similarity index 100% rename from sites/docs/src/routes/docs/svelte-actions/+page.server.ts rename to docs/src/routes/docs/svelte-actions/+page.server.ts diff --git a/sites/docs/src/routes/docs/svelte-state/+page.server.ts b/docs/src/routes/docs/svelte-state/+page.server.ts similarity index 100% rename from sites/docs/src/routes/docs/svelte-state/+page.server.ts rename to docs/src/routes/docs/svelte-state/+page.server.ts diff --git a/sites/docs/src/routes/docs/svelte-stores/+page.server.ts b/docs/src/routes/docs/svelte-stores/+page.server.ts similarity index 100% rename from sites/docs/src/routes/docs/svelte-stores/+page.server.ts rename to docs/src/routes/docs/svelte-stores/+page.server.ts diff --git a/sites/docs/src/routes/docs/svelte-table/+page.server.ts b/docs/src/routes/docs/svelte-table/+page.server.ts similarity index 100% rename from sites/docs/src/routes/docs/svelte-table/+page.server.ts rename to docs/src/routes/docs/svelte-table/+page.server.ts diff --git a/sites/docs/src/routes/docs/tailwind/+page.server.ts b/docs/src/routes/docs/tailwind/+page.server.ts similarity index 100% rename from sites/docs/src/routes/docs/tailwind/+page.server.ts rename to docs/src/routes/docs/tailwind/+page.server.ts diff --git a/sites/docs/src/routes/docs/utils/+page.server.ts b/docs/src/routes/docs/utils/+page.server.ts similarity index 100% rename from sites/docs/src/routes/docs/utils/+page.server.ts rename to docs/src/routes/docs/utils/+page.server.ts diff --git a/docs/src/routes/llms.txt/+server.ts b/docs/src/routes/llms.txt/+server.ts new file mode 100644 index 0000000..dcfee02 --- /dev/null +++ b/docs/src/routes/llms.txt/+server.ts @@ -0,0 +1,7 @@ +import type { RequestHandler } from './$types'; +import { generateLlmsTxt } from '$lib/llms'; +import { markdownResponse } from '@layerstack/docs/llms'; + +export const GET: RequestHandler = async ({ url }) => { + return markdownResponse(generateLlmsTxt(url.origin), 'llms.md'); +}; diff --git a/sites/docs/static/favicon.jpg b/docs/static/favicon.jpg similarity index 100% rename from sites/docs/static/favicon.jpg rename to docs/static/favicon.jpg diff --git a/docs/static/fonts/DepartureMono-Regular.woff2 b/docs/static/fonts/DepartureMono-Regular.woff2 new file mode 100644 index 0000000..b4a23dc Binary files /dev/null and b/docs/static/fonts/DepartureMono-Regular.woff2 differ diff --git a/docs/svelte.config.js b/docs/svelte.config.js new file mode 100644 index 0000000..f7bd60e --- /dev/null +++ b/docs/svelte.config.js @@ -0,0 +1,44 @@ +import adapter from '@sveltejs/adapter-cloudflare'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; +import { mdsx } from 'mdsx'; + +import { mdsxConfig } from './mdsx.config.js'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + extensions: ['.svelte', '.md'], + preprocess: [mdsx(mdsxConfig), vitePreprocess()], + + vitePlugin: { + inspector: { + toggleKeyCombo: 'alt-shift', + toggleButtonPos: 'bottom-right', + }, + }, + + kit: { + adapter: adapter(), + alias: { + $examples: 'src/examples', + 'content-collections': './.content-collections/generated', + // Resolve workspace libraries to their *source* during dev/build so Vite compiles + // them directly — instant HMR, no per-package build/watch. (`@layerstack/tailwind` + // is intentionally excluded: its CSS themes are generated into `dist`, and + // `@layerstack/docs` keeps its custom export map, so both stay dist-resolved.) + '@layerstack/svelte-actions': '../packages/svelte-actions/src/lib', + '@layerstack/svelte-state': '../packages/svelte-state/src/lib', + '@layerstack/svelte-stores': '../packages/svelte-stores/src/lib', + '@layerstack/svelte-table': '../packages/svelte-table/src/lib', + '@layerstack/utils': '../packages/utils/src/lib', + // `?raw` source-display aliases (kept for legacy pages) + '$svelte-actions': '../packages/svelte-actions/src/lib', + '$svelte-state': '../packages/svelte-state/src/lib', + '$svelte-stores': '../packages/svelte-stores/src/lib', + '$svelte-table': '../packages/svelte-table/src/lib', + $tailwind: '../packages/tailwind/src/lib', + $utils: '../packages/utils/src/lib', + }, + }, +}; + +export default config; diff --git a/sites/docs/tsconfig.json b/docs/tsconfig.json similarity index 86% rename from sites/docs/tsconfig.json rename to docs/tsconfig.json index 4b06227..794b95b 100644 --- a/sites/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -8,9 +8,7 @@ "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, - "strict": true, - "module": "NodeNext", - "moduleResolution": "NodeNext" + "strict": true } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias // diff --git a/sites/docs/vite.config.js b/docs/vite.config.js similarity index 53% rename from sites/docs/vite.config.js rename to docs/vite.config.js index b003322..b8ca1c0 100644 --- a/sites/docs/vite.config.js +++ b/docs/vite.config.js @@ -2,10 +2,17 @@ import { defineConfig } from 'vite'; import { sveltekit } from '@sveltejs/kit/vite'; import tailwindcss from '@tailwindcss/vite'; import Icons from 'unplugin-icons/vite'; +import contentCollections from '@content-collections/vite'; export default defineConfig({ - plugins: [tailwindcss(), sveltekit(), Icons({ compiler: 'svelte' })], + plugins: [tailwindcss(), sveltekit(), contentCollections(), Icons({ compiler: 'svelte' })], resolve: { noExternal: true, // https://github.com/AdrianGonz97/refined-cf-pages-action/issues/26#issuecomment-2878397440 }, + server: { + fs: { + // Allow serving the generated `live` code-block components (```svelte live) + allow: ['.live-code'], + }, + }, }); diff --git a/package.json b/package.json index c8162b7..9d19d31 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,12 @@ "license": "MIT", "type": "module", "scripts": { + "dev": "pnpm clean && pnpm --filter @layerstack/utils --filter @layerstack/tailwind --filter @layerstack/docs build && pnpm --parallel --filter @layerstack/docs --filter @layerstack/docs-site --if-present dev", "test:unit": "pnpm -r test:unit", - "build": "rimraf packages/*/dist && pnpm -r build", - "build:packages": "rimraf packages/*/dist && pnpm --filter './packages/*' build", + "clean": "rimraf packages/*/dist", + "build": "pnpm clean && pnpm -r build", + "build:packages": "pnpm clean && pnpm --filter './packages/*' build", + "package": "pnpm --filter './packages/*' package", "check": "pnpm -r check", "lint": "pnpm -r lint", "format": "pnpm -r format", diff --git a/sites/docs/.prettierignore b/packages/docs/.prettierignore similarity index 100% rename from sites/docs/.prettierignore rename to packages/docs/.prettierignore diff --git a/packages/docs/README.md b/packages/docs/README.md new file mode 100644 index 0000000..f62f31d --- /dev/null +++ b/packages/docs/README.md @@ -0,0 +1,99 @@ +# @layerstack/docs + +Reusable documentation framework and tooling for LayerStack projects (LayerStack, LayerChart, svelte-ux, …). + +It turns a folder of markdown + Svelte example files into a full documentation site — markdown rendering, content collections, doc UI components, client-side search, `llms.txt` output, and a build-time CLI — so each project only writes content and a thin layer of glue. + +> **📚 Guides** — _getting started_, _setup_, _authoring_, _markdown & directives_, and the +> _CLI_ — are written **with** this framework and live at +> [`docs/src/content/guides/docs/`](https://github.com/techniq/layerstack/tree/main/docs/src/content/guides/docs) +> (rendered at `/docs/guides/docs`). Start there for the full walkthrough; this README is a +> quick orientation plus the export reference. + +## What it provides + +- **Markdown rendering** — a shared [mdsx](https://github.com/huntabyte/mdsx) config (`createMdsxConfig`) with GFM, [MDC directives](https://content.nuxt.com/docs/files/markdown#mdc-syntax), [Shiki](https://shiki.style/) highlighting (diff + line highlighting), heading slugs, and styled element components. +- **Content collections** — a [content-collections](https://www.content-collections.dev/) factory (`createContentConfig`) that turns `src/content/**/*.md` into typed collections (`references`, `guides`, `components`, `utils`, `releases`) with TOC, GitHub source links, and generated API/catalog data attached. +- **Doc UI components** — `Code`, `Search`, `TableOfContents`, `OpenWithButton`, `RelatedLink`, `ExampleScreenshot`, … (see [Export reference](#export-reference)). +- **Content & example loaders** — `createContentLoaders` / `createGlobExampleLoaders` wire a docs app's `import.meta.glob` to the framework. +- **Search** — a FlexSearch index (`buildSearchEntries` → `/api/search.json`) surfaced by the `Search` command palette (⌘K). +- **`llms.txt`** — helpers to emit LLM-friendly markdown endpoints. +- **CLI (`layerstack-docs`)** — generators for component API JSON, example catalogs, screenshots, StackBlitz bundles, and release notes. + +## How it fits together + +The framework owns the **mechanics**; the consumer owns the **content** and a small amount of **glue** (mostly because `import.meta.glob` must be evaluated in the consumer's project root). + +| Responsibility | Owner | +| --------------------------------------------------------------- | ------------------------- | +| Markdown/mdsx pipeline, content-collection schemas & transforms | **framework** | +| Doc UI components, search, `llms.txt` assembly, CLI generators | **framework** | +| `content/**/*.md` + `examples/**/*.svelte` source | **you** | +| `import.meta.glob` wiring (`src/lib/content.ts`, `examples.ts`) | **you** (thin) | +| Routes, app shell, nav, theme | **you** (copy a consumer) | + +Two common shapes: **hand-authored reference docs** (LayerStack — `references` + `guides`, no generators) and **generated component docs** (LayerChart — `components`/`utils`/`guides` plus the CLI generators). + +## Quick start + +Requires **Svelte 5** + **SvelteKit 2** and a **Tailwind v4** setup with [`@layerstack/tailwind`](../tailwind). A docs app wires up a handful of files — the +[Setup guide](https://github.com/techniq/layerstack/blob/main/docs/src/content/guides/docs/setup.md) +has the full walkthrough: + +```ts +// content-collections.ts +export default createContentConfig({ packageName: 'layerstack', repo: 'techniq/layerstack' }); +``` + +```js +// mdsx.config.js +export const mdsxConfig = createMdsxConfig({ exampleComponentPath: '$lib/components' }); +``` + +- `svelte.config.js` — `.md` extension, the `mdsx` preprocessor, and a `content-collections` alias. +- `vite.config.js` — `tailwindcss()`, `sveltekit()`, `contentCollections()`, `Icons()`. +- `app.css` — import `@layerstack/tailwind/*` + `@layerstack/docs/styles.css`. +- `src/lib/{content,examples}.ts` — hand your `import.meta.glob` to `createContentLoaders` / `createGlobExampleLoaders`. +- Routes (`+page.ts`/`+page.svelte`, `llms.txt`, `api/search.json`) — boilerplate; copy a [reference consumer](#reference-consumers). + +> `@layerstack/docs` is consumed from its built `dist/`, so **the framework must be built before a docs app builds.** Don't source-alias it. + +## Export reference + +Import from subpaths (e.g. `import { Code } from '@layerstack/docs/components'`). + +**Runtime / browser** + +| Subpath | Key exports | +| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `.` | barrel of `api`, `catalog`, `collections`, `components`, `content`, `context`, `examples`, `markdown`, `page-transitions`, `project-stats` | +| `/components` | `Code`, `Json`, `Search`, `TableOfContents`, `OpenWithButton`, `ViewSourceButton`, `ExampleLink`, `ExampleListing`, `ComponentLink`, `RelatedLink`, `ExampleScreenshot`, `ImageLink`, `Tabs`, `Steps`, `Step`, `Blockquote`, `LoadingPlaceholder` (also via `/components/*.svelte`) | +| `/markdown/components` | markdown element components (`A`, `Code`, `H1`–`H4`, `P`, `Table`, …) + directive components (`Note`, `Tabs`, `Tab`, `Steps`, `Button`, `LiveCode`) | +| `/content` | `createContentLoaders`, `resolveExamplePath`, `extractExampleReferences`, `getFirstExampleName` | +| `/examples` | `createGlobExampleLoaders`, `createExampleLoaders`, `cleanExampleSource` | +| `/context` | `examples` (runed context) | +| `/collections` | `sortCollection` | +| `/search` | `initSearch`, `search`, `buildSearchEntries`, `extractHeadingContents`, type `SearchEntry` | +| `/utils` | `stripIndent` | +| `/page-transitions` | `preparePageTransition` | +| `/project-stats` | `getProjectStats` | +| `/api`, `/catalog` | type-only (`ComponentAPI`, `ComponentCatalog`, …) | + +**Build-time / Node** + +| Subpath | Key exports | +| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `/content-collections` | `createContentConfig`, the five Zod schemas | +| `/markdown/config` | `createMdsxConfig`, `prettyCodeOptions`, `remarkComponents`, `remarkLiveCode`, `rehypeCodeBlocks`, `shikiDiffTransformer` | +| `/markdown` | `extractTocFromMarkdown`, `stripMarkdown` | +| `/markdown/rehype/live-code` | `remarkLiveCode` | +| `/llms` | `processMarkdownContent`, `inlineExampleDirectives`, `generateReferenceMarkdown`, `generateGuideMarkdown`, `linkListSection`, `groupBySlugSegment`, `generateApiTable`, `markdownResponse`, `trimCode`, `extractFrontmatterTitle` | +| `/node/*` | `writeComponentAPIs`, `writeExampleCatalogs`, `generateScreenshots`, `generateStackBlitzFiles`, `generateReleases` (the `layerstack-docs` CLI wraps these) | +| `/styles.css` | shipped CSS | + +## Reference consumers + +Two real apps exercise the framework — copy whichever shape matches your project: + +- **LayerStack docs** (`docs/`, `@layerstack/docs-site`) — hand-authored **reference** docs across many small packages; no generators; `references` + `guides` collections. +- **LayerChart docs** (`layerchart/docs`) — **generated** component docs; uses all five `generate:*` CLI scripts, `components`/`utils`/`guides` collections, screenshots, StackBlitz playground, and releases. diff --git a/packages/docs/package.json b/packages/docs/package.json new file mode 100644 index 0000000..d9f476a --- /dev/null +++ b/packages/docs/package.json @@ -0,0 +1,194 @@ +{ + "name": "@layerstack/docs", + "description": "Reusable documentation framework and tooling for LayerStack projects", + "author": "Sean Lynch ", + "license": "MIT", + "repository": "techniq/layerstack", + "private": true, + "version": "0.0.0", + "type": "module", + "bin": { + "layerstack-docs": "./dist/cli.js" + }, + "scripts": { + "dev": "trap 'exit 0' INT; svelte-package --watch", + "build": "svelte-package", + "package": "svelte-package", + "prepare": "svelte-kit sync", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check .", + "format": "prettier --write ." + }, + "dependencies": { + "@content-collections/core": "^0.14.3", + "@content-collections/markdown": "^0.1.4", + "@iconify-json/lucide": "^1.2.53", + "@iconify-json/simple-icons": "^1.2.84", + "@layerstack/tailwind": "workspace:*", + "@layerstack/utils": "workspace:*", + "@shikijs/transformers": "^4.1.0", + "flexsearch": "^0.8.212", + "@sveltejs/svelte-json-tree": "^2.2.1", + "@webcontainer/api": "^1.6.4", + "github-slugger": "^2.0.0", + "mdsx": "^0.0.7", + "playwright": "^1.60.0", + "rehype-pretty-code": "^0.14.3", + "rehype-slug": "^6.0.0", + "remark-gfm": "^4.0.1", + "remark-mdc": "^3.11.0", + "runed": "^0.37.1", + "sharp": "^0.34.5", + "shiki": "^4.1.0", + "svelte-ux": "2.0.0-next.22", + "typescript": "^5.8.3", + "unist-builder": "^4.0.0", + "unist-util-visit": "^5.1.0", + "zod": "^4.4.3" + }, + "devDependencies": { + "@sveltejs/kit": "^2.21.0", + "@sveltejs/package": "^2.3.11", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@types/node": "^24.0.1", + "prettier": "^3.5.3", + "prettier-plugin-svelte": "^3.3.3", + "svelte": "^5.28.2", + "svelte-check": "^4.1.6", + "tslib": "^2.8.1", + "unplugin-icons": "^22.1.0", + "vite": "^6.3.5" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.0.0", + "svelte": "^5.0.0" + }, + "type": "module", + "main": "./dist/index.js", + "svelte": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "svelte": "./dist/index.js", + "default": "./dist/index.js" + }, + "./api": { + "types": "./dist/api-types.d.ts", + "default": "./dist/api-types.js" + }, + "./catalog": { + "types": "./dist/catalog.d.ts", + "default": "./dist/catalog.js" + }, + "./collections": { + "types": "./dist/collections.d.ts", + "default": "./dist/collections.js" + }, + "./content": { + "types": "./dist/content.d.ts", + "default": "./dist/content.js" + }, + "./context": { + "types": "./dist/context.d.ts", + "svelte": "./dist/context.js", + "default": "./dist/context.js" + }, + "./examples": { + "types": "./dist/examples.d.ts", + "default": "./dist/examples.js" + }, + "./examples-glob": { + "types": "./dist/examples-glob.d.ts", + "default": "./dist/examples-glob.js" + }, + "./page-transitions": { + "types": "./dist/page-transitions.d.ts", + "default": "./dist/page-transitions.js" + }, + "./project-stats": { + "types": "./dist/project-stats.d.ts", + "default": "./dist/project-stats.js" + }, + "./llms": { + "types": "./dist/llms.d.ts", + "default": "./dist/llms.js" + }, + "./search": { + "types": "./dist/search.d.ts", + "default": "./dist/search.js" + }, + "./utils": { + "types": "./dist/utils/index.d.ts", + "default": "./dist/utils/index.js" + }, + "./components": { + "types": "./dist/components/index.d.ts", + "svelte": "./dist/components/index.js", + "default": "./dist/components/index.js" + }, + "./components/*.svelte": { + "types": "./dist/components/*.svelte.d.ts", + "svelte": "./dist/components/*.svelte", + "default": "./dist/components/*.svelte" + }, + "./markdown": { + "types": "./dist/markdown/index.d.ts", + "default": "./dist/markdown/index.js" + }, + "./markdown/config": { + "types": "./dist/markdown/config/index.d.ts", + "default": "./dist/markdown/config/index.js" + }, + "./markdown/rehype/live-code": { + "types": "./dist/markdown/rehype/live-code.d.ts", + "default": "./dist/markdown/rehype/live-code.js" + }, + "./markdown/components": { + "types": "./dist/markdown/components/index.d.ts", + "svelte": "./dist/markdown/components/index.js", + "default": "./dist/markdown/components/index.js" + }, + "./markdown/components/*.svelte": { + "types": "./dist/markdown/components/*.svelte.d.ts", + "svelte": "./dist/markdown/components/*.svelte", + "default": "./dist/markdown/components/*.svelte" + }, + "./markdown/blueprints/default/blueprint.svelte": { + "types": "./dist/markdown/blueprints/default/blueprint.svelte.d.ts", + "svelte": "./dist/markdown/blueprints/default/blueprint.svelte", + "default": "./dist/markdown/blueprints/default/blueprint.svelte" + }, + "./content-collections": { + "types": "./dist/content-collections/index.d.ts", + "default": "./dist/content-collections/index.js" + }, + "./node/stackblitz": { + "types": "./dist/node/stackblitz.d.ts", + "default": "./dist/node/stackblitz.js" + }, + "./node/component-api": { + "types": "./dist/node/component-api.d.ts", + "default": "./dist/node/component-api.js" + }, + "./node/example-catalog": { + "types": "./dist/node/example-catalog.d.ts", + "default": "./dist/node/example-catalog.js" + }, + "./node/screenshots": { + "types": "./dist/node/screenshots.d.ts", + "default": "./dist/node/screenshots.js" + }, + "./node/releases": { + "types": "./dist/node/releases.d.ts", + "default": "./dist/node/releases.js" + }, + "./styles.css": "./dist/styles.css", + "./package.json": "./package.json" + }, + "files": [ + "dist", + "templates" + ] +} diff --git a/packages/docs/src/app.d.ts b/packages/docs/src/app.d.ts new file mode 100644 index 0000000..1209879 --- /dev/null +++ b/packages/docs/src/app.d.ts @@ -0,0 +1,10 @@ +/// +/// +/// + +// See https://svelte.dev/docs/kit/types#app.d.ts +declare global { + namespace App {} +} + +export {}; diff --git a/packages/docs/src/lib/api-types.ts b/packages/docs/src/lib/api-types.ts new file mode 100644 index 0000000..6f66007 --- /dev/null +++ b/packages/docs/src/lib/api-types.ts @@ -0,0 +1,32 @@ +/** + * Shared types for component API documentation + */ +export interface PropertyInfo { + name: string; + type: string; + required: boolean; + description?: string; + descriptionHtml?: string; + default?: string; + tags?: Record; + properties?: PropertyInfo[]; +} + +export interface ExtendedType { + name: string; + /** The full type expression, e.g., "SVGAttributes" */ + fullType: string; + /** For HTML/SVG element types, the element name, e.g., "SVGRectElement" */ + elementType?: string; + /** Whether this is a known library type that should be documented separately */ + isLibraryType?: boolean; +} + +export interface ComponentAPI { + generatedAt: string; + component: string; + propsType: string; + properties: PropertyInfo[]; + /** Types that are extended/intersected (e.g., CommonEvents, SVGAttributes) */ + extends?: ExtendedType[]; +} diff --git a/packages/docs/src/lib/catalog.ts b/packages/docs/src/lib/catalog.ts new file mode 100644 index 0000000..03f68d2 --- /dev/null +++ b/packages/docs/src/lib/catalog.ts @@ -0,0 +1,66 @@ +/** + * Type definitions for LayerChart component catalogs + * + * These types describe the structure of catalog JSON files generated by + * the `layerstack-docs generate-catalog` command. + */ + +/** + * Information about a component usage within an example + */ +export interface ComponentUsageInExample { + /** The component name */ + component: string; + /** The line number where the component is used */ + lineNumber: number; + /** The trimmed line of code containing the component usage */ + line: string; +} + +/** + * Information about a specific example for a component + */ +export interface ExampleInfo { + /** The name of the example (filename without .svelte extension) */ + name: string; + /** Human-readable title (from
a]:font-medium [&>a]:underline [&>a]:decoration-dashed [&>a]:decoration-primary/50 [&>a]:underline-offset-2' )} > - - + + {@render children()}
diff --git a/packages/docs/src/lib/components/Code.svelte b/packages/docs/src/lib/components/Code.svelte new file mode 100644 index 0000000..7144fbb --- /dev/null +++ b/packages/docs/src/lib/components/Code.svelte @@ -0,0 +1,164 @@ + + + + +
+ {#if title} +
+ {#if language === 'css'} + + {:else if language === 'javascript'} + + {:else if language === 'ts'} + + {:else if language === 'json'} + + {:else if language === 'sh' || language === 'bash'} + + {:else if language === 'svelte'} + + {:else if language === 'html'} + + {:else} + Icon ERROR: {language} + {/if} + {title} +
+ {/if} +
+ {#if source} + + + +
{#if highlighter}{@html highlighter.codeToHtml(sourceStr, {
+						lang: language,
+						themes: { light: 'github-light-default', dark: 'github-dark-default' },
+						meta: highlight ? { __raw: `{${highlight}}` } : undefined,
+						transformers: highlight ? [transformerMetaHighlight()] : undefined
+					})}{:else}Loading...{/if}
+ + {#if copyButton !== false} +
+ +
+ {/if} + {/if} +
+
+ + diff --git a/packages/docs/src/lib/components/ComponentLink.svelte b/packages/docs/src/lib/components/ComponentLink.svelte new file mode 100644 index 0000000..dd1c319 --- /dev/null +++ b/packages/docs/src/lib/components/ComponentLink.svelte @@ -0,0 +1,75 @@ + + + + {#snippet image()} + + {/snippet} + + {#snippet label()} + + + {component} + +
+ {#each supportedLayers ?? [] as layer} +
+ {layer} +
+ {/each} +
+ {/snippet} +
diff --git a/packages/docs/src/lib/components/ExampleLink.svelte b/packages/docs/src/lib/components/ExampleLink.svelte new file mode 100644 index 0000000..afe95a6 --- /dev/null +++ b/packages/docs/src/lib/components/ExampleLink.svelte @@ -0,0 +1,63 @@ + + + + {#snippet image()} + + {/snippet} + + {#snippet label()} + + + {#if showComponent} + {component} + + {/if} + {title ?? example.replaceAll('-', ' ')} + {/snippet} + diff --git a/packages/docs/src/lib/components/ExampleListing.svelte b/packages/docs/src/lib/components/ExampleListing.svelte new file mode 100644 index 0000000..2ebf27c --- /dev/null +++ b/packages/docs/src/lib/components/ExampleListing.svelte @@ -0,0 +1,173 @@ + + +{#if hasContent} +
+

{title}

+
+ {#if viewAllHref && catalog.examples?.length} + + {/if} + + + {#snippet prepend()} + + {/snippet} + + +
+
+
+
+ + {#if examples.length} +
+ {#each examples as example (example.name)} + + {/each} +
+ {:else if catalog.examples?.length} +

No examples match your filter.

+ {/if} + + {#if uniqueUsage.length} + {#if examples.length} + + {showDetails ? 'show less' : 'show more'}... +
+
+ {#each uniqueUsage as usage (`${usage.component}::${usage.example}`)} + + {/each} +
+
+
+ {:else if catalog.examples?.length === 0} +
+ {#each uniqueUsage as usage (`${usage.component}::${usage.example}`)} + + {/each} +
+ {:else if catalog.usage?.length} +

+ No additional usage examples match your filter. +

+ {/if} + {/if} +{/if} diff --git a/packages/docs/src/lib/components/ExampleScreenshot.svelte b/packages/docs/src/lib/components/ExampleScreenshot.svelte new file mode 100644 index 0000000..2d12d41 --- /dev/null +++ b/packages/docs/src/lib/components/ExampleScreenshot.svelte @@ -0,0 +1,70 @@ + + +
+ {#if hasError && fallbackIcon} + {@const FallbackIcon = fallbackIcon} +
+ +
+ {:else if !hasError} + {#each ['light', 'dark'] as mode (mode)} + {#each sizes as size (size.width)} + {component} - {example} (hasError = true)} + /> + {/each} + {/each} + {/if} +
diff --git a/packages/docs/src/lib/components/ImageLink.svelte b/packages/docs/src/lib/components/ImageLink.svelte new file mode 100644 index 0000000..054f6d2 --- /dev/null +++ b/packages/docs/src/lib/components/ImageLink.svelte @@ -0,0 +1,61 @@ + + + + {#if image} +
+ {@render image()} +
+ {/if} + + {#if label && variant !== 'screenshot-only'} +

+ + {@render label()} + + + +

+ {/if} +
diff --git a/packages/docs/src/lib/components/Json.svelte b/packages/docs/src/lib/components/Json.svelte new file mode 100644 index 0000000..fb92fb5 --- /dev/null +++ b/packages/docs/src/lib/components/Json.svelte @@ -0,0 +1,36 @@ + + +
+ +
diff --git a/packages/docs/src/lib/components/LoadingPlaceholder.svelte b/packages/docs/src/lib/components/LoadingPlaceholder.svelte new file mode 100644 index 0000000..1ce147d --- /dev/null +++ b/packages/docs/src/lib/components/LoadingPlaceholder.svelte @@ -0,0 +1,8 @@ + + +
+ + Loading... +
diff --git a/packages/docs/src/lib/components/OpenWithButton.svelte b/packages/docs/src/lib/components/OpenWithButton.svelte new file mode 100644 index 0000000..238ace2 --- /dev/null +++ b/packages/docs/src/lib/components/OpenWithButton.svelte @@ -0,0 +1,221 @@ + + + + + + + + + + (openSourceModal = false)} + class="max-h-[98dvh] md:max-h-[90dvh] max-w-[98vw] md:max-w-[90vw] grid grid-rows-[auto_1fr_auto]" +> +
+
+
Source
+
{sourceUrl}
+
+ + {#if sourceUrl} + + {/if} +
+ +
+ +
+ +
+ +
+
+ + (openMarkdownModal = false)} + class="max-h-[98dvh] md:max-h-[90dvh] max-w-[98vw] md:max-w-[90vw] grid grid-rows-[auto_1fr_auto]" +> +
+
+
Page Markdown
+
{pageUrl}/llms.txt
+
+ + +
+ +
+ +
+ +
+ +
+
diff --git a/packages/docs/src/lib/components/RelatedLink.svelte b/packages/docs/src/lib/components/RelatedLink.svelte new file mode 100644 index 0000000..4c8c85e --- /dev/null +++ b/packages/docs/src/lib/components/RelatedLink.svelte @@ -0,0 +1,64 @@ + + +{#if type === 'component'} + +{:else} + +{/if} diff --git a/packages/docs/src/lib/components/Search.svelte b/packages/docs/src/lib/components/Search.svelte new file mode 100644 index 0000000..83ebe47 --- /dev/null +++ b/packages/docs/src/lib/components/Search.svelte @@ -0,0 +1,328 @@ + + + + + + +{#if !hideInput} + +{/if} + + + options} + classes={{ + root: 'w-150 max-w-[95vw]', + field: { + container: 'border-none hover:shadow-none group-focus-within:shadow-none', + }, + options: 'overflow-auto max-h-[min(70dvh,400px)] [scrollbar-width:thin] p-2!', + }} + > + {#snippet prepend()} + + {/snippet} + + {#snippet option({ + option, + index, + highlightIndex, + }: { + option: SearchOption; + index: number; + highlightIndex: number; + })} + {@const result = option.result} + {@const isHighlighted = highlightIndex === index} + {@const isHeading = result.type === 'heading'} + +
+ {#if showExampleScreenshots && result.type === 'example' && result.component && result.example} + + {:else} + {@const Icon = typeIcons[result.type] ?? LucideHash} +
+ +
+ {/if} +
+

+ {#if isHeading && result.parent} + {result.parent} + + {/if} + {@html result.title} +

+

+ {@html result.content ?? ''} +

+
+
+
+ {/snippet} + + {#snippet empty()} + {#if searchQuery && !searchResults.length} +
+

No results found.

+
+ {/if} + {/snippet} +
+
diff --git a/packages/docs/src/lib/components/Step.svelte b/packages/docs/src/lib/components/Step.svelte new file mode 100644 index 0000000..e20d4d8 --- /dev/null +++ b/packages/docs/src/lib/components/Step.svelte @@ -0,0 +1,36 @@ + + +
+
+
+
+
+

+ {@html title} +

+ {@render children?.()} +
+ + diff --git a/packages/docs/src/lib/components/Steps.svelte b/packages/docs/src/lib/components/Steps.svelte new file mode 100644 index 0000000..2d0c2b0 --- /dev/null +++ b/packages/docs/src/lib/components/Steps.svelte @@ -0,0 +1,9 @@ + + +
+ {@render children?.()} +
diff --git a/packages/docs/src/lib/components/TableOfContents.svelte b/packages/docs/src/lib/components/TableOfContents.svelte new file mode 100644 index 0000000..e9af56e --- /dev/null +++ b/packages/docs/src/lib/components/TableOfContents.svelte @@ -0,0 +1,78 @@ + + +{#if items.length} + +{/if} diff --git a/packages/docs/src/lib/components/Tabs.svelte b/packages/docs/src/lib/components/Tabs.svelte new file mode 100644 index 0000000..0bd7ddc --- /dev/null +++ b/packages/docs/src/lib/components/Tabs.svelte @@ -0,0 +1,62 @@ + + + + {#each keys as key, v} + {@const isActive = value === v} + {@const Icon = icons?.[v] ?? null} + (value = v)} + selected={isActive} + >{#if Icon}{:else}{/if}{key} + {/each} + +
+ {@render content?.(value)} +
+
+
diff --git a/sites/docs/src/docs/ViewSourceButton.svelte b/packages/docs/src/lib/components/ViewSourceButton.svelte similarity index 78% rename from sites/docs/src/docs/ViewSourceButton.svelte rename to packages/docs/src/lib/components/ViewSourceButton.svelte index 559a3ab..4cc05e0 100644 --- a/sites/docs/src/docs/ViewSourceButton.svelte +++ b/packages/docs/src/lib/components/ViewSourceButton.svelte @@ -1,14 +1,17 @@ {#if source} @@ -26,13 +29,13 @@
{#if href} - {/if} -
+
diff --git a/packages/docs/src/lib/components/index.js b/packages/docs/src/lib/components/index.js new file mode 100644 index 0000000..7e33316 --- /dev/null +++ b/packages/docs/src/lib/components/index.js @@ -0,0 +1,17 @@ +export { default as Blockquote } from './Blockquote.svelte'; +export { default as Code } from './Code.svelte'; +export { default as ComponentLink } from './ComponentLink.svelte'; +export { default as ExampleLink } from './ExampleLink.svelte'; +export { default as ExampleListing } from './ExampleListing.svelte'; +export { default as ExampleScreenshot } from './ExampleScreenshot.svelte'; +export { default as ImageLink } from './ImageLink.svelte'; +export { default as Json } from './Json.svelte'; +export { default as LoadingPlaceholder } from './LoadingPlaceholder.svelte'; +export { default as OpenWithButton } from './OpenWithButton.svelte'; +export { default as RelatedLink } from './RelatedLink.svelte'; +export { default as Search } from './Search.svelte'; +export { default as Step } from './Step.svelte'; +export { default as Steps } from './Steps.svelte'; +export { default as TableOfContents } from './TableOfContents.svelte'; +export { default as Tabs } from './Tabs.svelte'; +export { default as ViewSourceButton } from './ViewSourceButton.svelte'; diff --git a/packages/docs/src/lib/content-collections/index.js b/packages/docs/src/lib/content-collections/index.js new file mode 100644 index 0000000..0997de8 --- /dev/null +++ b/packages/docs/src/lib/content-collections/index.js @@ -0,0 +1,323 @@ +import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; +import { join } from 'node:path'; +import { defineCollection, defineConfig } from '@content-collections/core'; +import { compileMarkdown } from '@content-collections/markdown'; +import { toPascalCase } from '@layerstack/utils'; +import { z } from 'zod'; +import rehypePrettyCode from 'rehype-pretty-code'; +import remarkGfm from 'remark-gfm'; +import { extractTocFromMarkdown } from '../markdown/index.js'; +import { prettyCodeOptions } from '../markdown/config/pretty-code.js'; +import { getFirstExampleName } from '../content.js'; +export const componentSchema = z.object({ + name: z.string().optional(), + description: z.string().optional(), + category: z.string().optional(), + layers: z.array(z.string()).default([]), + /** + * Whether the component renders inside an `` layer. + */ + withinLayer: z.boolean().default(true), + related: z.array(z.string()).default([]), + resize: z.boolean().optional(), + tableOfContents: z.boolean().default(true), + order: z.number().optional(), + content: z.string(), +}); +export const utilSchema = z.object({ + name: z.string().optional(), + description: z.string().optional(), + category: z.string().optional(), + layers: z.array(z.string()).default([]), + related: z.array(z.string()).default([]), + resize: z.boolean().optional(), + tableOfContents: z.boolean().default(true), + order: z.number().optional(), + content: z.string(), +}); +export const guideSchema = z.object({ + title: z.string(), + description: z.string().optional(), + category: z.string().optional(), + order: z.number().optional(), + draft: z.boolean().default(false), + content: z.string(), +}); +export const referenceSchema = z.object({ + title: z.string(), + description: z.string().optional(), + category: z.string().optional(), + packageName: z.string().optional(), + kind: z.string().optional(), + sourceFile: z.string().optional(), + related: z.array(z.string()).default([]), + features: z.array(z.string()).optional(), + hideUsage: z.boolean().optional(), + hideTableOfContents: z.boolean().optional(), + tableOfContents: z.boolean().default(true), + status: z.string().optional(), + order: z.number().optional(), + draft: z.boolean().default(false), + content: z.string(), +}); +export const releaseSchema = z.object({ + title: z.string(), + tag: z.string(), + date: z.coerce.date(), + url: z.string(), + draft: z.boolean().default(false), + prerelease: z.boolean().default(false), + author: z.string(), + content: z.string(), +}); +function sourceBase(options) { + return `https://github.com/${options.repo}/blob/${options.branch}/packages/${options.packageName}/src/lib`; +} +function readSource(root, sourceUrlBase, rel) { + const full = join(root, rel); + if (!existsSync(full)) return null; + try { + return { + source: readFileSync(full, 'utf-8'), + url: `${sourceUrlBase}/${rel}`, + }; + } catch { + return null; + } +} +function normalizeOptions(options) { + return { + packageName: options.packageName, + repo: options.repo ?? `techniq/${options.packageName}`, + branch: options.branch ?? 'main', + packagesRoot: options.packagesRoot ?? '../packages', + referenceDirectory: options.referenceDirectory ?? 'src/content/reference', + }; +} +export function createContentConfig(options) { + const normalized = normalizeOptions(options); + const packagesRoot = join(process.cwd(), normalized.packagesRoot); + const packageRoot = join(packagesRoot, `${normalized.packageName}/src/lib`); + const githubBase = sourceBase(normalized); + const components = defineCollection({ + name: 'components', + directory: 'src/content/components', + include: '**/*.md', + schema: componentSchema, + transform: async (doc, context) => { + const { fileName, path } = doc._meta; + const name = doc.name ?? toPascalCase(fileName.replace('.md', '')); + const componentsRoot = join(packageRoot, 'components'); + const componentsSourceBase = `${githubBase}/components`; + const subdirs = existsSync(componentsRoot) + ? readdirSync(componentsRoot).filter( + (entry) => !entry.startsWith('.') && statSync(join(componentsRoot, entry)).isDirectory() + ) + : []; + const searchDirs = ['', ...subdirs.map((d) => `${d}/`)]; + const sources = {}; + const sourceUrls = {}; + let primary = null; + let splitDir = ''; + for (const dir of searchDirs) { + const hit = + readSource(componentsRoot, componentsSourceBase, `${dir}${path}/${path}.base.svelte`) ?? + readSource(componentsRoot, componentsSourceBase, `${dir}${path}/${path}.svelte`) ?? + readSource(componentsRoot, componentsSourceBase, `${dir}${path}.svelte`); + if (hit) { + primary = hit; + splitDir = `${dir}${path}/`; + break; + } + } + if (primary && !primary.url.endsWith('.base.svelte')) { + for (const layer of ['svg', 'canvas', 'html']) { + const variant = readSource( + componentsRoot, + componentsSourceBase, + `${splitDir}${path}.${layer}.svelte` + ); + if (variant) { + sources[layer] = variant.source; + sourceUrls[layer] = variant.url; + } + } + } + const toc = extractTocFromMarkdown(doc.content); + const catalogPath = join(process.cwd(), `src/examples/catalog/${path}.json`); + let catalogFirstExample; + if (existsSync(catalogPath)) { + if (!toc.some((t) => t.id === 'examples')) { + toc.push({ id: 'examples', text: 'Examples', level: 2 }); + } + try { + const catalog = JSON.parse(readFileSync(catalogPath, 'utf-8')); + catalogFirstExample = catalog.examples?.[0]?.name; + } catch { + // ignore malformed generated catalog files + } + } + const apiPath = join(process.cwd(), `generated/api/${path}.json`); + let api = null; + if (existsSync(apiPath)) { + try { + api = JSON.parse(readFileSync(apiPath, 'utf-8')); + const renderInline = async (text) => { + const html = await compileMarkdown( + context, + { ...doc, content: text }, + { + remarkPlugins: [remarkGfm], + } + ); + return html + .replace(/^

/, '') + .replace(/<\/p>\s*$/, '') + .trim(); + }; + const walk = async (props = []) => { + for (const p of props) { + if (p.description) p.descriptionHtml = await renderInline(p.description); + if (p.properties) await walk(p.properties); + } + }; + await walk(api.properties); + if (api.properties?.length) { + toc.push({ id: 'api-reference', text: 'API Reference', level: 2 }); + } + } catch { + // ignore malformed generated API files + } + } + if (doc.related.length) { + toc.push({ id: 'related', text: 'Related', level: 2 }); + } + return { + ...doc, + name, + slug: path, + source: primary?.source ?? '', + sourceUrl: primary?.url ?? '', + sources, + sourceUrls, + defaultExample: getFirstExampleName(doc.content) ?? catalogFirstExample, + toc, + api, + }; + }, + }); + const utils = defineCollection({ + name: 'utils', + directory: 'src/content/utils', + include: '**/*.md', + schema: utilSchema, + transform: async (doc) => { + const { fileName, path } = doc._meta; + const source = readSource(join(packageRoot, 'utils'), `${githubBase}/utils`, `${path}.ts`); + return { + ...doc, + name: doc.name ?? fileName.replace('.md', ''), + slug: fileName.replace('.md', '').toLowerCase(), + source: source?.source ?? '', + sourceUrl: source?.url ?? '', + toc: extractTocFromMarkdown(doc.content), + }; + }, + }); + const guides = defineCollection({ + name: 'guides', + directory: 'src/content/guides', + include: '**/*.md', + schema: guideSchema, + transform: async (doc) => { + const { path } = doc._meta; + return { + ...doc, + name: doc.title, + slug: path, + toc: extractTocFromMarkdown(doc.content), + }; + }, + }); + const references = defineCollection({ + name: 'references', + directory: normalized.referenceDirectory, + include: '**/*.md', + schema: referenceSchema, + transform: async (doc) => { + const { path } = doc._meta; + const referenceSourceBase = `https://github.com/${normalized.repo}/blob/${normalized.branch}/packages`; + + // Explicit `sourceFile` (relative to `packages/`) always wins. Otherwise infer + // the source from the conventional `/src/lib/.{ts,svelte.ts}` location + // derived from the doc path (e.g. `svelte-stores/debounceStore`). A camelCase fallback + // covers PascalCase items (`utils/Duration` -> `duration.ts`, + // `svelte-state/SelectionState` -> `selectionState.svelte.ts`). + const explicit = doc.sourceFile?.replace(/^\/?packages\//, '').replace(/^\//, ''); + let source = null; + let sourceFile = explicit; + + if (explicit) { + source = readSource(packagesRoot, referenceSourceBase, explicit); + } else { + const segments = path.split('/'); + const pkg = segments[0]; + const rest = segments.slice(1); + if (pkg && rest.length) { + const dir = rest.slice(0, -1).join('/'); + const item = rest[rest.length - 1]; + const camelItem = item.charAt(0).toLowerCase() + item.slice(1); + const prefix = `${pkg}/src/lib/${dir ? `${dir}/` : ''}`; + const candidates = [ + `${prefix}${item}.ts`, + `${prefix}${item}.svelte.ts`, + `${prefix}${camelItem}.ts`, + `${prefix}${camelItem}.svelte.ts`, + ]; + for (const candidate of candidates) { + const hit = readSource(packagesRoot, referenceSourceBase, candidate); + if (hit) { + source = hit; + sourceFile = candidate; + break; + } + } + } + } + + const toc = extractTocFromMarkdown(doc.content); + if (doc.related.length) { + toc.push({ id: 'related', text: 'Related', level: 2 }); + } + return { + ...doc, + name: doc.title, + slug: path, + sourceFile, + source: source?.source ?? '', + sourceUrl: source?.url ?? '', + toc, + }; + }, + }); + const releases = defineCollection({ + name: 'releases', + directory: 'generated/releases', + include: '**/*.md', + schema: releaseSchema, + transform: async (doc, context) => { + const { fileName } = doc._meta; + return { + ...doc, + slug: fileName.replace('.md', ''), + html: await compileMarkdown(context, doc, { + remarkPlugins: [remarkGfm], + rehypePlugins: [[rehypePrettyCode, prettyCodeOptions]], + }), + }; + }, + }); + return defineConfig({ + content: [components, utils, guides, references, releases], + }); +} diff --git a/packages/docs/src/lib/content.ts b/packages/docs/src/lib/content.ts new file mode 100644 index 0000000..9adda2b --- /dev/null +++ b/packages/docs/src/lib/content.ts @@ -0,0 +1,159 @@ +import type { Component } from 'svelte'; +import type { ExampleType, LoadedExample } from './examples.js'; + +export type ContentType = 'components' | 'utils' | 'guides' | 'reference'; +export type ContentPaths = Partial>; +export type { Examples } from './examples.js'; + +export type ExampleReference = + | { kind: 'component'; component?: string; name: string } + | { kind: 'path'; path: string }; + +const defaultContentPaths: Record = { + components: '/src/content/components', + utils: '/src/content/utils', + guides: '/src/content/guides', + reference: '/src/content/reference', +}; + +function getContentPath(type: ContentType, contentPaths?: ContentPaths): string { + return contentPaths?.[type] ?? defaultContentPaths[type]; +} + +/** + * Resolve a relative or absolute example path to the conventional Vite `/src/...` key. + */ +export function resolveExamplePath( + path: string, + currentPath: string, + type: ContentType = 'components', + contentPaths?: ContentPaths +): string { + if ( + (type === 'guides' || type === 'reference') && + (path.startsWith('./') || !path.startsWith('/')) + ) { + const relativePath = path.startsWith('./') ? path.slice(2) : path; + return `${getContentPath(type, contentPaths)}/${relativePath}`; + } + if (path.startsWith('./')) { + return `/src/routes${currentPath}/${path.slice(2)}`; + } + if (path.startsWith('/')) { + return `/src${path}`; + } + return `/src/routes${currentPath}/${path}`; +} + +/** + * Extract examples referenced by `` or `:example{...}` markdown syntax. + */ +export function extractExampleReferences(markdownContent: string): ExampleReference[] { + const componentRegex = /]*?)\/>/g; + const mdcRegex = /:example\{([^}]*?)\}/g; + const matches = [ + ...markdownContent.matchAll(componentRegex), + ...markdownContent.matchAll(mdcRegex), + ]; + return matches.flatMap((match): ExampleReference[] => { + const attrs = match[1]; + const path = attrs.match(/path="([^"]*?)"/)?.[1]; + if (path) return [{ kind: 'path', path }]; + const component = attrs.match(/component="([^"]*?)"/)?.[1]; + const name = attrs.match(/name="([^"]*?)"/)?.[1]; + if (!name) return []; + return [{ kind: 'component', component, name }]; + }); +} + +export function getFirstExampleName(markdownContent: string): string | undefined { + return ( + markdownContent.match(/]*name=["']([^"']+)["'][^>]*>/)?.[1] || + markdownContent.match(/:example\{[^}]*name=["']([^"']+)["'][^}]*\}/)?.[1] + ); +} + +export type MarkdownModule = { + default: Component; + metadata: Metadata; +}; + +export function createContentLoaders(options: { + modules: Record Promise>>; + contentPaths?: ContentPaths; + getMetadata: (slug: string, type: ContentType) => Metadata | undefined; + loadExample: ( + component: string, + name: string, + type?: ExampleType + ) => Promise; + loadExampleByPath: (path: string) => Promise; + notFound: () => never; +}) { + async function getMarkdownComponent( + slug: string = 'index', + type: ContentType = 'components' + ): Promise<{ PageComponent: Component; metadata: Metadata }> { + const resolver = options.modules[`${getContentPath(type, options.contentPaths)}/${slug}.md`]; + const [doc, metadata] = await Promise.all([resolver?.(), options.getMetadata(slug, type)]); + if (!doc || !metadata) { + options.notFound(); + } + return { + PageComponent: doc.default, + metadata, + }; + } + + async function loadExamplesFromMarkdown( + markdownContent: string, + defaultComponent?: string, + type: ContentType = 'components', + currentPath?: string + ): Promise>> { + const refs = extractExampleReferences(markdownContent); + const componentExamples = refs.flatMap((ref) => { + if (ref.kind !== 'component') return []; + const component = ref.component ?? defaultComponent; + if (!component) return []; + return [{ component, name: ref.name }]; + }); + const pathExamples = refs.flatMap((ref) => { + if (ref.kind !== 'path' || !currentPath) return []; + return [ + { + path: ref.path, + resolvedPath: resolveExamplePath(ref.path, currentPath, type, options.contentPaths), + }, + ]; + }); + + const examples: Record> = {}; + await Promise.all( + componentExamples.map(async (ex) => { + const exampleType: ExampleType = type === 'utils' ? 'utils' : 'components'; + const loaded = await options.loadExample(ex.component, ex.name, exampleType); + if (loaded) { + if (!examples[ex.component]) { + examples[ex.component] = {}; + } + examples[ex.component][ex.name] = loaded; + } + }) + ); + if (pathExamples.length > 0) { + examples['__path__'] = {}; + await Promise.all( + pathExamples.map(async (ex) => { + const loaded = await options.loadExampleByPath(ex.resolvedPath); + if (loaded) { + examples['__path__'][ex.resolvedPath] = loaded; + } + }) + ); + } + return examples; + } + + return { getMarkdownComponent, loadExamplesFromMarkdown }; +} diff --git a/packages/docs/src/lib/context.ts b/packages/docs/src/lib/context.ts new file mode 100644 index 0000000..607f463 --- /dev/null +++ b/packages/docs/src/lib/context.ts @@ -0,0 +1,4 @@ +import { Context } from 'runed'; +import type { Examples } from './examples.js'; + +export const examples = new Context<{ readonly current: Examples }>('examples'); diff --git a/packages/docs/src/lib/examples-glob.ts b/packages/docs/src/lib/examples-glob.ts new file mode 100644 index 0000000..c139e64 --- /dev/null +++ b/packages/docs/src/lib/examples-glob.ts @@ -0,0 +1,35 @@ +/** + * Glob-based example loaders. + * + * ONLY import this module when you need to iterate over ALL examples + * (for example, screenshot generation). For normal page loading, keep a + * docs-local lazy dynamic import adapter. + * + * Using import.meta.glob causes Vite to pre-transform all matched files during development. + */ +export const componentExamples: Record Promise> = import.meta.glob( + '/src/examples/components/**/*.svelte', + { + import: 'default', + } +); +export const componentSources: Record Promise> = import.meta.glob( + '/src/examples/components/**/*.svelte', + { + import: 'default', + query: '?raw', + } +); +export const utilExamples: Record Promise> = import.meta.glob( + '/src/examples/utils/**/*.svelte', + { + import: 'default', + } +); +export const utilSources: Record Promise> = import.meta.glob( + '/src/examples/utils/**/*.svelte', + { + import: 'default', + query: '?raw', + } +); diff --git a/packages/docs/src/lib/examples.ts b/packages/docs/src/lib/examples.ts new file mode 100644 index 0000000..d8e8fc0 --- /dev/null +++ b/packages/docs/src/lib/examples.ts @@ -0,0 +1,149 @@ +import type { Component } from 'svelte'; + +export type LoadedExample = { + component: Component; + source: string; + module?: { + title?: string; + description?: string; + layers?: string[]; + }; +}; +export type Examples = Record>; +export type ExampleType = 'components' | 'utils'; + +export type ComponentExampleImporter = ( + type: ExampleType, + component: string, + name: string +) => Promise<{ default: Component; title?: string; description?: string; layers?: string[] }>; +export type RawExampleImporter = ( + type: ExampleType, + component: string, + name: string +) => Promise; +export type PathExampleImporter = (path: string) => Promise<{ default: Component } | undefined>; +export type RawPathExampleImporter = (path: string) => Promise; + +export function cleanExampleSource(source: string): string { + return source + .replace(/[\s\S]*?<\/script>\n*/g, '') + .replace(/(\n\s*)*^.*export .*;.*$(\n\s*)*/gm, '\n'); +} + +export function cleanPathExampleSource(source: string): string { + return source.replace(/(\n\s*)*^.*export .*;.*$(\n\s*)*/gm, '\n'); +} + +export function createExampleLoaders(options: { + loadComponentExample: ComponentExampleImporter; + loadRawExample: RawExampleImporter; + loadPathExample: PathExampleImporter; + loadRawPathExample: RawPathExampleImporter; + warn?: typeof console.warn; +}) { + const warn = options.warn ?? console.warn; + + async function loadExample( + component: string, + name: string, + type: ExampleType = 'components' + ): Promise { + try { + const [componentModule, rawSource] = await Promise.all([ + options.loadComponentExample(type, component, name), + options.loadRawExample(type, component, name), + ]); + const { default: comp, ...module } = componentModule; + return { + component: comp, + source: cleanExampleSource(rawSource), + module, + }; + } catch (e) { + warn(`Failed to load example: ${type}/${component}/${name}`, e); + return null; + } + } + + async function loadExamples( + items: Array<{ component: string; name: string }>, + type: ExampleType = 'components' + ): Promise { + const results: Examples = {}; + await Promise.all( + items.map(async ({ component, name }) => { + const example = await loadExample(component, name, type); + if (example) { + if (!results[component]) { + results[component] = {}; + } + results[component][name] = example; + } + }) + ); + return results; + } + + async function loadExampleByPath(resolvedPath: string): Promise { + try { + const [componentModule, rawSource] = await Promise.all([ + options.loadPathExample(resolvedPath), + options.loadRawPathExample(resolvedPath), + ]); + if (!componentModule || rawSource === undefined) { + warn(`Failed to load example by path: ${resolvedPath}`); + return null; + } + return { + component: componentModule.default, + source: cleanPathExampleSource(rawSource), + }; + } catch (e) { + warn(`Failed to load example by path: ${resolvedPath}`, e); + return null; + } + } + + return { loadExample, loadExamples, loadExampleByPath }; +} + +/** + * Convenience wrapper around {@link createExampleLoaders} for the conventional + * `import.meta.glob`-backed setup. Pass the (literal) dynamic `import()` calls and glob + * maps — this derives the path lookups and unwraps `?raw` modules for you. + * + * ```ts + * export const { loadExample, loadExamples, loadExampleByPath } = createGlobExampleLoaders({ + * loadComponentExample: (type, component, name) => + * import(`../examples/${type}/${component}/${name}.svelte`), + * loadRawExampleModule: (type, component, name) => + * import(`../examples/${type}/${component}/${name}.svelte?raw`), + * pathExamples: import.meta.glob<{ default: Component }>(['/src/routes/**\/*.svelte']), + * rawPathExamples: import.meta.glob(['/src/routes/**\/*.svelte'], { + * query: '?raw', + * import: 'default', + * }), + * }); + * ``` + */ +export function createGlobExampleLoaders(options: { + loadComponentExample: ComponentExampleImporter; + loadRawExampleModule: ( + type: ExampleType, + component: string, + name: string + ) => Promise<{ default: string }>; + pathExamples: Record Promise<{ default: Component }>>; + rawPathExamples: Record Promise>; + warn?: typeof console.warn; +}) { + return createExampleLoaders({ + loadComponentExample: options.loadComponentExample, + loadRawExample: async (type, component, name) => + (await options.loadRawExampleModule(type, component, name)).default, + loadPathExample: (path) => options.pathExamples[path]?.(), + loadRawPathExample: (path) => options.rawPathExamples[path]?.(), + warn: options.warn, + }); +} diff --git a/packages/docs/src/lib/index.js b/packages/docs/src/lib/index.js new file mode 100644 index 0000000..7a78d58 --- /dev/null +++ b/packages/docs/src/lib/index.js @@ -0,0 +1,10 @@ +export * from './api-types.js'; +export * from './catalog.js'; +export * from './collections.js'; +export * from './components/index.js'; +export * from './content.js'; +export * from './context.js'; +export * from './examples.js'; +export * from './markdown/index.js'; +export * from './page-transitions.js'; +export * from './project-stats.js'; diff --git a/packages/docs/src/lib/llms.ts b/packages/docs/src/lib/llms.ts new file mode 100644 index 0000000..c1d9519 --- /dev/null +++ b/packages/docs/src/lib/llms.ts @@ -0,0 +1,339 @@ +/** + * Helpers for generating LLM-optimized (`llms.txt`) markdown from docs content. + * + * These are pure/string utilities — the consuming docs app supplies the data + * (via `content-collections` + `import.meta.glob`) and assembles the endpoints. + */ +import type { ComponentAPI } from './api-types.js'; + +/** Create a `text/markdown` response for an llms.txt endpoint. */ +export function markdownResponse(content: string, filename: string): Response { + return new Response(content, { + headers: { + 'Content-Type': 'text/markdown; charset=utf-8', + 'Content-Disposition': `inline; filename="${filename}"`, + }, + }); +} + +/** Strip `') + .trim(); +} + +function escapeMarkdown(text: string): string { + return text.replace(/\|/g, '\\|').replace(/\n/g, ' ').replace(//g, '>'); +} + +/** Generate a markdown API table from a component's `ComponentAPI` properties. */ +export function generateApiTable(api: ComponentAPI): string { + if (!api.properties || api.properties.length === 0) return ''; + + const rows = api.properties.map((prop) => { + const name = prop.required ? `**${prop.name}** (required)` : prop.name; + const type = `\`${escapeMarkdown(prop.type)}\``; + const defaultVal = prop.default ? `\`${escapeMarkdown(prop.default)}\`` : '-'; + const description = prop.description ? escapeMarkdown(prop.description) : '-'; + return `| ${name} | ${type} | ${defaultVal} | ${description} |`; + }); + + return `| Property | Type | Default | Description | +|----------|------|---------|-------------| +${rows.join('\n')}`; +} + +/** Resolve the raw source for an example, by component (optional) + name. */ +export type ExampleSourceResolver = ( + component: string | undefined, + name: string +) => string | undefined; + +/** Build a docs URL for a (cross-component) example reference. */ +export type ExampleUrlResolver = (component: string, name: string) => string; + +/** + * Replace `:example{...}` directives with inlined fenced code blocks, using a + * caller-provided source resolver. Run this BEFORE `processMarkdownContent`. + * + * When an example's source can't be resolved, the directive becomes a "See example" + * reference — a markdown link if `exampleUrl` is provided, otherwise plain text. + */ +export function inlineExampleDirectives( + content: string, + resolveSource: ExampleSourceResolver, + defaultComponent?: string, + exampleUrl?: ExampleUrlResolver +): string { + // Strip HTML comments first so commented-out examples aren't inlined + content = content.replace(//g, ''); + + // Cross-component examples: :example{ component="X" name="Y" ... } (run first) + content = content.replace( + /:example\{\s*component="([^"]+)"\s+name="([^"]+)"[^}]*\}/g, + (_match, component: string, name: string) => { + const raw = resolveSource(component, name); + if (raw) return '```svelte\n' + trimCode(raw) + '\n```'; + return exampleUrl + ? `See example: [${component}/${name}](${exampleUrl(component, name)})` + : `See example: ${component}/${name}`; + } + ); + + // Same-component examples: :example{ name="Y" ... } + content = content.replace(/:example\{\s*name="([^"]+)"[^}]*\}/g, (_match, name: string) => { + const raw = resolveSource(defaultComponent, name); + return raw ? '```svelte\n' + trimCode(raw) + '\n```' : `See example: ${name}`; + }); + + return content; +} + +/** + * Convert docs markdown (with Svelte + MDC directive syntax) to vanilla markdown + * suitable for LLM consumption. + */ +export function processMarkdownContent( + content: string, + options?: { exampleUrl?: ExampleUrlResolver } +): string { + // Remove frontmatter + content = content.replace(/^---\n[\s\S]*?\n---\n*/, ''); + + // Remove HTML comments + content = content.replace(//g, ''); + + // Remove Svelte script blocks and components ONLY outside of code blocks + content = content + .split(/(```[\s\S]*?```)/g) + .map((part, index) => { + if (index % 2 === 1) return part; // code block — leave as-is + part = part.replace(/]*>[\s\S]*?<\/script>\n*/g, ''); + part = part.replace(/<[A-Z][a-zA-Z]*[^>]*\/>\n*/g, ''); + part = part.replace(/<[A-Z][a-zA-Z]*[^>]*>[\s\S]*?<\/[A-Z][a-zA-Z]*>\n*/g, ''); + return part; + }) + .join(''); + + // Surface code-block `title="..."` meta as a "File:" line + content = content.replace(/(```\w*)\s+([^\n]*title="[^"]+")[^\n]*$/gm, (_, lang, meta) => { + const titleMatch = meta.match(/title="([^"]+)"/); + return titleMatch ? `File: ${titleMatch[1]} ${lang}` : lang; + }); + + // :::tabs → markdown table + content = content.replace( + /:::tabs\{key="([^"]+)"\}\s*([\s\S]*?)(?=\n:::(?:\s*$|\s*\n))\n:::/gm, + (_, key, tabsContent) => { + const tabs: { label: string; content: string }[] = []; + const tabRegex = + /::tab\{label="([^"]+)"[^}]*\}\s*([\s\S]*?)\s*(?=\n\s*::(?:\s*$|\s+))\n\s*::/gm; + let match; + while ((match = tabRegex.exec(tabsContent)) !== null) { + tabs.push({ label: match[1], content: match[2].trim() }); + } + if (tabs.length === 0) return ''; + + const header = key.charAt(0).toUpperCase() + key.slice(1); + let table = `| ${header} | Details |\n|-----------|---------|`; + for (const tab of tabs) { + const cleanContent = tab.content + .replace(/:button\{label="([^"]+)"\s+href="([^"]+)"[^}]*\}/g, '[$1]($2)') + .replace(/```\w*\n([\s\S]*?)```/g, '$1') + .replace(/\n/g, ' ') + .trim(); + table += `\n| ${tab.label} | ${cleanContent} |`; + } + return table; + } + ); + + // ::note / ::tip / ::warning / ::caution → blockquote + content = content.replace( + /:{2,3}(note|tip|warning|caution)\s*([\s\S]*?)(?=\n:{2,3}(?:\s*$|\s*\n))\n:{2,3}/gm, + (_, variant, noteContent) => `> ${variant}: ${noteContent.trim()}\n` + ); + + // ::steps → numbered list (## headings become numbered items) + content = content.replace( + /::steps\s*([\s\S]*?)(?=\n::(?:\s*$|\s*\n))\n::/gm, + (_, stepsContent: string) => { + let stepNum = 0; + return stepsContent.replace(/^## (.+)$/gm, (_match: string, heading: string) => { + stepNum++; + return `**${stepNum}. ${heading}**`; + }); + } + ); + + // Remove any remaining standalone :: + content = content.replace(/^::\s*$/gm, ''); + + // :icon syntax — keep bracketed label text, otherwise drop + content = content.replace(/\[:icon\{[^}]+\}\s*([^\]]+)\]/g, '$1'); + content = content.replace(/:icon\{[^}]+\}\s*/g, ''); + + // Any remaining :example directives → "See example" reference (link if a URL resolver is provided) + content = content.replace( + /:example\{\s*component="([^"]+)"\s+name="([^"]+)"[^}]*\}/g, + (_match, component: string, name: string) => + options?.exampleUrl + ? `See example: [${component}/${name}](${options.exampleUrl(component, name)})` + : `See example: ${component}/${name}` + ); + content = content.replace(/:example\{\s*name="([^"]+)"[^}]*\}/g, 'See example: $1'); + + // Collapse blank lines + content = content.replace(/\n{3,}/g, '\n\n'); + + return content.trim(); +} + +/** + * Extract a `title` from a markdown file's frontmatter, falling back to `fallback` + * (e.g. a title-cased filename) when absent. + */ +export function extractFrontmatterTitle(raw: string, fallback = ''): string { + const frontmatter = raw.match(/^---\n([\s\S]*?)\n---/); + const titleMatch = frontmatter?.[1].match(/^title:\s*(.+)$/m); + if (titleMatch) return titleMatch[1].trim().replace(/^["']|["']$/g, ''); + return fallback; +} + +/** + * Generate LLM-optimized markdown for a guide from its raw source. + * + * The consuming app resolves the raw markdown (via `import.meta.glob`); this handles + * the title (explicit → frontmatter → `fallbackTitle`) and content processing. + */ +export function generateGuideMarkdown( + raw: string, + options: { title?: string; fallbackTitle?: string } = {} +): string { + const title = options.title ?? extractFrontmatterTitle(raw, options.fallbackTitle ?? ''); + const body = processMarkdownContent(raw); + return title ? `# ${title}\n\n${body}` : body; +} + +/** Minimal shape a doc needs to render reference markdown. */ +export interface ReferenceDoc { + name: string; + slug: string; + description?: string | null; + content?: string | null; + related?: string[] | null; +} + +export interface ReferenceMarkdownOptions { + /** Heading level for the title (1 = `#`). Related/extra sections use `headingLevel + 1`. Default: 1 */ + headingLevel?: number; + /** Inline `:example` directives as fenced code blocks (requires `resolveSource`). Default: false */ + inlineExamples?: boolean; + /** Resolver for example source (used when `inlineExamples`). */ + resolveSource?: ExampleSourceResolver; + /** URL resolver for non-inlined cross-component `:example` references. */ + exampleUrl?: ExampleUrlResolver; + /** Default component for same-component `:example{name}` directives (e.g. the doc's slug). */ + defaultComponent?: string; + /** Sections inserted after the description, before the processed content (e.g. metadata). */ + leadingSections?: (string | null | undefined)[]; + /** Sections inserted after the processed content, before Related (e.g. API, Examples). */ + extraSections?: (string | null | undefined)[]; + /** Render Related items as links via this URL builder; omit for a plain `- name` list. */ + relatedUrl?: (name: string) => string; +} + +/** + * Generate LLM-optimized markdown for a reference doc (component/util/etc.): + * `title → description → [leading] → content → [extra] → Related`. + * + * App-specific sections (metadata, API tables, example listings) are passed via + * `leadingSections` / `extraSections` so the orchestration stays shared. + */ +export function generateReferenceMarkdown( + doc: ReferenceDoc, + options: ReferenceMarkdownOptions = {} +): string { + const { + headingLevel = 1, + inlineExamples = false, + resolveSource, + exampleUrl, + defaultComponent, + leadingSections = [], + extraSections = [], + relatedUrl, + } = options; + const h = (level: number) => '#'.repeat(level); + + const sections: string[] = [`${h(headingLevel)} ${doc.name}`]; + if (doc.description) sections.push(doc.description); + + for (const section of leadingSections) { + if (section) sections.push(section); + } + + if (doc.content) { + let content = doc.content; + if (inlineExamples && resolveSource) { + content = inlineExampleDirectives(content, resolveSource, defaultComponent, exampleUrl); + } + const processed = processMarkdownContent(content, { exampleUrl }); + if (processed) sections.push(processed); + } + + for (const section of extraSections) { + if (section) sections.push(section); + } + + if (doc.related?.length) { + sections.push(`${h(headingLevel + 1)} Related`); + sections.push( + doc.related.map((r) => (relatedUrl ? `- [${r}](${relatedUrl(r)})` : `- ${r}`)).join('\n') + ); + } + + return sections.join('\n\n'); +} + +/** An item in a markdown link list. */ +export interface LinkListItem { + name: string; + url: string; + description?: string | null; +} + +/** Render a `## Title` section with a bulleted list of links: `- [name](url): description`. */ +export function linkListSection( + title: string, + items: LinkListItem[], + options: { headingLevel?: number } = {} +): string { + const h = '#'.repeat(options.headingLevel ?? 2); + const lines = items.map( + (item) => `- [${item.name}](${item.url})${item.description ? `: ${item.description}` : ''}` + ); + return `${h} ${title}\n\n${lines.join('\n')}`; +} + +/** + * Group docs by a segment of their slug (default: the first, i.e. the package), + * sorted by key. Pass `sort` (e.g. `sortCollection`) to order within each group. + */ +export function groupBySlugSegment( + docs: T[], + options: { segment?: number; sort?: (group: T[]) => T[] } = {} +): [string, T[]][] { + const segment = options.segment ?? 0; + const byKey = new Map(); + for (const doc of docs) { + const key = doc.slug.split('/')[segment]; + if (!byKey.has(key)) byKey.set(key, []); + byKey.get(key)!.push(doc); + } + return [...byKey.entries()] + .sort(([a], [b]) => a.localeCompare(b)) + .map(([key, group]) => [key, options.sort ? options.sort(group) : group]); +} diff --git a/packages/docs/src/lib/markdown/blueprints/default/blueprint.svelte b/packages/docs/src/lib/markdown/blueprints/default/blueprint.svelte new file mode 100644 index 0000000..0849c24 --- /dev/null +++ b/packages/docs/src/lib/markdown/blueprints/default/blueprint.svelte @@ -0,0 +1,30 @@ + + + + +{@render children?.()} diff --git a/packages/docs/src/lib/markdown/components/Button.svelte b/packages/docs/src/lib/markdown/components/Button.svelte new file mode 100644 index 0000000..94eca2c --- /dev/null +++ b/packages/docs/src/lib/markdown/components/Button.svelte @@ -0,0 +1,38 @@ + + + diff --git a/packages/docs/src/lib/markdown/components/LiveCode.svelte b/packages/docs/src/lib/markdown/components/LiveCode.svelte new file mode 100644 index 0000000..3fd7943 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/LiveCode.svelte @@ -0,0 +1,20 @@ + + +

+
+ {@render preview()} +
+ {#if showCode} + {@render children()} + {/if} +
diff --git a/packages/docs/src/lib/markdown/components/Note.svelte b/packages/docs/src/lib/markdown/components/Note.svelte new file mode 100644 index 0000000..4db5e41 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/Note.svelte @@ -0,0 +1,39 @@ + + +
+ +
+ {@render children?.()} +
+
diff --git a/packages/docs/src/lib/markdown/components/Steps.svelte b/packages/docs/src/lib/markdown/components/Steps.svelte new file mode 100644 index 0000000..e31ffa8 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/Steps.svelte @@ -0,0 +1,9 @@ + + +
+ {@render children?.()} +
diff --git a/packages/docs/src/lib/markdown/components/Tab.svelte b/packages/docs/src/lib/markdown/components/Tab.svelte new file mode 100644 index 0000000..2e6d2ab --- /dev/null +++ b/packages/docs/src/lib/markdown/components/Tab.svelte @@ -0,0 +1,34 @@ + + +
+ {@render children?.()} +
diff --git a/packages/docs/src/lib/markdown/components/Tabs.svelte b/packages/docs/src/lib/markdown/components/Tabs.svelte new file mode 100644 index 0000000..b7f8cdd --- /dev/null +++ b/packages/docs/src/lib/markdown/components/Tabs.svelte @@ -0,0 +1,109 @@ + + + + +
+ +
+ {#each tabs as tab, index} + {@const isActive = activeTab === index} + + {/each} +
+ + +
+ {@render children?.()} +
+
diff --git a/packages/docs/src/lib/markdown/components/a.svelte b/packages/docs/src/lib/markdown/components/a.svelte new file mode 100644 index 0000000..c1230ec --- /dev/null +++ b/packages/docs/src/lib/markdown/components/a.svelte @@ -0,0 +1,26 @@ + + + + {@render children?.()}{#if !internal} + + {/if} + diff --git a/packages/docs/src/lib/markdown/components/blockquote.svelte b/packages/docs/src/lib/markdown/components/blockquote.svelte new file mode 100644 index 0000000..9404246 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/blockquote.svelte @@ -0,0 +1,17 @@ + + +
a]:font-medium [&>a]:underline [&>a]:decoration-dashed [&>a]:decoration-primary/50 [&>a]:underline-offset-2', + className + )} + {...restProps} +> + {@render children?.()} +
diff --git a/packages/docs/src/lib/markdown/components/code.svelte b/packages/docs/src/lib/markdown/components/code.svelte new file mode 100644 index 0000000..8f218a1 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/code.svelte @@ -0,0 +1,10 @@ + + + + {@render children?.()} + diff --git a/packages/docs/src/lib/markdown/components/h-base.svelte b/packages/docs/src/lib/markdown/components/h-base.svelte new file mode 100644 index 0000000..315a220 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/h-base.svelte @@ -0,0 +1,23 @@ + + + + + + {@render children?.()} + + diff --git a/packages/docs/src/lib/markdown/components/h1.svelte b/packages/docs/src/lib/markdown/components/h1.svelte new file mode 100644 index 0000000..19564c5 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/h1.svelte @@ -0,0 +1,9 @@ + + + diff --git a/packages/docs/src/lib/markdown/components/h2.svelte b/packages/docs/src/lib/markdown/components/h2.svelte new file mode 100644 index 0000000..4d3c0b6 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/h2.svelte @@ -0,0 +1,13 @@ + + + diff --git a/packages/docs/src/lib/markdown/components/h3.svelte b/packages/docs/src/lib/markdown/components/h3.svelte new file mode 100644 index 0000000..b420911 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/h3.svelte @@ -0,0 +1,13 @@ + + + diff --git a/packages/docs/src/lib/markdown/components/h4.svelte b/packages/docs/src/lib/markdown/components/h4.svelte new file mode 100644 index 0000000..9f37186 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/h4.svelte @@ -0,0 +1,13 @@ + + + diff --git a/packages/docs/src/lib/markdown/components/img.svelte b/packages/docs/src/lib/markdown/components/img.svelte new file mode 100644 index 0000000..a28c61a --- /dev/null +++ b/packages/docs/src/lib/markdown/components/img.svelte @@ -0,0 +1,8 @@ + + + diff --git a/packages/docs/src/lib/markdown/components/index.js b/packages/docs/src/lib/markdown/components/index.js new file mode 100644 index 0000000..73cbdcc --- /dev/null +++ b/packages/docs/src/lib/markdown/components/index.js @@ -0,0 +1,25 @@ +export { default as a, default as A } from './a.svelte'; +export { default as blockquote, default as Blockquote } from './blockquote.svelte'; +export { default as code, default as Code } from './code.svelte'; +export { default as h1, default as H1 } from './h1.svelte'; +export { default as h2, default as H2 } from './h2.svelte'; +export { default as h3, default as H3 } from './h3.svelte'; +export { default as h4, default as H4 } from './h4.svelte'; +export { default as img, default as Img } from './img.svelte'; +export { default as li, default as Li } from './li.svelte'; +export { default as ol, default as Ol } from './ol.svelte'; +export { default as p, default as P } from './p.svelte'; +export { default as pre, default as Pre } from './pre.svelte'; +export { default as strong, default as Strong } from './strong.svelte'; +export { default as table, default as Table } from './table.svelte'; +export { default as td, default as Td } from './td.svelte'; +export { default as th, default as Th } from './th.svelte'; +export { default as tr, default as Tr } from './tr.svelte'; +export { default as ul, default as Ul } from './ul.svelte'; +// Directive components +export { default as Button } from './Button.svelte'; +export { default as LiveCode } from './LiveCode.svelte'; +export { default as Note } from './Note.svelte'; +export { default as Tab } from './Tab.svelte'; +export { default as Tabs } from './Tabs.svelte'; +export { default as Steps } from './Steps.svelte'; diff --git a/packages/docs/src/lib/markdown/components/li.svelte b/packages/docs/src/lib/markdown/components/li.svelte new file mode 100644 index 0000000..db23246 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/li.svelte @@ -0,0 +1,10 @@ + + +
  • + {@render children?.()} +
  • diff --git a/packages/docs/src/lib/markdown/components/ol.svelte b/packages/docs/src/lib/markdown/components/ol.svelte new file mode 100644 index 0000000..19264ba --- /dev/null +++ b/packages/docs/src/lib/markdown/components/ol.svelte @@ -0,0 +1,10 @@ + + +
      + {@render children?.()} +
    diff --git a/packages/docs/src/lib/markdown/components/p.svelte b/packages/docs/src/lib/markdown/components/p.svelte new file mode 100644 index 0000000..badd61b --- /dev/null +++ b/packages/docs/src/lib/markdown/components/p.svelte @@ -0,0 +1,10 @@ + + +

    &]:my-5 leading-relaxed', className)} {...restProps}> + {@render children?.()} +

    diff --git a/packages/docs/src/lib/markdown/components/pre.svelte b/packages/docs/src/lib/markdown/components/pre.svelte new file mode 100644 index 0000000..6dcd07d --- /dev/null +++ b/packages/docs/src/lib/markdown/components/pre.svelte @@ -0,0 +1,84 @@ + + +
    + {#if dataTitle} +
    + + {dataTitle} +
    + {/if} + +
    {@render children?.()}
    + +
    + +
    +
    diff --git a/packages/docs/src/lib/markdown/components/strong.svelte b/packages/docs/src/lib/markdown/components/strong.svelte new file mode 100644 index 0000000..ba540c7 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/strong.svelte @@ -0,0 +1,5 @@ + + +{@render children?.()} diff --git a/packages/docs/src/lib/markdown/components/table.svelte b/packages/docs/src/lib/markdown/components/table.svelte new file mode 100644 index 0000000..212481f --- /dev/null +++ b/packages/docs/src/lib/markdown/components/table.svelte @@ -0,0 +1,12 @@ + + +
    + + {@render children?.()} +
    +
    diff --git a/packages/docs/src/lib/markdown/components/td.svelte b/packages/docs/src/lib/markdown/components/td.svelte new file mode 100644 index 0000000..b60f62b --- /dev/null +++ b/packages/docs/src/lib/markdown/components/td.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/packages/docs/src/lib/markdown/components/th.svelte b/packages/docs/src/lib/markdown/components/th.svelte new file mode 100644 index 0000000..f8c6842 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/th.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/packages/docs/src/lib/markdown/components/tr.svelte b/packages/docs/src/lib/markdown/components/tr.svelte new file mode 100644 index 0000000..f18f769 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/tr.svelte @@ -0,0 +1,10 @@ + + + + {@render children?.()} + diff --git a/packages/docs/src/lib/markdown/components/ul.svelte b/packages/docs/src/lib/markdown/components/ul.svelte new file mode 100644 index 0000000..ea86d22 --- /dev/null +++ b/packages/docs/src/lib/markdown/components/ul.svelte @@ -0,0 +1,10 @@ + + +
      + {@render children?.()} +
    diff --git a/packages/docs/src/lib/markdown/config/index.js b/packages/docs/src/lib/markdown/config/index.js new file mode 100644 index 0000000..f61c036 --- /dev/null +++ b/packages/docs/src/lib/markdown/config/index.js @@ -0,0 +1,94 @@ +// @ts-nocheck +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; +import { defineConfig } from 'mdsx'; +import rehypeSlug from 'rehype-slug'; +import remarkGfm from 'remark-gfm'; +import remarkMDC from 'remark-mdc'; +import rehypePrettyCode from 'rehype-pretty-code'; +import { visit } from 'unist-util-visit'; + +// Remark plugins +export { remarkLiveCode } from '../rehype/live-code.js'; +export { remarkComponents } from '../remark/components.js'; + +// Rehype plugins +export { rehypeCodeBlocks } from '../rehype/handle-code-blocks.js'; + +// Transformers +export { shikiDiffTransformer } from '../transformers/shiki-diff.js'; + +// Configuration +export { prettyCodeOptions } from './pretty-code.js'; + +import { prettyCodeOptions } from './pretty-code.js'; +import { rehypeCodeBlocks } from '../rehype/handle-code-blocks.js'; +import { remarkLiveCode } from '../rehype/live-code.js'; +import { remarkComponents } from '../remark/components.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +/** Strip leading/trailing dashes from heading IDs produced by rehype-slug. */ +export function rehypeCleanSlugIds() { + return (tree) => { + visit(tree, 'element', (node) => { + if (/^h[1-6]$/.test(node.tagName) && node.properties?.id) { + node.properties.id = node.properties.id.replace(/^-+|-+$/g, ''); + } + }); + }; +} + +export function getDefaultBlueprintPath() { + return join(__dirname, '../blueprints/default/blueprint.svelte'); +} + +/** + * Create the shared MDSX config used by LayerStack docs apps. + * + * @param {{ + * markdownComponentsPath?: string; + * exampleComponentPath?: string; + * liveCodeComponent?: string; + * liveCodeOutputDir?: string; + * liveCodeImportPrefix?: string; + * blueprintPath?: string; + * }} [options] + */ +export function createMdsxConfig(options = {}) { + return defineConfig({ + extensions: ['.md'], + remarkPlugins: [ + remarkGfm, + remarkMDC, + [ + remarkComponents, + { + markdownComponentsPath: + options.markdownComponentsPath ?? '@layerstack/docs/markdown/components', + exampleComponentPath: options.exampleComponentPath ?? '$lib/components', + }, + ], + [ + remarkLiveCode, + { + outputDir: options.liveCodeOutputDir, + importPrefix: options.liveCodeImportPrefix, + liveCodeComponent: + options.liveCodeComponent ?? '@layerstack/docs/markdown/components/LiveCode.svelte', + }, + ], + ], + rehypePlugins: [ + rehypeSlug, + rehypeCleanSlugIds, + [rehypePrettyCode, prettyCodeOptions], + rehypeCodeBlocks, + ], + blueprints: { + default: { + path: options.blueprintPath ?? getDefaultBlueprintPath(), + }, + }, + }); +} diff --git a/packages/docs/src/lib/markdown/config/pretty-code.js b/packages/docs/src/lib/markdown/config/pretty-code.js new file mode 100644 index 0000000..fbd41aa --- /dev/null +++ b/packages/docs/src/lib/markdown/config/pretty-code.js @@ -0,0 +1,18 @@ +import { transformerMetaHighlight } from '@shikijs/transformers'; +import { shikiDiffTransformer } from '../transformers/shiki-diff.js'; + +/** + * @type {import('rehype-pretty-code').Options} + */ +export const prettyCodeOptions = { + theme: { + light: 'github-light-default', + dark: 'github-dark-default', + }, + keepBackground: false, + defaultLang: { + block: 'plaintext', + // inline: "plaintext", + }, + transformers: [shikiDiffTransformer(), transformerMetaHighlight()], +}; diff --git a/packages/docs/src/lib/markdown/index.js b/packages/docs/src/lib/markdown/index.js new file mode 100644 index 0000000..4b22e4f --- /dev/null +++ b/packages/docs/src/lib/markdown/index.js @@ -0,0 +1,2 @@ +export * from './toc.js'; +export * from './utils.js'; diff --git a/packages/docs/src/lib/markdown/rehype/component-example.js b/packages/docs/src/lib/markdown/rehype/component-example.js new file mode 100644 index 0000000..fbfd74a --- /dev/null +++ b/packages/docs/src/lib/markdown/rehype/component-example.js @@ -0,0 +1,98 @@ +import { readFileSync } from 'node:fs'; +import path from 'node:path'; +import process from 'node:process'; +import { u } from 'unist-builder'; +import { visit } from 'unist-util-visit'; + +/** + * Adds the source code to component examples. + * @returns {(tree: import('unist').Node) => Promise} + */ +export function rehypeComponentExample() { + return async (tree) => { + const componentRegex = /component="([^"]+)"/; + const nameRegex = /name="([^"]+)"/; + + visit(tree, (node, index, parent) => { + // Use type narrowing - node can have custom properties + if ( + !node || + typeof node !== 'object' || + !('type' in node) || + !('value' in node) || + node.type !== 'raw' || + typeof node.value !== 'string' || + !node.value.startsWith(' void} + */ +export function rehypeCodeBlocks() { + return (tree) => { + visit(tree, 'element', (node) => { + if (node.tagName === 'pre') { + node.properties.className = node.properties.className || []; + + // Check if the code element has a data-meta attribute from rehype-pretty-code + const codeNode = node.children?.find( + (child) => child.type === 'element' && child.tagName === 'code' + ); + + if (!codeNode || codeNode.type !== 'element') return; + + // @ts-expect-error - rehype-pretty-code adds custom meta property + const meta = codeNode.data?.meta || codeNode.properties?.metastring; + + if (meta) { + // Check for 'frame' keyword + if (meta.includes('frame')) { + node.properties['data-frame'] = ''; + } + + // Extract title="..." if present + const titleMatch = meta.match(/title="([^"]+)"/); + if (titleMatch) { + node.properties['data-title'] = titleMatch[1]; + } + + // Check for line numbers flag in meta + if (meta.includes('showLineNumbers') || meta.includes('ln')) { + node.properties['data-line-numbers'] = ''; + } + } + + // Check recursively for [data-line] attribute in nested children + /** + * @param {import('hast').Element} element + * @returns {boolean} + */ + function hasDataLine(element) { + if (element.properties?.['data-line'] !== undefined) { + return true; + } + if (element.children) { + return element.children.some((child) => child.type === 'element' && hasDataLine(child)); + } + return false; + } + + if (hasDataLine(codeNode)) { + node.properties['data-line-numbers'] = ''; + } + + // Extract language from code element + const codeClassName = codeNode.properties?.className; + if (Array.isArray(codeClassName)) { + const langClass = codeClassName.find( + (cls) => typeof cls === 'string' && cls.startsWith('language-') + ); + if (typeof langClass === 'string') { + const language = langClass.replace('language-', ''); + node.properties['data-language'] = language; + } + } + } + }); + }; +} diff --git a/packages/docs/src/lib/markdown/rehype/live-code.js b/packages/docs/src/lib/markdown/rehype/live-code.js new file mode 100644 index 0000000..0a370e4 --- /dev/null +++ b/packages/docs/src/lib/markdown/rehype/live-code.js @@ -0,0 +1,158 @@ +// @ts-nocheck +import { createHash } from 'node:crypto'; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import process from 'node:process'; +import { visit } from 'unist-util-visit'; + +/** + * Remark plugin to handle live code blocks (e.g., ```svelte live) + * Writes live code to .svelte files and imports them + * MUST run BEFORE any rehype plugins (operates on markdown AST, not HTML) + * @param {{ outputDir?: string; importPrefix?: string; liveCodeComponent?: string }} [options] + * @returns {(tree: import('mdast').Root, vFile: import('vfile').VFile) => void} + */ +export function remarkLiveCode(options = {}) { + const basePath = resolve(process.cwd(), options.outputDir ?? '.live-code'); + const liveCodeMap = resolve(basePath, 'live-code-map.json'); + const importPrefix = options.importPrefix ?? '/.live-code'; + const liveCodeComponent = + options.liveCodeComponent ?? '@layerstack/docs/markdown/components/LiveCode.svelte'; + + // Ensure directory exists + if (!existsSync(basePath)) { + mkdirSync(basePath, { recursive: true }); + } + + // Initialize or load the map file + if (!existsSync(liveCodeMap)) { + writeFileSync(liveCodeMap, '{}'); + } + + return (tree, vFile) => { + const liveCodeImports = new Map(); // Use Map to dedupe identical code blocks + let hasScript = false; + + visit(tree, 'code', (node, index, parent) => { + if (index === null || !parent) return; + const { meta, lang, value } = node; + const metaArray = (meta || '').split(' ').filter(Boolean); + + // Check if this is a live code block + if (lang !== 'svelte' || !metaArray.includes('live')) return; + + // Parse all key=value props from meta string + /** @type {Record} */ + const props = {}; + const propsRegex = /(\w+)=(?:"([^"]*)"|(\w+))/g; + let match; + while ((match = propsRegex.exec(meta || '')) !== null) { + const key = match[1]; + const value = match[2] || match[3]; // quoted or unquoted value + // Convert boolean strings to actual booleans + if (value === 'true') { + props[key] = true; + } else if (value === 'false') { + props[key] = false; + } else { + props[key] = value; + } + } + + // Convert props object to Svelte props string + const propsString = Object.entries(props) + .map(([key, value]) => { + if (typeof value === 'boolean') { + return `${key}={${value}}`; + } else { + return `${key}="${value}"`; + } + }) + .join(' '); + const propsWithSpace = propsString ? ' ' + propsString : ''; + + // Use the raw code value + const rawCode = value || ''; + + // Generate unique ID for this code block based on file path and content hash + const contentHash = createHash('md5').update(rawCode).digest('hex').substring(0, 8); + const blockId = `${vFile.path}-${contentHash}`; + const idMap = JSON.parse(readFileSync(liveCodeMap, 'utf-8')); + + let componentFileName = idMap[blockId]; + if (!componentFileName) { + // Generate unique filename + const hash = Math.random().toString(36).substring(2, 11); + componentFileName = `LiveCode${hash}.svelte`; + idMap[blockId] = componentFileName; + writeFileSync(liveCodeMap, JSON.stringify(idMap, null, 2)); + } + + // Write the live code to a .svelte file + const componentPath = resolve(basePath, componentFileName); + writeFileSync(componentPath, rawCode); + + // Generate component name (remove .svelte extension) + const componentName = componentFileName.replace(/\.svelte$/, ''); + + // Track import for later injection (Map dedupes identical code blocks) + liveCodeImports.set(componentName, `${importPrefix}/${componentFileName}`); + + // Create the live code container structure wrapped in LiveCodeWrapper + const liveCodeContainer = { + type: 'paragraph', + data: { + hName: 'div', + hProperties: {}, + }, + children: [ + { + type: 'html', + value: `{#snippet preview()}<${componentName} />{/snippet}
    `, + }, + ], + }; + + // Add code section with original code block (title will be handled by rehype-code-block-title) + liveCodeContainer.children.push(node); + + liveCodeContainer.children.push({ + type: 'html', + value: '
    ', // Close live-code-source and LiveCode + }); + + // Replace the code node with the container + parent.children[index] = liveCodeContainer; + }); + + // Inject imports at the beginning of the file + if (liveCodeImports.size > 0) { + const importStatements = [ + `import LiveCode from '${liveCodeComponent}';`, + ...[...liveCodeImports.entries()].map( + ([componentName, path]) => `import ${componentName} from '${path}';` + ), + ].join('\n'); + + // Find existing script tag or create new one + visit(tree, 'html', (node, idx, parent) => { + if (node.value.startsWith(']*>/, + (match) => `${match}\n${importStatements}` + ); + return visit.EXIT; + } + }); + + if (!hasScript) { + // Create new script tag at the beginning + tree.children.unshift({ + type: 'html', + value: ``, + }); + } + } + }; +} diff --git a/packages/docs/src/lib/markdown/remark/components.js b/packages/docs/src/lib/markdown/remark/components.js new file mode 100644 index 0000000..dba066c --- /dev/null +++ b/packages/docs/src/lib/markdown/remark/components.js @@ -0,0 +1,263 @@ +// @ts-nocheck +import { cls } from '@layerstack/tailwind'; +import { toCamelCase } from '@layerstack/utils'; +import { visit, EXIT } from 'unist-util-visit'; + +/** + * Remark plugin to transform MDC components (::tip, ::note, ::steps, etc.) into custom Svelte components + * Works with remark-mdc to convert MDC components into Svelte components + * + * Supported components: + * - ::tip / :::tip - renders as Note component with variant="tip" + * - ::note / :::note - renders as Note component with variant="note" + * - ::warning / :::warning - renders as Note component with variant="warning" + * - ::caution / :::caution - renders as Note component with variant="caution" + * - ::steps / :::steps - renders as Steps component + * - ::tabs / :::tabs - renders as Tabs component (supports nested ::tab) + * - ::tab / :::tab - renders as Tab component (used inside tabs, supports icon attribute via unplugin-icons) + * - :icon - renders as unplugin-icons component (inline icon with name attribute) + * - :button - renders as Button component (inline button, supports icon attribute via unplugin-icons) + * - :example - renders as Example component (inline example) + * + * @returns {(tree: any) => void} A remark transformer function + */ +/** + * Convert kebab-case attributes to camelCase for Svelte props + * @param {Record} attributes - Attributes object with potentially kebab-cased keys + * @returns {Record} - Attributes object with camelCase keys + */ +function kebabToCamelCase(attributes) { + /** @type {Record} */ + const camelCaseAttributes = {}; + for (const [key, value] of Object.entries(attributes)) { + // Convert kebab-case to camelCase + const camelKey = toCamelCase(key); + camelCaseAttributes[camelKey] = value; + } + return camelCaseAttributes; +} + +/** + * Convert icon name from various formats to unplugin-icons import format + * @param {string} name - Icon name (e.g., "logos:tailwindcss-icon", "i-logos-tailwindcss-icon", "lucide:code") + * @returns {{importPath: string, componentName: string}} - Import path and PascalCase component name + */ +function convertIconName(name) { + // Remove i- prefix if present + let iconName = name; + if (iconName.startsWith('i-')) { + iconName = iconName.slice(2); + } + + // Split by colon to get collection and icon name + let collection, icon; + if (iconName.includes(':')) { + [collection, icon] = iconName.split(':'); + } else { + // For i-collection-icon format without colon, we need to parse differently + // This is tricky because collections can have hyphens (e.g., vscode-icons) + // For now, assume everything after first hyphen is the icon name + const parts = iconName.split('-'); + collection = parts[0]; + icon = parts.slice(1).join('-'); + } + + // Create PascalCase component name by converting both collection and icon parts + /** @param {string} str */ + const toPascalCase = (str) => + str + .split('-') + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(''); + + const componentName = toPascalCase(collection) + toPascalCase(icon); + const importPath = `~icons/${collection}/${icon}`; + + return { importPath, componentName }; +} + +/** + * @param {{ markdownComponentsPath?: string; exampleComponentPath?: string }} [options] + */ +export function remarkComponents(options = {}) { + const markdownComponentsPath = + options.markdownComponentsPath ?? '@layerstack/docs/markdown/components'; + const exampleComponentPath = options.exampleComponentPath ?? '$lib/components'; + + return (tree) => { + const componentsToImport = new Set(); + const iconImports = new Map(); // Map of componentName -> importPath + + // Process MDC components (remark-mdc creates leafComponent and containerComponent nodes) + visit(tree, (node) => { + // Handle both leafComponent (::component) and containerComponent (::component...::) + if (node.type === 'leafComponent' || node.type === 'containerComponent') { + const componentName = node.name; + + // Alert variants all use the Note component + const alertVariants = ['tip', 'note', 'warning', 'caution']; + + // Map component names to Svelte component names and variants + let svelteComponent; + let variant; + + if (alertVariants.includes(componentName)) { + svelteComponent = 'Note'; + variant = componentName; + } else if (componentName === 'steps') { + svelteComponent = 'Steps'; + } else if (componentName === 'tabs') { + svelteComponent = 'Tabs'; + } else if (componentName === 'tab') { + svelteComponent = 'Tab'; + } else { + // Unknown component, skip transformation + return; + } + + // Track which components we need to import + componentsToImport.add(svelteComponent); + + // Get component attributes from MDC + const attributes = node.attributes || {}; + + // Convert kebab-case to camelCase for Svelte props + let processedAttributes = kebabToCamelCase(attributes); + + // Handle icon attribute on tab components (e.g., ::tab{label="pnpm" icon="vscode-icons:file-type-pnpm"}) + if (componentName === 'tab' && processedAttributes.icon) { + const { importPath, componentName: iconCompName } = convertIconName( + processedAttributes.icon + ); + iconImports.set(iconCompName, importPath); + + // Replace icon string with component reference expression + // Remove quotes so it becomes {ComponentName} instead of "ComponentName" + processedAttributes = { + ...processedAttributes, + icon: `{${iconCompName}}`, + }; + } + + // Convert the MDC component into a component that rehype can handle + // We set data.hName to tell rehype to convert this to the component + const data = node.data || (node.data = {}); + data.hName = svelteComponent; + data.hProperties = { + ...processedAttributes, + // Pass variant for alert components + ...(variant && { variant }), + }; + } + + // Handle inline text components (:component) + if (node.type === 'textComponent') { + const componentName = node.name; + + // Support :icon{name="logos:tailwindcss-icon"} or :icon{name="i-lucide-code"} syntax + if (componentName === 'icon') { + const iconName = node.attributes?.name; + if (iconName) { + const { importPath, componentName: iconComponentName } = convertIconName(iconName); + + // Track this icon import + iconImports.set(iconComponentName, importPath); + + // Get other attributes (excluding 'name') + const { name: _, class: className, ...otherAttributes } = node.attributes || {}; + + // Convert to the icon component + const data = node.data || (node.data = {}); + data.hName = iconComponentName; + data.hProperties = { + ...otherAttributes, + class: cls('inline-block', className), + }; + } + } else if (componentName === 'button') { + componentsToImport.add('Button'); + + const attributes = node.attributes || {}; + + // Convert kebab-case to camelCase for Svelte props + let processedAttributes = kebabToCamelCase(attributes); + + // Handle icon attribute on button components (e.g., :button{icon="lucide:github"}) + if (processedAttributes.icon) { + const { importPath, componentName: iconCompName } = convertIconName( + processedAttributes.icon + ); + iconImports.set(iconCompName, importPath); + + // Replace icon string with component reference expression + processedAttributes = { + ...processedAttributes, + icon: `{${iconCompName}}`, + }; + } + + const data = node.data || (node.data = {}); + data.hName = 'Button'; + data.hProperties = processedAttributes; + } else if (componentName === 'example') { + componentsToImport.add('Example'); + + const attributes = node.attributes || {}; + + // Convert kebab-case to camelCase for Svelte props + const processedAttributes = kebabToCamelCase(attributes); + + const data = node.data || (node.data = {}); + data.hName = 'Example'; + data.hProperties = processedAttributes; + } + } + }); + + // Inject component imports at the beginning of the file + if (componentsToImport.size > 0 || iconImports.size > 0) { + // Generate regular component imports + const componentArray = Array.from(componentsToImport); + const componentImportStatements = componentArray + .map((comp) => { + const path = comp === 'Example' ? exampleComponentPath : markdownComponentsPath; + return `import ${comp} from '${path}/${comp}.svelte';`; + }) + .join('\n'); + + // Generate icon imports from unplugin-icons + const iconImportStatements = Array.from(iconImports.entries()) + .map(([componentName, importPath]) => { + return `import ${componentName} from '${importPath}';`; + }) + .join('\n'); + + // Combine all imports + const importStatements = [componentImportStatements, iconImportStatements] + .filter(Boolean) + .join('\n'); + + // Check if there's already a script tag + let hasScript = false; + visit(tree, 'html', (node) => { + if (node.value.startsWith(']*>/, + /** @param {string} match */ + (match) => `${match}\n${importStatements}` + ); + return EXIT; + } + }); + + if (!hasScript) { + // Create new script tag at the beginning + tree.children.unshift({ + type: 'html', + value: ``, + }); + } + } + }; +} diff --git a/packages/docs/src/lib/markdown/toc.ts b/packages/docs/src/lib/markdown/toc.ts new file mode 100644 index 0000000..2585123 --- /dev/null +++ b/packages/docs/src/lib/markdown/toc.ts @@ -0,0 +1,35 @@ +import GithubSlugger from 'github-slugger'; + +/** + * Extract table of contents from markdown content + */ +export function extractTocFromMarkdown( + content: string +): { id: string; text: string; level: number }[] { + const toc: { id: string; text: string; level: number }[] = []; + + // A fresh slugger per document de-duplicates repeated slugs (e.g. headings + // `string` and `string[]` both slugify to `string`), matching `rehype-slug`'s + // behavior so TOC ids stay unique and line up with the rendered heading ids. + const slugger = new GithubSlugger(); + + // Strip HTML comments so commented-out headings are ignored + const stripped = content.replace(//g, ''); + + const headingRegex = /^(#{1,6})\s+(.+)$/gm; + let match: RegExpExecArray | null; + while ((match = headingRegex.exec(stripped)) !== null) { + const level = match[1].length; + // Strip inline MDC directives (e.g. `:icon{name="lucide:user" class="..."}`) + // and markdown links (e.g. `[text](url)` → `text`) + const text = match[2] + .replace(/:[a-zA-Z][\w-]*\{[^}]*\}/g, '') + .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') + .trim(); + if (!text) continue; + const id = slugger.slug(text); + toc.push({ id, text, level }); + } + + return toc; +} diff --git a/packages/docs/src/lib/markdown/transformers/shiki-diff.js b/packages/docs/src/lib/markdown/transformers/shiki-diff.js new file mode 100644 index 0000000..237d39e --- /dev/null +++ b/packages/docs/src/lib/markdown/transformers/shiki-diff.js @@ -0,0 +1,46 @@ +/** + * Custom transformer for diff highlighting + * Processes code blocks with 'diff' in the meta string to add/remove line styling + * @returns {import('shiki').ShikiTransformer} + */ +export function shikiDiffTransformer() { + return { + name: 'diff-transformer', + code(node) { + // Trigger on either ```diff (language) or ``` diff (meta string) + const metaString = this.options.meta?.__raw || ''; + const lang = this.options.lang || ''; + if (lang !== 'diff' && !metaString.includes('diff')) return; + + // Add class to the pre element + this.addClassToHast(this.pre, 'has-diff'); + + // Get all line elements + const lines = node.children.filter((child) => child.type === 'element'); + + for (const line of lines) { + // Get all text tokens in this line + const tokens = line.children.filter((child) => child.type === 'element'); + + if (tokens.length === 0) continue; + + // Check the first token's text content + const firstToken = tokens[0]; + const textNodes = firstToken.children?.filter((child) => child.type === 'text'); + + if (!textNodes || textNodes.length === 0) continue; + + const firstText = textNodes[0]; + const text = firstText.value; + + if (text.startsWith('+')) { + this.addClassToHast(line, 'diff-add'); + firstText.value = text.slice(1); + } else if (text.startsWith('-')) { + this.addClassToHast(line, 'diff-remove'); + firstText.value = text.slice(1); + } + } + }, + }; +} diff --git a/packages/docs/src/lib/markdown/utils.ts b/packages/docs/src/lib/markdown/utils.ts new file mode 100644 index 0000000..28d030f --- /dev/null +++ b/packages/docs/src/lib/markdown/utils.ts @@ -0,0 +1,36 @@ +/** + * Strip markdown syntax to get plain text. + * Useful for search indexing or generating plain text excerpts. + */ +export function stripMarkdown(content: string): string { + return ( + content + // Remove code blocks + .replace(/```[\s\S]*?```/g, '') + // Remove inline code + .replace(/`[^`]+`/g, '') + // Remove links but keep text + .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') + // Remove images + .replace(/!\[([^\]]*)\]\([^)]+\)/g, '') + // Remove HTML tags + .replace(/<[^>]+>/g, '') + // Remove headings markup + .replace(/^#{1,6}\s+/gm, '') + // Remove bold/italic + .replace(/\*{1,2}([^*]+)\*{1,2}/g, '$1') + .replace(/_{1,2}([^_]+)_{1,2}/g, '$1') + // Remove blockquotes + .replace(/^>\s+/gm, '') + // Remove horizontal rules + .replace(/^[-*_]{3,}\s*$/gm, '') + // Remove list markers + .replace(/^[\s]*[-*+]\s+/gm, '') + .replace(/^[\s]*\d+\.\s+/gm, '') + // Remove MDX/directives like :example{...} or ::directive + .replace(/:{1,2}\w+(\{[^}]*\})?/g, '') + // Collapse multiple whitespace/newlines + .replace(/\s+/g, ' ') + .trim() + ); +} diff --git a/packages/docs/src/lib/node/component-api.js b/packages/docs/src/lib/node/component-api.js new file mode 100644 index 0000000..4a377c3 --- /dev/null +++ b/packages/docs/src/lib/node/component-api.js @@ -0,0 +1,503 @@ +/** + * LayerChart Component API Extractor + * + * This script extracts TypeScript type definitions and JSDoc documentation from + * Svelte components in the layerchart library. + * + * @description + * Scans all .svelte files in packages/layerchart/src/lib/components and extracts: + * - Component prop types (*PropsWithoutHTML or *Props patterns, exported or not) + * - JSDoc descriptions for each property + * - Default values from @default tags + * - Optional/required status + * - Additional JSDoc tags (@bindable, etc.) + * - Nested object properties + * + * @output + * Generates individual JSON files in generated/api/ for each component, plus an index.json file + * + * @usage + * pnpm extract:api + * + * @example + * // Generated output structure: + * { + * "generatedAt": "2025-11-02T00:00:00.000Z", + * "components": [ + * { + * "component": "Rect", + * "propsType": "RectPropsWithoutHTML", + * "properties": [ + * { + * "name": "x", + * "type": "number", + * "optional": true, + * "description": "The x-coordinate", + * "default": "0" + * } + * ] + * } + * ] + * } + */ +import fs from 'fs'; +import path from 'path'; +import ts from 'typescript'; +/** + * Get all canonical .svelte files in a directory (recursively). + * + * Skips per-layer variants (`*.svg.svelte`, `*.canvas.svelte`, `*.html.svelte`) + * and the shared base impl (`*.base.svelte`) — the canonical `.svelte` + * delegator re-exports the public Props type, which is what docs reference. + */ +export function getSvelteFiles(dir) { + const files = []; + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + // Recursively scan subdirectories (charts, layers, tooltip) + files.push(...getSvelteFiles(fullPath)); + } else if (entry.isFile() && entry.name.endsWith('.svelte')) { + if (/\.(svg|canvas|html|base)\.svelte$/.test(entry.name)) continue; + files.push(fullPath); + } + } + return files; +} +/** + * Extract JSDoc comments from a node + */ +function extractJsDoc(node) { + const jsDocTags = ts.getJSDocTags(node); + const jsDocComments = node.jsDoc; + let description; + const tags = {}; + let defaultValue; + // Extract description from JSDoc comment + if (jsDocComments && jsDocComments.length > 0) { + const comment = jsDocComments[0].comment; + if (typeof comment === 'string') { + description = comment; + } else if (Array.isArray(comment)) { + description = comment.map((c) => c.text).join(''); + } + } + // Extract tags + for (const tag of jsDocTags) { + const tagName = tag.tagName.text; + let tagValue = ''; + if (tag.comment) { + if (typeof tag.comment === 'string') { + tagValue = tag.comment; + } else if (Array.isArray(tag.comment)) { + tagValue = tag.comment.map((c) => c.text).join(''); + } + } + if (tagName === 'default') { + defaultValue = tagValue; + } else { + tags[tagName] = tagValue; + } + } + return { + description, + tags: Object.keys(tags).length > 0 ? tags : undefined, + default: defaultValue, + }; +} +/** + * Get type as string + */ +function getTypeString(typeNode, checker) { + if (!typeNode) return 'any'; + // Use the printer to get a string representation + const printer = ts.createPrinter({ removeComments: true }); + const typeString = printer.printNode(ts.EmitHint.Unspecified, typeNode, typeNode.getSourceFile()); + // Normalize whitespace - collapse multiple spaces/newlines into single spaces + return typeString.replace(/\s+/g, ' ').trim(); +} +/** + * Extract properties from a type literal or interface + */ +function extractProperties(node, checker) { + const properties = []; + for (const member of node.members) { + if (ts.isPropertySignature(member) && member.name) { + const name = member.name.getText(); + const required = !member.questionToken; // Inverted: required = not optional + const type = getTypeString(member.type, checker); + const jsDoc = extractJsDoc(member); + // Check if this is a nested object type + let nestedProperties; + if (member.type && ts.isTypeLiteralNode(member.type)) { + nestedProperties = extractProperties(member.type, checker); + } + properties.push({ + name, + type, + required, + ...jsDoc, + ...(nestedProperties && nestedProperties.length > 0 + ? { properties: nestedProperties } + : {}), + }); + } + } + return properties; +} +/** + * Resolve intersection types and extract all properties + */ +function extractPropertiesFromType(typeNode, checker, sourceFile) { + let properties = []; + if (ts.isIntersectionTypeNode(typeNode)) { + // Handle intersection types (A & B & C) + for (const type of typeNode.types) { + properties = properties.concat(extractPropertiesFromType(type, checker, sourceFile)); + } + } else if (ts.isTypeLiteralNode(typeNode)) { + // Handle inline type literals + properties = extractProperties(typeNode, checker); + } else if (ts.isTypeReferenceNode(typeNode)) { + // Handle type references (e.g., CommonStyleProps) + const typeName = typeNode.typeName.getText(); + // Try to find the type definition in the same file + ts.forEachChild(sourceFile, (node) => { + if (ts.isTypeAliasDeclaration(node) && node.name.text === typeName) { + properties = properties.concat(extractPropertiesFromType(node.type, checker, sourceFile)); + } else if (ts.isInterfaceDeclaration(node) && node.name.text === typeName) { + properties = properties.concat(extractProperties(node, checker)); + } + }); + } + return properties; +} +/** + * Extract element type from generic types like SVGAttributes + */ +function extractElementType(typeString) { + const match = typeString.match(/(?:SVG|HTML)Attributes<(\w+)>/); + return match?.[1]; +} +/** + * Parse extended types from an intersection type + */ +function parseExtendedTypes(typeNode, sourceFile) { + const extendedTypes = []; + if (!ts.isIntersectionTypeNode(typeNode)) { + return extendedTypes; + } + for (const type of typeNode.types) { + const typeText = type.getText(sourceFile); + // Skip the base PropsWithoutHTML type (but not Without<> that contains PropsWithoutHTML) + if (!typeText.startsWith('Without<') && typeText.includes('PropsWithoutHTML')) { + continue; + } + // Check if this is a Without<> wrapper (used to exclude props) + // Extract the element type from inside Without, ...> + const elementTypeFromWithout = extractElementType(typeText); + if (typeText.startsWith('Without<') && elementTypeFromWithout) { + extendedTypes.push({ + name: elementTypeFromWithout.replace(/Element$/, 'Attributes'), + fullType: typeText, + elementType: elementTypeFromWithout, + isLibraryType: true, + }); + continue; + } + // Check if this is an SVG/HTML Attributes type + const elementType = extractElementType(typeText); + if (elementType) { + extendedTypes.push({ + name: elementType.replace(/Element$/, 'Attributes'), + fullType: typeText, + elementType, + isLibraryType: true, + }); + continue; + } + // Check if this is a reference to another type (like CommonEvents) + if (ts.isTypeReferenceNode(type)) { + const typeName = type.typeName.getText(sourceFile); + extendedTypes.push({ + name: typeName, + fullType: typeText, + isLibraryType: false, // We should extract these types + }); + } + } + return extendedTypes; +} +/** + * Find the main Props type for a component + * Looks for patterns like: ComponentPropsWithoutHTML, ComponentProps + */ +function findPropsTypeName(componentName, moduleScript) { + // Try different patterns in order of preference + const patterns = [ + // First try exported types with exact component name match + { pattern: `${componentName}PropsWithoutHTML`, requireExport: true }, + { pattern: `${componentName}Props`, requireExport: true }, + // Then try non-exported types with exact component name match + { pattern: `${componentName}PropsWithoutHTML`, requireExport: false }, + { pattern: `${componentName}Props`, requireExport: false }, + // Finally, try any exported Props type + { regex: new RegExp(`export type (\\w*PropsWithoutHTML)`, 'g') }, + { regex: new RegExp(`export type (\\w*Props)(?!WithoutHTML)`, 'g') }, + // Last resort: any Props type (exported or not) + { regex: new RegExp(`type (\\w*PropsWithoutHTML)`, 'g') }, + { regex: new RegExp(`type (\\w*Props)(?!WithoutHTML)`, 'g') }, + ]; + for (const config of patterns) { + if ('regex' in config && config.regex) { + // For regex patterns, find all matches + const matches = [...moduleScript.matchAll(config.regex)]; + if (matches.length > 0) { + // Prefer types ending with "WithoutHTML" + const withoutHTMLMatch = matches.find((m) => m[1].endsWith('WithoutHTML')); + if (withoutHTMLMatch) { + return withoutHTMLMatch[1]; + } + // Otherwise return the first match + return matches[0][1]; + } + } else if ('pattern' in config && config.pattern) { + // String pattern + const searchStr = config.requireExport + ? `export type ${config.pattern}` + : `type ${config.pattern}`; + if (moduleScript.includes(searchStr)) { + return config.pattern; + } + } + } + return null; +} +/** + * Inline `export type { Foo } from './X.shared.svelte.js'` re-exports by + * appending the source `.ts` file's contents. The canonical layer-delegator + * components only re-export their public Props type from a sibling + * `*.shared.svelte.ts`, so without this the TS parser sees no type definition. + */ +function resolveSharedReExports(filePath, moduleScript) { + const reExportRegex = + /export\s+type\s*\{[^}]+\}\s*from\s+['"](\.\/[^'"]+\.shared\.svelte)\.js['"]\s*;?/g; + const dir = path.dirname(filePath); + let combined = moduleScript; + for (const match of moduleScript.matchAll(reExportRegex)) { + const sharedPath = path.join(dir, `${match[1].slice(2)}.ts`); + if (fs.existsSync(sharedPath)) { + combined += '\n' + fs.readFileSync(sharedPath, 'utf-8'); + } + } + return combined; +} +/** + * Extract component API from a Svelte file + */ +export function extractComponentAPI(filePath) { + const content = fs.readFileSync(filePath, 'utf-8'); + // Extract the module script content + const moduleScriptMatch = content.match( + /]*lang="ts"[^>]*module[^>]*>([\s\S]*?)<\/script>/ + ); + if (!moduleScriptMatch) { + return null; + } + const moduleScript = resolveSharedReExports(filePath, moduleScriptMatch[1]); + // Look for the main Props type + const componentName = path.basename(filePath, '.svelte'); + const propsTypeName = findPropsTypeName(componentName, moduleScript); + if (!propsTypeName) { + return null; + } + // Create a temporary TypeScript file for parsing + const tempFile = `temp-${componentName}.ts`; + const tempPath = path.join(path.dirname(filePath), tempFile); + // Write the module script to a temp file with necessary imports resolved + // We keep the original imports but add stub types for common ones that might not resolve + const tempContent = ` +import type { SVGAttributes, HTMLAttributes, MouseEventHandler, PointerEventHandler } from 'svelte/elements'; +import type { Snippet, Component } from 'svelte'; + +// Stub types that might not resolve (only if not already defined) +type CommonStyleProps = { + /** Fill color */ + fill?: string; + /** Fill opacity (0-1) */ + fillOpacity?: number; + /** Stroke color */ + stroke?: string; + /** Stroke width in pixels */ + strokeWidth?: number; + /** Stroke opacity (0-1) */ + strokeOpacity?: number; + /** Overall opacity (0-1) */ + opacity?: number; +}; + +type CommonEvents = { + /** Click event handler */ + onclick?: MouseEventHandler | null; + /** Double click event handler */ + ondblclick?: MouseEventHandler | null; + /** Pointer enter event handler */ + onpointerenter?: PointerEventHandler | null; + /** Pointer move event handler */ + onpointermove?: PointerEventHandler | null; + /** Pointer leave event handler */ + onpointerleave?: PointerEventHandler | null; + /** Pointer over event handler */ + onpointerover?: PointerEventHandler | null; + /** Pointer out event handler */ + onpointerout?: PointerEventHandler | null; +}; + +type Without = Omit; +type MotionProp = any; +type SingleDomainType = any; +type Placement = 'top' | 'right' | 'bottom' | 'left'; + +${moduleScript} +`; + fs.writeFileSync(tempPath, tempContent); + try { + // Parse the TypeScript file + const program = ts.createProgram([tempPath], { + target: ts.ScriptTarget.ES2020, + module: ts.ModuleKind.ESNext, + }); + const sourceFile = program.getSourceFile(tempPath); + if (!sourceFile) { + return null; + } + const checker = program.getTypeChecker(); + let properties = []; + const extendedTypes = []; + // Find the PropsWithoutHTML type for properties + ts.forEachChild(sourceFile, (node) => { + if (ts.isTypeAliasDeclaration(node) && node.name.text === propsTypeName) { + properties = extractPropertiesFromType(node.type, checker, sourceFile); + } + }); + // Also look for the full Props type to extract extended types + // Try both removing "WithoutHTML" and looking for types that end with "Props" + const possibleFullPropsNames = [ + propsTypeName.replace('WithoutHTML', ''), + `${componentName}Props`, + ]; + for (const fullPropsTypeName of possibleFullPropsNames) { + ts.forEachChild(sourceFile, (node) => { + if (ts.isTypeAliasDeclaration(node) && node.name.text === fullPropsTypeName) { + const newExtendedTypes = parseExtendedTypes(node.type, sourceFile); + // Merge with existing, avoiding duplicates + for (const extType of newExtendedTypes) { + if (!extendedTypes.some((et) => et.name === extType.name)) { + extendedTypes.push(extType); + } + } + // Extract properties from non-library extended types (like CommonEvents) + for (const extType of extendedTypes) { + if (!extType.isLibraryType) { + // Find this type definition and extract its properties + ts.forEachChild(sourceFile, (typeNode) => { + if (ts.isTypeAliasDeclaration(typeNode) && typeNode.name.text === extType.name) { + const extProperties = extractPropertiesFromType( + typeNode.type, + checker, + sourceFile + ); + // Add these properties to the main list, avoiding duplicates + for (const prop of extProperties) { + if (!properties.some((p) => p.name === prop.name)) { + properties.push(prop); + } + } + } + }); + } + } + } + }); + } + if (properties.length === 0) { + return null; + } + const result = { + generatedAt: new Date().toISOString(), + component: componentName, + propsType: propsTypeName, + properties, + }; + // Only add extends if there are extended types + if (extendedTypes.length > 0) { + result.extends = extendedTypes; + } + return result; + } finally { + // Clean up temp file + if (fs.existsSync(tempPath)) { + fs.unlinkSync(tempPath); + } + } +} +/** + * Extract APIs for all components in a directory + */ +export function extractAPIs(dir) { + const svelteFiles = getSvelteFiles(dir); + const apis = []; + for (const filePath of svelteFiles) { + const api = extractComponentAPI(filePath); + if (api) { + apis.push(api); + } + } + return apis.sort((a, b) => a.component.localeCompare(b.component)); +} +export function writeComponentAPIs({ componentsDir, outputDir, logger = console }) { + logger.log('Extracting component APIs...'); + const svelteFiles = getSvelteFiles(componentsDir); + logger.log(`Found ${svelteFiles.length} Svelte files`); + const apis = []; + for (const filePath of svelteFiles) { + const componentName = path.basename(filePath, '.svelte'); + logger.log(`Processing ${componentName}...`); + const api = extractComponentAPI(filePath); + if (api) { + apis.push(api); + logger.log(` ✓ Extracted ${api.properties.length} properties`); + } else { + logger.log(` ⚠ No Props type found`); + } + } + // Sort by component name + apis.sort((a, b) => a.component.localeCompare(b.component)); + // Create output directory if it doesn't exist + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + // Write individual component files + logger.log(`\nWriting individual component files...`); + for (const api of apis) { + const componentFile = path.join(outputDir, `${api.component}.json`); + fs.writeFileSync(componentFile, JSON.stringify(api, null, 2)); + } + // Write index file with list of all components + const indexFile = path.join(outputDir, 'index.json'); + const indexOutput = { + generatedAt: new Date().toISOString(), + components: apis.map((api) => ({ + component: api.component, + propsType: api.propsType, + propertyCount: api.properties.length, + file: `${api.component}.json`, + })), + }; + fs.writeFileSync(indexFile, JSON.stringify(indexOutput, null, 2)); + logger.log(`\n✅ Generated ${apis.length} component API files in ${outputDir}`); + logger.log(`✅ Generated index file: ${indexFile}`); + logger.log(` Extracted ${apis.length} component APIs`); + return apis; +} diff --git a/packages/docs/src/lib/node/example-catalog.js b/packages/docs/src/lib/node/example-catalog.js new file mode 100644 index 0000000..573075a --- /dev/null +++ b/packages/docs/src/lib/node/example-catalog.js @@ -0,0 +1,261 @@ +/** + * LayerChart Example Index Generator + * + * This script generates a catalog for each component that shows: + * - All examples available for that component + * - All usage of that component across all examples + * + * @description + * Scans all components in packages/layerchart/src/lib/components and for each: + * - Finds examples in docs/src/examples/[ComponentName]/ + * - Searches all examples for usage of .svelte` is treated as a public component. + */ +function getComponents(dir) { + const components = []; + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isFile() && entry.name.endsWith('.svelte')) { + if (/\.(svg|canvas|html|base)\.svelte$/.test(entry.name)) continue; + // Remove .svelte extension to get component name + const componentName = entry.name.replace('.svelte', ''); + components.push(componentName); + } else if (entry.isDirectory()) { + // Recursively scan subdirectories + components.push(...getComponents(fullPath)); + } + } + return components.sort(); +} +/** + * Extract all component usages from an example file + */ +function extractComponentsFromExample(filePath, allComponents) { + const components = []; + const content = fs.readFileSync(filePath, 'utf-8'); + const lines = content.split('\n'); + // Track which components we've found to avoid duplicates + const foundComponents = new Set(); + // Search for each known component in the file + for (const componentName of allComponents) { + // Use word boundary to avoid matching components with similar prefixes + // Match if followed by: whitespace, >, /, ., :, or end-of-line + const searchPattern = new RegExp(`<${componentName}(?:\\s|>|/|\\.|:|$)`, 'i'); + lines.forEach((line, index) => { + if (searchPattern.test(line) && !foundComponents.has(componentName)) { + foundComponents.add(componentName); + components.push({ + component: componentName, + lineNumber: index + 1, + line: line.trim(), + }); + } + }); + } + // Sort by line number + return components.sort((a, b) => a.lineNumber - b.lineNumber); +} +/** + * Extract module-level exports (title, description, tags) from a + + +
    %sveltekit.body%
    + + diff --git a/packages/docs/templates/stackblitz-template/src/routes/+layout.svelte b/packages/docs/templates/stackblitz-template/src/routes/+layout.svelte new file mode 100644 index 0000000..06476ac --- /dev/null +++ b/packages/docs/templates/stackblitz-template/src/routes/+layout.svelte @@ -0,0 +1,9 @@ + + +
    + {@render children?.()} +
    diff --git a/packages/docs/templates/stackblitz-template/svelte.config.js b/packages/docs/templates/stackblitz-template/svelte.config.js new file mode 100644 index 0000000..ae56723 --- /dev/null +++ b/packages/docs/templates/stackblitz-template/svelte.config.js @@ -0,0 +1,21 @@ +import adapter from '@sveltejs/adapter-auto'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + kit: { + adapter: adapter(), + alias: { + '$static/*': 'static/*', + }, + experimental: { + remoteFunctions: true, + }, + }, + compilerOptions: { + experimental: { + async: true, + }, + }, +}; + +export default config; diff --git a/packages/docs/templates/stackblitz-template/vite.config.js b/packages/docs/templates/stackblitz-template/vite.config.js new file mode 100644 index 0000000..867603e --- /dev/null +++ b/packages/docs/templates/stackblitz-template/vite.config.js @@ -0,0 +1,14 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; +import tailwindcss from '@tailwindcss/vite'; +import Icons from 'unplugin-icons/vite'; + +export default defineConfig({ + plugins: [ + tailwindcss(), + sveltekit(), + Icons({ + compiler: 'svelte', + }), + ], +}); diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json new file mode 100644 index 0000000..b0bc4ba --- /dev/null +++ b/packages/docs/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + }, + "exclude": ["node_modules", "dist", "templates"] +} diff --git a/packages/svelte-actions/package.json b/packages/svelte-actions/package.json index e808d24..874c24a 100644 --- a/packages/svelte-actions/package.json +++ b/packages/svelte-actions/package.json @@ -6,8 +6,9 @@ "repository": "techniq/layerstack", "version": "1.0.1-next.18", "scripts": { - "dev": "rimraf dist && tsc -p tsconfig.build.json --watch", - "build": "rimraf dist && tsc -p tsconfig.build.json", + "dev": "tsc -p tsconfig.build.json --watch", + "clean": "rimraf dist", + "build": "pnpm clean && tsc -p tsconfig.build.json", "preview": "vite preview", "package": "svelte-package", "prepublishOnly": "svelte-package", diff --git a/packages/svelte-state/package.json b/packages/svelte-state/package.json index 87f815d..a699e60 100644 --- a/packages/svelte-state/package.json +++ b/packages/svelte-state/package.json @@ -6,8 +6,9 @@ "repository": "techniq/layerstack", "version": "0.1.0-next.23", "scripts": { - "dev": "rimraf dist && tsc -p tsconfig.build.json --watch", - "build": "rimraf dist && tsc -p tsconfig.build.json", + "dev": "tsc -p tsconfig.build.json --watch", + "clean": "rimraf dist", + "build": "pnpm clean && tsc -p tsconfig.build.json", "preview": "vite preview", "package": "svelte-package", "prepublishOnly": "svelte-package", diff --git a/packages/svelte-stores/package.json b/packages/svelte-stores/package.json index 3f47671..ac40e68 100644 --- a/packages/svelte-stores/package.json +++ b/packages/svelte-stores/package.json @@ -6,8 +6,9 @@ "repository": "techniq/layerstack", "version": "1.0.2-next.18", "scripts": { - "dev": "rimraf dist && tsc -p tsconfig.build.json --watch", - "build": "rimraf dist && tsc -p tsconfig.build.json", + "dev": "tsc -p tsconfig.build.json --watch", + "clean": "rimraf dist", + "build": "pnpm clean && tsc -p tsconfig.build.json", "preview": "vite preview", "package": "svelte-package", "prepublishOnly": "svelte-package", diff --git a/packages/svelte-table/package.json b/packages/svelte-table/package.json index 0612031..06860ad 100644 --- a/packages/svelte-table/package.json +++ b/packages/svelte-table/package.json @@ -6,8 +6,9 @@ "repository": "techniq/layerstack", "version": "1.0.1-next.18", "scripts": { - "dev": "rimraf dist && tsc -p tsconfig.build.json --watch", - "build": "rimraf dist && tsc -p tsconfig.build.json", + "dev": "tsc -p tsconfig.build.json --watch", + "clean": "rimraf dist", + "build": "pnpm clean && tsc -p tsconfig.build.json", "preview": "vite preview", "package": "svelte-package", "prepublishOnly": "svelte-package", diff --git a/packages/tailwind/package.json b/packages/tailwind/package.json index c497637..169da63 100644 --- a/packages/tailwind/package.json +++ b/packages/tailwind/package.json @@ -6,8 +6,9 @@ "repository": "techniq/layerstack", "version": "2.0.0-next.22", "scripts": { - "dev": "rimraf dist && tsc -p tsconfig.build.json --watch", - "build": "rimraf dist && tsc -p tsconfig.build.json && pnpm build:css && cp -r ./src/lib/css dist", + "dev": "tsc -p tsconfig.build.json --watch", + "clean": "rimraf dist", + "build": "pnpm clean && tsc -p tsconfig.build.json && pnpm build:css && cp -r ./src/lib/css dist", "build:css": "tsc --noEmit && tsx ./src/lib/cli/index.ts", "preview": "vite preview", "package": "svelte-package", diff --git a/packages/tailwind/src/lib/css/themes/generated/all.css b/packages/tailwind/src/lib/css/themes/generated/all.css index c6ebc49..9453e18 100644 --- a/packages/tailwind/src/lib/css/themes/generated/all.css +++ b/packages/tailwind/src/lib/css/themes/generated/all.css @@ -1059,6 +1059,15 @@ [data-theme="cyberpunk"] { color-scheme: light; + fontfamily: + ui-monospace, + SFMono-Regular, + Menlo, + Monaco, + Consolas, + Liberation Mono, + Courier New, + monospace; --color-primary: hsl(340.8799 100% 69.8833%); --color-secondary: hsl(185.3347 100% 50%); --color-accent: hsl(278.9515 100% 72.6993%); @@ -1580,7 +1589,7 @@ --color-danger-800: hsl(357.1922 53.6188% 43.5134%); --color-danger-900: hsl(357.1922 55.0988% 34.9232%); --color-surface-200: hsl(0 13.0424% 6.8651%); - --color-surface-300: hsl(360 14.1163% 5.7928%); + --color-surface-300: hsl(0 14.1163% 5.7928%); --color-surface-content: hsl(0.603 1.4217% 79.1884%); } @@ -2011,6 +2020,10 @@ [data-theme="wireframe"] { color-scheme: light; + fontfamily: + Chalkboard, + comic sans ms, + "sans-serif"; --color-primary: hsl(0 0% 72.1569%); --color-secondary: hsl(0 0% 72.1569%); --color-accent: hsl(0 0% 72.1569%); diff --git a/packages/tailwind/src/lib/css/themes/generated/daisy.css b/packages/tailwind/src/lib/css/themes/generated/daisy.css index eed275a..16e9161 100644 --- a/packages/tailwind/src/lib/css/themes/generated/daisy.css +++ b/packages/tailwind/src/lib/css/themes/generated/daisy.css @@ -1059,6 +1059,15 @@ [data-theme="cyberpunk"] { color-scheme: light; + fontfamily: + ui-monospace, + SFMono-Regular, + Menlo, + Monaco, + Consolas, + Liberation Mono, + Courier New, + monospace; --color-primary: hsl(340.8799 100% 69.8833%); --color-secondary: hsl(185.3347 100% 50%); --color-accent: hsl(278.9515 100% 72.6993%); @@ -1580,7 +1589,7 @@ --color-danger-800: hsl(357.1922 53.6188% 43.5134%); --color-danger-900: hsl(357.1922 55.0988% 34.9232%); --color-surface-200: hsl(0 13.0424% 6.8651%); - --color-surface-300: hsl(360 14.1163% 5.7928%); + --color-surface-300: hsl(0 14.1163% 5.7928%); --color-surface-content: hsl(0.603 1.4217% 79.1884%); } @@ -2011,6 +2020,10 @@ [data-theme="wireframe"] { color-scheme: light; + fontfamily: + Chalkboard, + comic sans ms, + "sans-serif"; --color-primary: hsl(0 0% 72.1569%); --color-secondary: hsl(0 0% 72.1569%); --color-accent: hsl(0 0% 72.1569%); diff --git a/packages/utils/package.json b/packages/utils/package.json index 413400f..fb0a82a 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -6,8 +6,9 @@ "repository": "techniq/layerstack", "version": "2.0.0-next.18", "scripts": { - "dev": "rimraf dist && tsc -p tsconfig.build.json --watch", - "build": "rimraf dist && tsc -p tsconfig.build.json", + "dev": "tsc -p tsconfig.build.json --watch", + "clean": "rimraf dist", + "build": "pnpm clean && tsc -p tsconfig.build.json", "preview": "vite preview", "package": "svelte-package", "prepublishOnly": "svelte-package", diff --git a/packages/utils/src/lib/date.ts b/packages/utils/src/lib/date.ts index 6fda1d5..eef78c1 100644 --- a/packages/utils/src/lib/date.ts +++ b/packages/utils/src/lib/date.ts @@ -1,5 +1,5 @@ import { - CountableTimeInterval, + type CountableTimeInterval, timeDay, timeHour, timeMillisecond, @@ -32,7 +32,7 @@ import { type FormatDateOptions, type DateFormatVariantPreset, periodTypeMappings, - PeriodTypeCode, + type PeriodTypeCode, type TimeIntervalType, } from './date_types.js'; import { defaultLocale, type LocaleSettings } from './locale.js'; diff --git a/packages/utils/src/lib/date_types.ts b/packages/utils/src/lib/date_types.ts index 3b2885e..037125f 100644 --- a/packages/utils/src/lib/date_types.ts +++ b/packages/utils/src/lib/date_types.ts @@ -1,5 +1,5 @@ import type { DateRange } from './dateRange.js'; -import { ValueOf } from './typeHelpers.js'; +import type { ValueOf } from './typeHelpers.js'; export type SelectedDate = Date | Date[] | DateRange | null | undefined; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03bcb25..ade85c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,248 @@ importers: specifier: ^4.14.4 version: 4.14.4(@cloudflare/workers-types@4.20250514.0) + docs: + dependencies: + '@fontsource-variable/inter': + specifier: ^5.2.8 + version: 5.2.8 + '@fortawesome/fontawesome-common-types': + specifier: ^6.7.2 + version: 6.7.2 + '@layerstack/docs': + specifier: workspace:* + version: link:../packages/docs + '@layerstack/svelte-actions': + specifier: workspace:* + version: link:../packages/svelte-actions + '@layerstack/svelte-state': + specifier: workspace:* + version: link:../packages/svelte-state + '@layerstack/svelte-stores': + specifier: workspace:* + version: link:../packages/svelte-stores + '@layerstack/svelte-table': + specifier: workspace:* + version: link:../packages/svelte-table + '@layerstack/tailwind': + specifier: workspace:* + version: link:../packages/tailwind + '@layerstack/utils': + specifier: workspace:* + version: link:../packages/utils + '@mdi/js': + specifier: ^7.4.47 + version: 7.4.47 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + d3-array: + specifier: ^3.2.4 + version: 3.2.4 + tailwind-merge: + specifier: ^3.2.0 + version: 3.3.0 + devDependencies: + '@changesets/cli': + specifier: ^2.29.4 + version: 2.29.4 + '@content-collections/core': + specifier: ^0.14.3 + version: 0.14.3(typescript@5.8.3) + '@content-collections/markdown': + specifier: ^0.1.4 + version: 0.1.4(@content-collections/core@0.14.3(typescript@5.8.3)) + '@content-collections/vite': + specifier: ^0.2.9 + version: 0.2.9(@content-collections/core@0.14.3(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) + '@fortawesome/free-solid-svg-icons': + specifier: ^6.7.2 + version: 6.7.2 + '@iconify-json/lucide': + specifier: ^1.2.53 + version: 1.2.53 + '@iconify-json/simple-icons': + specifier: ^1.2.84 + version: 1.2.84 + '@sveltejs/adapter-cloudflare': + specifier: ^7.0.3 + version: 7.0.3(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(wrangler@4.14.4(@cloudflare/workers-types@4.20250514.0)) + '@sveltejs/kit': + specifier: ^2.21.0 + version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) + '@sveltejs/package': + specifier: ^2.3.11 + version: 2.3.11(svelte@5.28.6)(typescript@5.8.3) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.3 + version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) + '@tailwindcss/typography': + specifier: ^0.5.16 + version: 0.5.16(tailwindcss@4.1.6) + '@tailwindcss/vite': + specifier: ^4.1.5 + version: 4.1.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) + '@types/d3-array': + specifier: ^3.2.1 + version: 3.2.1 + mdsx: + specifier: ^0.0.7 + version: 0.0.7(svelte@5.28.6) + posthog-js: + specifier: ^1.239.0 + version: 1.242.1 + prettier: + specifier: ^3.5.3 + version: 3.5.3 + prettier-plugin-svelte: + specifier: ^3.3.3 + version: 3.3.3(prettier@3.5.3)(svelte@5.28.6) + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + svelte: + specifier: ^5.28.2 + version: 5.28.6 + svelte-check: + specifier: ^4.1.6 + version: 4.1.7(picomatch@4.0.2)(svelte@5.28.6)(typescript@5.8.3) + svelte-ux: + specifier: 2.0.0-next.22 + version: 2.0.0-next.22(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0))(postcss@8.5.3)(svelte@5.28.6) + svelte2tsx: + specifier: ^0.7.36 + version: 0.7.37(svelte@5.28.6)(typescript@5.8.3) + tailwindcss: + specifier: ^4.1.5 + version: 4.1.6 + tslib: + specifier: ^2.8.1 + version: 2.8.1 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + unist-util-visit: + specifier: ^5.0.0 + version: 5.1.0 + unplugin-icons: + specifier: ^22.1.0 + version: 22.1.0(svelte@5.28.6) + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) + + packages/docs: + dependencies: + '@content-collections/core': + specifier: ^0.14.3 + version: 0.14.3(typescript@5.8.3) + '@content-collections/markdown': + specifier: ^0.1.4 + version: 0.1.4(@content-collections/core@0.14.3(typescript@5.8.3)) + '@iconify-json/lucide': + specifier: ^1.2.53 + version: 1.2.53 + '@iconify-json/simple-icons': + specifier: ^1.2.84 + version: 1.2.84 + '@layerstack/tailwind': + specifier: workspace:* + version: link:../tailwind + '@layerstack/utils': + specifier: workspace:* + version: link:../utils + '@shikijs/transformers': + specifier: ^4.1.0 + version: 4.1.0 + '@sveltejs/svelte-json-tree': + specifier: ^2.2.1 + version: 2.2.1(svelte@5.28.6) + '@webcontainer/api': + specifier: ^1.6.4 + version: 1.6.4 + flexsearch: + specifier: ^0.8.212 + version: 0.8.212 + github-slugger: + specifier: ^2.0.0 + version: 2.0.0 + mdsx: + specifier: ^0.0.7 + version: 0.0.7(svelte@5.28.6) + playwright: + specifier: ^1.60.0 + version: 1.60.0 + rehype-pretty-code: + specifier: ^0.14.3 + version: 0.14.3(shiki@4.1.0) + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + remark-mdc: + specifier: ^3.11.0 + version: 3.11.0 + runed: + specifier: ^0.37.1 + version: 0.37.1(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(zod@4.4.3) + sharp: + specifier: ^0.34.5 + version: 0.34.5 + shiki: + specifier: ^4.1.0 + version: 4.1.0 + svelte-ux: + specifier: 2.0.0-next.22 + version: 2.0.0-next.22(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0))(postcss@8.5.3)(svelte@5.28.6) + typescript: + specifier: ^5.8.3 + version: 5.8.3 + unist-builder: + specifier: ^4.0.0 + version: 4.0.0 + unist-util-visit: + specifier: ^5.1.0 + version: 5.1.0 + zod: + specifier: ^4.4.3 + version: 4.4.3 + devDependencies: + '@sveltejs/kit': + specifier: ^2.21.0 + version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) + '@sveltejs/package': + specifier: ^2.3.11 + version: 2.3.11(svelte@5.28.6)(typescript@5.8.3) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.3 + version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) + '@types/node': + specifier: ^24.0.1 + version: 24.0.1 + prettier: + specifier: ^3.5.3 + version: 3.5.3 + prettier-plugin-svelte: + specifier: ^3.3.3 + version: 3.3.3(prettier@3.5.3)(svelte@5.28.6) + svelte: + specifier: ^5.28.2 + version: 5.28.6 + svelte-check: + specifier: ^4.1.6 + version: 4.1.7(picomatch@4.0.2)(svelte@5.28.6)(typescript@5.8.3) + tslib: + specifier: ^2.8.1 + version: 2.8.1 + unplugin-icons: + specifier: ^22.1.0 + version: 22.1.0(svelte@5.28.6) + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) + packages/svelte-actions: dependencies: '@floating-ui/dom': @@ -38,7 +280,7 @@ importers: version: 2.3.11(svelte@5.28.6)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) '@types/d3-scale': specifier: ^4.0.9 version: 4.0.9 @@ -68,10 +310,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/debug@4.1.13)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) packages/svelte-state: dependencies: @@ -81,13 +323,13 @@ importers: devDependencies: '@sveltejs/kit': specifier: ^2.20.8 - version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) '@sveltejs/package': specifier: ^2.3.11 version: 2.3.11(svelte@5.28.6)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -114,10 +356,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.4 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: ^3.1.2 - version: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/debug@4.1.13)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) packages/svelte-stores: dependencies: @@ -133,13 +375,13 @@ importers: devDependencies: '@sveltejs/kit': specifier: ^2.21.0 - version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) '@sveltejs/package': specifier: ^2.3.11 version: 2.3.11(svelte@5.28.6)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 @@ -169,10 +411,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/debug@4.1.13)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) packages/svelte-table: dependencies: @@ -191,7 +433,7 @@ importers: version: 2.3.11(svelte@5.28.6)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) '@types/d3-array': specifier: ^3.2.1 version: 3.2.1 @@ -224,10 +466,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/debug@4.1.13)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) packages/tailwind: dependencies: @@ -288,10 +530,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/debug@4.1.13)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0) packages/utils: dependencies: @@ -310,7 +552,7 @@ importers: version: 2.3.11(svelte@5.28.6)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) '@types/d3-array': specifier: ^3.2.1 version: 3.2.1 @@ -346,140 +588,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) - - sites/docs: - dependencies: - '@fortawesome/fontawesome-common-types': - specifier: ^6.7.2 - version: 6.7.2 - '@layerstack/svelte-actions': - specifier: workspace:* - version: link:../../packages/svelte-actions - '@layerstack/svelte-state': - specifier: workspace:* - version: link:../../packages/svelte-state - '@layerstack/svelte-stores': - specifier: workspace:* - version: link:../../packages/svelte-stores - '@layerstack/svelte-table': - specifier: workspace:* - version: link:../../packages/svelte-table - '@layerstack/tailwind': - specifier: workspace:* - version: link:../../packages/tailwind - '@layerstack/utils': - specifier: workspace:* - version: link:../../packages/utils - '@mdi/js': - specifier: ^7.4.47 - version: 7.4.47 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - d3-array: - specifier: ^3.2.4 - version: 3.2.4 - prism-svelte: - specifier: ^0.5.0 - version: 0.5.0 - prism-themes: - specifier: ^1.9.0 - version: 1.9.0 - prismjs: - specifier: ^1.30.0 - version: 1.30.0 - sveld: - specifier: ^0.22.1 - version: 0.22.1(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1))(postcss@8.5.3) - tailwind-merge: - specifier: ^3.2.0 - version: 3.3.0 - devDependencies: - '@changesets/cli': - specifier: ^2.29.4 - version: 2.29.4 - '@fortawesome/free-solid-svg-icons': - specifier: ^6.7.2 - version: 6.7.2 - '@iconify-json/lucide': - specifier: ^1.2.53 - version: 1.2.53 - '@sveltejs/adapter-cloudflare': - specifier: ^7.0.3 - version: 7.0.3(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(wrangler@4.14.4(@cloudflare/workers-types@4.20250514.0)) - '@sveltejs/kit': - specifier: ^2.21.0 - version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) - '@sveltejs/package': - specifier: ^2.3.11 - version: 2.3.11(svelte@5.28.6)(typescript@5.8.3) - '@sveltejs/vite-plugin-svelte': - specifier: ^5.0.3 - version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) - '@tailwindcss/typography': - specifier: ^0.5.16 - version: 0.5.16(tailwindcss@4.1.6) - '@tailwindcss/vite': - specifier: ^4.1.5 - version: 4.1.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) - '@types/d3-array': - specifier: ^3.2.1 - version: 3.2.1 - '@types/prismjs': - specifier: ^1.26.5 - version: 1.26.5 - mdsvex: - specifier: ^0.12.5 - version: 0.12.6(svelte@5.28.6) - posthog-js: - specifier: ^1.239.0 - version: 1.242.1 - prettier: - specifier: ^3.5.3 - version: 3.5.3 - prettier-plugin-svelte: - specifier: ^3.3.3 - version: 3.3.3(prettier@3.5.3)(svelte@5.28.6) - rehype-slug: - specifier: ^6.0.0 - version: 6.0.0 - svelte: - specifier: ^5.28.2 - version: 5.28.6 - svelte-check: - specifier: ^4.1.6 - version: 4.1.7(picomatch@4.0.2)(svelte@5.28.6)(typescript@5.8.3) - svelte-json-tree: - specifier: ^2.2.0 - version: 2.2.0(svelte@5.28.6) - svelte-ux: - specifier: 2.0.0-next.13 - version: 2.0.0-next.13(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1))(postcss@8.5.3)(svelte@5.28.6) - svelte2tsx: - specifier: ^0.7.36 - version: 0.7.37(svelte@5.28.6)(typescript@5.8.3) - tailwindcss: - specifier: ^4.1.5 - version: 4.1.6 - tslib: - specifier: ^2.8.1 - version: 2.8.1 - typescript: - specifier: ^5.8.3 - version: 5.8.3 - unist-util-visit: - specifier: ^5.0.0 - version: 5.0.0 - unplugin-icons: - specifier: ^22.1.0 - version: 22.1.0(svelte@5.28.6) - vite: - specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/debug@4.1.13)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) packages: @@ -601,138 +713,432 @@ packages: '@cloudflare/workers-types@4.20250514.0': resolution: {integrity: sha512-zjyqRjoFnAzg7n+mxMxJAbIeOggUXLJTXA8WyT+xGDE+6MF9bSf1ypEULu4DXQQYLf6nDM6NwzLex/8ABTH+Lw==} + '@content-collections/core@0.14.3': + resolution: {integrity: sha512-nbgfRswxudlKDBEO2AXVGGfsFMlenV2iVjNDddQGWD0qk3lBDkTRJy0AqdBvBOccB8/cj95nJyXEVocRRNyUcA==} + peerDependencies: + typescript: ^5.0.2 + + '@content-collections/integrations@0.5.0': + resolution: {integrity: sha512-1en7r518sct0Y8CQ5IsuuBN4uAmtNLaWuxmseW43OxeXyj43Uu2aPBfbopjL4b5xH8WZBdDrrPmikgOl42U46A==} + peerDependencies: + '@content-collections/core': 0.x + + '@content-collections/markdown@0.1.4': + resolution: {integrity: sha512-hUi+O9SDmYmn63aiftSw1KtmSZIjc6ger42rfQobBhPx+3n8kTJsWm1Cs//yU5iIAVRKyLX3qrtlheiOPdJT9w==} + peerDependencies: + '@content-collections/core': 0.x + + '@content-collections/vite@0.2.9': + resolution: {integrity: sha512-Eulni4LnzlvqYjWAOR/MYCQBnwn6/yRwJhQDNgsj5Aj56hwNG/zQMPBLhjxH+O2FGXbBTgYvdQickxwApRRu7w==} + peerDependencies: + '@content-collections/core': ^0.x + vite: ^5 || ^6 || ^7 + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.4': resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.4': resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.4': resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.4': resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.4': resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.4': resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.4': resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.4': resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.4': resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.4': resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.4': resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.4': resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.4': resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.4': resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.4': resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.4': resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.4': resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} cpu: [x64] - os: [linux] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + cpu: [x64] + os: [openbsd] - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] + cpu: [arm64] + os: [openharmony] - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} engines: {node: '>=18'} cpu: [arm64] - os: [openbsd] + os: [openharmony] - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] - os: [openbsd] + os: [sunos] '@esbuild/sunos-x64@0.25.4': resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} @@ -740,24 +1146,66 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.4': resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.4': resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.4': resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -765,21 +1213,24 @@ packages: '@floating-ui/core@1.7.0': resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} - '@floating-ui/core@1.7.2': - resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} '@floating-ui/dom@1.7.0': resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} - '@floating-ui/dom@1.7.2': - resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@fontsource-variable/inter@5.2.8': + resolution: {integrity: sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ==} + '@fortawesome/fontawesome-common-types@6.7.2': resolution: {integrity: sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==} engines: {node: '>=6'} @@ -791,117 +1242,257 @@ packages: '@iconify-json/lucide@1.2.53': resolution: {integrity: sha512-LAdOrHp70uYqf/Q9g13qPafF6qjg4XEez7C/0Np5oLSOzfEF49lpMk3xa6ysYTPoWdPYE0qSc/NP3ebJWg3aJg==} + '@iconify-json/simple-icons@1.2.84': + resolution: {integrity: sha512-v4JVu6xIewGoETD4mm2k6UAdFAbTlY1duw5ZNSxYORfs2yFsHDhoU9Omn/BgrV0nR/ptWkF3ZIr/ZHoYXI/6Jw==} + '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} '@iconify/utils@2.3.0': resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + 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.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -931,20 +1522,25 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@layerstack/svelte-actions@1.0.1-next.12': - resolution: {integrity: sha512-dndWTlYu8b1u6vw2nrO7NssccoACArGG75WoNlyVC13KuENZlWdKE9Q79/wlnbq00NeQMNKMjJwRMsrKQj2ULA==} + '@layerstack/svelte-actions@1.0.1-next.18': + resolution: {integrity: sha512-gxPzCnJ1c9LTfWtRqLUzefCx+k59ZpxDUQ2XB+LokveZQPe7IDSOwHaBOEMlaGoGrtwc3Ft8dSZq+2WT2o9u/g==} + + '@layerstack/svelte-stores@1.0.2-next.18': + resolution: {integrity: sha512-+6cLiKKQIVIsJRiR2cogle40E54zXRm2Wecv4UolUFzCpfUH51DxDAaM1StDk9kXRJhHKNp+aspzS8tb91AzCQ==} - '@layerstack/svelte-stores@1.0.2-next.12': - resolution: {integrity: sha512-XwKyGCXl3+NHQzB3LsPSo6Rb0TjoY3LZzb1Snw09VnOUxvA9skMmVnM8EO3eKFti/8tyOLReddEUA1ygUaT4Lg==} + '@layerstack/svelte-table@1.0.1-next.18': + resolution: {integrity: sha512-xfZETwBYMTRo7aNNfxyYHKKkK8Lv8GXYEQTVCywFvmXNI6l+X/SvCU/0IDpDuQyktUKu38/e/EaIwcH2a17Otg==} - '@layerstack/svelte-table@1.0.1-next.12': - resolution: {integrity: sha512-u5zFdXQWlEJTGXNf52ku6hjyxmjp6ge6GwkW+oecqknY8v0b9d1MfrEw3dGJ4Ap88I0aBIdufmOkd0TTEwiCkQ==} + '@layerstack/tailwind@2.0.0-next.22': + resolution: {integrity: sha512-IRp2yvZE7rPPKIt7rWcfm7PtSUAorpqexP73Set39iRS0POOHFqfD6pbV5If1eHMewAdk3xgEQ5QLoz3CPUiHQ==} - '@layerstack/tailwind@2.0.0-next.15': - resolution: {integrity: sha512-7tqKE3OV7/ybeDOORX++USYYCBJa7IgTya2czFpzbgXGo7CQDVyuv+0J1DggjRcEqhhXQA4MUhgnhcRaZvHxWg==} + '@layerstack/utils@2.0.0-next.18': + resolution: {integrity: sha512-EYILHpfBRYMMEahajInu9C2AXQom5IcAEdtCeucD3QIl/fdDgRbtzn6/8QW9ewumfyNZetdUvitOksmI1+gZYQ==} - '@layerstack/utils@2.0.0-next.12': - resolution: {integrity: sha512-fhGZUlSr3N+D44BYm37WKMGSEFyZBW+dwIqtGU8Cl54mR4TLQ/UwyGhdpgIHyH/x/8q1abE0fP0Dn6ZsrDE3BA==} + '@lucide/svelte@0.577.0': + resolution: {integrity: sha512-0P6mkySd2MapIEgq08tADPmcN4DHndC/02PWwaLkOerXlx5Sv9aT4BxyXLIY+eccr0g/nEyCYiJesqS61YdBZQ==} + peerDependencies: + svelte: ^5 '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -1090,11 +1686,49 @@ packages: cpu: [x64] os: [win32] + '@shikijs/core@4.1.0': + resolution: {integrity: sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.1.0': + resolution: {integrity: sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.1.0': + resolution: {integrity: sha512-axLpjVs45YBvvINa+dJF+NPW+KtFkNXsFr4SDw2BMj9GdeMnGxVB9PQb2xXlJYovslt/nz6giedAyOANkfc7hg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.1.0': + resolution: {integrity: sha512-nwOMruEkbgdZfQ/b8CgpNBVOpvG1k0N5tbmgiFeqsan401+x3ILqlzZJowSla4Agmq4hG2Uf2wh5jLTEhR8VSg==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.1.0': + resolution: {integrity: sha512-zx2/2Uwj2q9X3KSyYREEhXO23xBw5WUhP4orK2lE4r+t9JGITmEe0JH+wPmJhqHpOT2bRRs6lAL945+LDvOAGw==} + engines: {node: '>=20'} + + '@shikijs/themes@4.1.0': + resolution: {integrity: sha512-emCcTnUM7yO2wltYbaxm+yLvcCI4+h8XBKc4KmJ7EZUXoSGjcCHifkI//R4OFit9ewpg7H2/9tjOuXrT2v/Knw==} + engines: {node: '>=20'} + + '@shikijs/transformers@4.1.0': + resolution: {integrity: sha512-YbuOcAA3kwqKDU9YSt00dtFLrY5lBXjKU3dWaMATyEyPSqBm9Jqblk/uVICxz7lcjwAHzYaEvIiMWX3mTpogkA==} + engines: {node: '>=20'} + + '@shikijs/types@4.1.0': + resolution: {integrity: sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@skeletonlabs/tw-plugin@0.4.1': resolution: {integrity: sha512-crrC8BGKis0GNTp7V2HF6mk1ECLUvAxgTTV26LMgt/rV3U6Xd7N7dL5qIL8fE4MTHvpKa1SBsdqsnMbEvATeEg==} peerDependencies: tailwindcss: '>=3.0.0' + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@sveltejs/acorn-typescript@1.0.5': resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} peerDependencies: @@ -1122,6 +1756,12 @@ packages: peerDependencies: svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 + '@sveltejs/svelte-json-tree@2.2.1': + resolution: {integrity: sha512-M8l23/R3y1fI2+RaOzfUzmkysTWWsw/NClUgGpvydl9vXRonPN1/btQQievaNyeWNfUj12tjPfh5yTrXWpaKkg==} + engines: {pnpm: ^9.0.0} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0 + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} @@ -1254,6 +1894,9 @@ packages: '@types/d3-time@3.0.4': resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -1275,18 +1918,15 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.15.18': - resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} - '@types/node@24.0.1': resolution: {integrity: sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==} - '@types/prismjs@1.26.5': - resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} - '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -1296,6 +1936,12 @@ packages: '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + '@vitest/expect@3.1.3': resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==} @@ -1325,6 +1971,9 @@ packages: '@vitest/utils@3.1.3': resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==} + '@webcontainer/api@1.6.4': + resolution: {integrity: sha512-r9sHCXg1FcC1AMgppGwAc0vYWaQhqvg282cnsuPbJEzYnWifAdCVvg+8ngJUEHyHcomhJJp+/zuytite4ITHLw==} + acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} @@ -1381,6 +2030,9 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1410,10 +2062,29 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -1454,6 +2125,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} @@ -1555,6 +2229,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + dedent-js@1.0.1: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} @@ -1569,17 +2246,24 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} devalue@5.1.1: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1605,14 +2289,32 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.25.4: resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} @@ -1647,6 +2349,13 @@ packages: exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -1683,6 +2392,14 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + flat@6.0.1: + resolution: {integrity: sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==} + engines: {node: '>=18'} + hasBin: true + + flexsearch@0.8.212: + resolution: {integrity: sha512-wSyJr1GUWoOOIISRu+X2IXiOcVfg9qqBRyCPRUdLMIGJqPzMo+jMRlvE83t14v1j0dRMEaBbER/adQjp6Du2pw==} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -1695,6 +2412,11 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1722,6 +2444,7 @@ packages: glob@11.0.0: resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true globals@15.15.0: @@ -1735,16 +2458,47 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + hast-util-to-string@3.0.0: resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + human-id@4.1.1: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true @@ -1760,10 +2514,19 @@ packages: immer@10.1.1: resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} + internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} @@ -1775,6 +2538,13 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1787,6 +2557,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -1794,6 +2567,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} @@ -1823,6 +2600,10 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -1909,8 +2690,8 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -1924,6 +2705,9 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -1934,21 +2718,148 @@ packages: resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==} engines: {node: 20 || >=22} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - mdsvex@0.12.6: - resolution: {integrity: sha512-pupx2gzWh3hDtm/iDW4WuCpljmyHbHi34r7ktOqpPGvyiM4MyfNgdJ3qMizXdgCErmvYC9Nn/qyjePy+4ss9Wg==} + mdsx@0.0.7: + resolution: {integrity: sha512-Ftgb6Yq47WMaYoFznJ+jNxnn82sDUvot9Nw2uSaolbkghUV6Le1stDzEVHClaKA1hMJnc+jbMagK/HM7nT6FJg==} peerDependencies: - svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 + svelte: ^5.0.0 merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2018,6 +2929,12 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -2033,6 +2950,10 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -2054,6 +2975,15 @@ packages: package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -2110,6 +3040,20 @@ packages: pkg-types@2.1.1: resolution: {integrity: sha512-eY0QFb6eSwc9+0d/5D2lFFUq+A3n3QNGSy/X2Nvp+6MfzGw2u6EbA7S80actgjY1lkvvI0pqB+a4hioMh443Ew==} + playwright-core@1.60.0: + resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.60.0: + resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} + engines: {node: '>=18'} + hasBin: true + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + postcss-js@4.0.1: resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -2175,9 +3119,6 @@ packages: printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - prism-svelte@0.4.7: - resolution: {integrity: sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==} - prism-svelte@0.5.0: resolution: {integrity: sha512-db91Bf3pRGKDPz1lAqLFSJXeW13mulUJxhycysFpfXV5MIK7RgWWK2E5aPAa71s8TCzQUXxF5JOV42/iOs6QkA==} @@ -2188,6 +3129,9 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} @@ -2202,13 +3146,52 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexparam@3.0.0: resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} engines: {node: '>=8'} + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-pretty-code@0.14.3: + resolution: {integrity: sha512-Cz692FeYusTjT5cfFWLc4r7JhgC3/JlJptgUh4iffBxWxUnWW1oqbWFi7jGCeq00DYUm8yzoTnvpocaYa5x82g==} + engines: {node: '>=18'} + peerDependencies: + shiki: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdc@3.11.0: + resolution: {integrity: sha512-xFrKmGRa+xgsfAZPA2CDaKILSHSOhX2irjJBrrPLxNrxaz2NFI+gXuVjo6Bkbh2vx7fKKTB5S9yyKyIwJh+FsQ==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2254,6 +3237,18 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + runed@0.37.1: + resolution: {integrity: sha512-MeFY73xBW8IueWBm012nNFIGy19WUGPLtknavyUPMpnyt350M47PhGSGrGoSLbidwn+Zlt/O0cp8/OZE3LASWA==} + peerDependencies: + '@sveltejs/kit': ^2.21.0 + svelte: ^5.7.0 + zod: ^4.1.0 + peerDependenciesMeta: + '@sveltejs/kit': + optional: true + zod: + optional: true + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -2261,11 +3256,27 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@7.0.5: + resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} + engines: {node: '>=20.0.0'} + set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} @@ -2273,6 +3284,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2281,6 +3296,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@4.1.0: + resolution: {integrity: sha512-l/ABZPUR5v70jI10EzqfMS/I96vjSGv2y0ihUV+WYFzv0EfvW4s54m0Lg8wCrrL+2IkwBzFTuxkZjPf8b2NX9Q==} + engines: {node: '>=20'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2307,6 +3326,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -2334,6 +3356,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2342,6 +3367,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -2362,11 +3391,6 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 typescript: '>=5.0.0' - svelte-json-tree@2.2.0: - resolution: {integrity: sha512-zcfepTrJ6xhpdgRZEujmiFh+ainRw7HO4Bsoh8PMAsm7fkgUPtnrZi3An8tmCFY8jajYhMrauHsd1S1XTeuiCw==} - peerDependencies: - svelte: ^4.0.0 - svelte-preprocess@6.0.3: resolution: {integrity: sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==} engines: {node: '>= 18.0.0'} @@ -2404,8 +3428,8 @@ packages: typescript: optional: true - svelte-ux@2.0.0-next.13: - resolution: {integrity: sha512-PWugr8yFJDCrxCFOYcHQfySoi6UndguVIn5Xy7VuYtS75I+lW+wB4BRzMd+epOsMVib00yPOiH4XTblQaXIdDQ==} + svelte-ux@2.0.0-next.22: + resolution: {integrity: sha512-5IwO5hmQQ5YytcxpD/I+j0aPXOuqaS86IJG0OO9rmWTP8MkkUrokfJqIaGXRWw0zmacUw6doSJMRmnnkAYoyhA==} peerDependencies: svelte: ^3.56.0 || ^4.0.0 || ^5.0.0 @@ -2436,6 +3460,7 @@ packages: tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} @@ -2485,6 +3510,12 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2493,6 +3524,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.22.3: + resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==} + engines: {node: '>=18.0.0'} + hasBin: true + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -2501,9 +3537,6 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} @@ -2514,26 +3547,29 @@ packages: unenv@2.0.0-rc.15: resolution: {integrity: sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==} - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-builder@4.0.0: + resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -2569,8 +3605,14 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} vite-node@3.1.3: resolution: {integrity: sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==} @@ -2653,6 +3695,9 @@ packages: jsdom: optional: true + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} @@ -2723,6 +3768,15 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + youch@3.3.4: resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} @@ -2738,6 +3792,12 @@ packages: zod@3.25.67: resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@ampproject/remapping@2.3.0': @@ -2930,114 +3990,313 @@ snapshots: '@cloudflare/workers-types@4.20250514.0': {} + '@content-collections/core@0.14.3(typescript@5.8.3)': + dependencies: + '@standard-schema/spec': 1.1.0 + camelcase: 8.0.0 + chokidar: 4.0.3 + esbuild: 0.25.12 + gray-matter: 4.0.3 + p-limit: 6.2.0 + picomatch: 4.0.2 + pluralize: 8.0.0 + serialize-javascript: 7.0.5 + tinyglobby: 0.2.13 + typescript: 5.8.3 + yaml: 2.7.1 + + '@content-collections/integrations@0.5.0(@content-collections/core@0.14.3(typescript@5.8.3))': + dependencies: + '@content-collections/core': 0.14.3(typescript@5.8.3) + + '@content-collections/markdown@0.1.4(@content-collections/core@0.14.3(typescript@5.8.3))': + dependencies: + '@content-collections/core': 0.14.3(typescript@5.8.3) + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + '@content-collections/vite@0.2.9(@content-collections/core@0.14.3(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0))': + dependencies: + '@content-collections/core': 0.14.3(typescript@5.8.3) + '@content-collections/integrations': 0.5.0(@content-collections/core@0.14.3(typescript@5.8.3)) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.25.12': + optional: true + '@esbuild/aix-ppc64@0.25.4': optional: true + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + '@esbuild/android-arm64@0.25.4': optional: true + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + '@esbuild/android-arm@0.25.4': optional: true + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + '@esbuild/android-x64@0.25.4': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + '@esbuild/darwin-arm64@0.25.4': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + '@esbuild/darwin-x64@0.25.4': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + '@esbuild/freebsd-arm64@0.25.4': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + '@esbuild/freebsd-x64@0.25.4': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + '@esbuild/linux-arm64@0.25.4': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + '@esbuild/linux-arm@0.25.4': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + '@esbuild/linux-ia32@0.25.4': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + '@esbuild/linux-loong64@0.25.4': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + '@esbuild/linux-mips64el@0.25.4': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + '@esbuild/linux-ppc64@0.25.4': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + '@esbuild/linux-riscv64@0.25.4': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + '@esbuild/linux-s390x@0.25.4': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + '@esbuild/linux-x64@0.25.4': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-arm64@0.25.4': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + '@esbuild/netbsd-x64@0.25.4': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-arm64@0.25.4': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + '@esbuild/openbsd-x64@0.25.4': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + '@esbuild/sunos-x64@0.25.4': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + '@esbuild/win32-arm64@0.25.4': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + '@esbuild/win32-ia32@0.25.4': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + '@esbuild/win32-x64@0.25.4': optional: true + '@esbuild/win32-x64@0.28.0': + optional: true + '@fastify/busboy@2.1.1': {} '@floating-ui/core@1.7.0': dependencies: '@floating-ui/utils': 0.2.9 - '@floating-ui/core@1.7.2': + '@floating-ui/core@1.7.5': dependencies: - '@floating-ui/utils': 0.2.10 + '@floating-ui/utils': 0.2.11 '@floating-ui/dom@1.7.0': dependencies: '@floating-ui/core': 1.7.0 '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.7.2': + '@floating-ui/dom@1.7.6': dependencies: - '@floating-ui/core': 1.7.2 - '@floating-ui/utils': 0.2.10 + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 - '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.11': {} '@floating-ui/utils@0.2.9': {} + '@fontsource-variable/inter@5.2.8': {} + '@fortawesome/fontawesome-common-types@6.7.2': {} '@fortawesome/free-solid-svg-icons@6.7.2': @@ -3048,6 +4307,10 @@ snapshots: dependencies: '@iconify/types': 2.0.0 + '@iconify-json/simple-icons@1.2.84': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/types@2.0.0': {} '@iconify/utils@2.3.0': @@ -3063,81 +4326,177 @@ snapshots: transitivePeerDependencies: - supports-color + '@img/colour@1.1.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.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': optional: true '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.5': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -3173,40 +4532,40 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@layerstack/svelte-actions@1.0.1-next.12': + '@layerstack/svelte-actions@1.0.1-next.18': dependencies: - '@floating-ui/dom': 1.7.2 - '@layerstack/utils': 2.0.0-next.12 + '@floating-ui/dom': 1.7.6 + '@layerstack/utils': 2.0.0-next.18 d3-scale: 4.0.2 - '@layerstack/svelte-stores@1.0.2-next.12': + '@layerstack/svelte-stores@1.0.2-next.18': dependencies: - '@layerstack/utils': 2.0.0-next.12 - immer: 10.1.1 - lodash-es: 4.17.21 + '@layerstack/utils': 2.0.0-next.18 + immer: 10.2.0 zod: 3.25.67 - '@layerstack/svelte-table@1.0.1-next.12': + '@layerstack/svelte-table@1.0.1-next.18': dependencies: - '@layerstack/svelte-actions': 1.0.1-next.12 - '@layerstack/utils': 2.0.0-next.12 + '@layerstack/svelte-actions': 1.0.1-next.18 + '@layerstack/utils': 2.0.0-next.18 d3-array: 3.2.4 - lodash-es: 4.17.21 - '@layerstack/tailwind@2.0.0-next.15': + '@layerstack/tailwind@2.0.0-next.22': dependencies: - '@layerstack/utils': 2.0.0-next.12 + '@layerstack/utils': 2.0.0-next.18 clsx: 2.1.1 d3-array: 3.2.4 - lodash-es: 4.17.21 tailwind-merge: 3.3.0 - '@layerstack/utils@2.0.0-next.12': + '@layerstack/utils@2.0.0-next.18': dependencies: d3-array: 3.2.4 d3-time: 3.1.0 d3-time-format: 4.1.0 - lodash-es: 4.17.21 + + '@lucide/svelte@0.577.0(svelte@5.28.6)': + dependencies: + svelte: 5.28.6 '@manypkg/find-root@1.1.0': dependencies: @@ -3325,25 +4684,72 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true + '@shikijs/core@4.1.0': + dependencies: + '@shikijs/primitive': 4.1.0 + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + + '@shikijs/primitive@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/themes@4.1.0': + dependencies: + '@shikijs/types': 4.1.0 + + '@shikijs/transformers@4.1.0': + dependencies: + '@shikijs/core': 4.1.0 + '@shikijs/types': 4.1.0 + + '@shikijs/types@4.1.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + '@skeletonlabs/tw-plugin@0.4.1(tailwindcss@4.1.6)': dependencies: tailwindcss: 4.1.6 + '@standard-schema/spec@1.1.0': {} + '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': dependencies: acorn: 8.14.1 - '@sveltejs/adapter-cloudflare@7.0.3(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(wrangler@4.14.4(@cloudflare/workers-types@4.20250514.0))': + '@sveltejs/adapter-cloudflare@7.0.3(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(wrangler@4.14.4(@cloudflare/workers-types@4.20250514.0))': dependencies: '@cloudflare/workers-types': 4.20250514.0 - '@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + '@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) worktop: 0.8.0-next.18 wrangler: 4.14.4(@cloudflare/workers-types@4.20250514.0) - '@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1))': + '@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0))': dependencies: '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) '@types/cookie': 0.6.0 acorn: 8.14.1 cookie: 0.6.0 @@ -3356,7 +4762,7 @@ snapshots: set-cookie-parser: 2.7.1 sirv: 3.0.1 svelte: 5.28.6 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) '@sveltejs/package@2.3.11(svelte@5.28.6)(typescript@5.8.3)': dependencies: @@ -3369,25 +4775,29 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1))': + '@sveltejs/svelte-json-tree@2.2.1(svelte@5.28.6)': + dependencies: + svelte: 5.28.6 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) debug: 4.4.0 svelte: 5.28.6 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.28.6 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) - vitefu: 1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) + vitefu: 1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -3446,7 +4856,7 @@ snapshots: '@tailwindcss/oxide@4.1.6': dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 tar: 7.4.3 optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.1.6 @@ -3470,12 +4880,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.6 - '@tailwindcss/vite@4.1.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1))': + '@tailwindcss/vite@4.1.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.1.6 '@tailwindcss/oxide': 4.1.6 tailwindcss: 4.1.6 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) '@types/cookie@0.6.0': {} @@ -3491,6 +4901,10 @@ snapshots: '@types/d3-time@3.0.4': {} + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/estree@0.0.39': {} '@types/estree@1.0.6': {} @@ -3511,26 +4925,26 @@ snapshots: dependencies: '@types/unist': 3.0.2 - '@types/node@12.20.55': {} + '@types/ms@2.1.0': {} - '@types/node@22.15.18': - dependencies: - undici-types: 6.21.0 + '@types/node@12.20.55': {} '@types/node@24.0.1': dependencies: undici-types: 7.8.0 - '@types/prismjs@1.26.5': {} - '@types/resolve@1.17.1': dependencies: - '@types/node': 22.15.18 + '@types/node': 24.0.1 '@types/unist@2.0.11': {} '@types/unist@3.0.2': {} + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.1': {} + '@vitest/expect@3.1.3': dependencies: '@vitest/spy': 3.1.3 @@ -3538,13 +4952,21 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1))': + '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 3.1.3 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0) + + '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.1.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) '@vitest/pretty-format@3.1.3': dependencies: @@ -3571,6 +4993,8 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 + '@webcontainer/api@1.6.4': {} + acorn-walk@8.3.2: {} acorn@8.14.0: {} @@ -3605,6 +5029,8 @@ snapshots: axobject-query@4.1.0: {} + bail@2.0.2: {} + balanced-match@1.0.2: {} better-path-resolve@1.0.0: @@ -3627,6 +5053,10 @@ snapshots: camelcase-css@2.0.1: {} + camelcase@8.0.0: {} + + ccount@2.0.1: {} + chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -3635,6 +5065,14 @@ snapshots: loupe: 3.1.3 pathval: 2.0.0 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chardet@0.7.0: {} check-error@2.1.1: {} @@ -3675,6 +5113,8 @@ snapshots: color-string: 1.9.1 optional: true + comma-separated-tokens@2.0.3: {} + comment-parser@1.4.1: {} confbox@0.1.8: {} @@ -3758,6 +5198,10 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + dedent-js@1.0.1: {} deep-eql@5.0.2: {} @@ -3766,12 +5210,18 @@ snapshots: defu@6.1.4: {} + dequal@2.0.3: {} + detect-indent@6.1.0: {} - detect-libc@2.0.4: {} + detect-libc@2.1.2: {} devalue@5.1.1: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -3794,8 +5244,39 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@6.0.1: {} + es-module-lexer@1.7.0: {} + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + esbuild@0.25.4: optionalDependencies: '@esbuild/aix-ppc64': 0.25.4 @@ -3824,6 +5305,38 @@ snapshots: '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + optional: true + + escape-string-regexp@5.0.0: {} + esm-env@1.2.2: {} esprima@4.0.1: {} @@ -3848,6 +5361,12 @@ snapshots: exsolve@1.0.7: {} + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -3885,6 +5404,10 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + flat@6.0.1: {} + + flexsearch@0.8.212: {} + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 @@ -3902,6 +5425,9 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -3946,18 +5472,103 @@ snapshots: graceful-fs@4.2.11: {} + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.3.1 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + hast-util-to-string@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + html-void-elements@3.0.0: {} + human-id@4.1.1: {} iconv-lite@0.4.24: @@ -3968,8 +5579,17 @@ snapshots: immer@10.1.1: {} + immer@10.2.0: {} + internmap@2.0.3: {} + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-arrayish@0.3.2: optional: true @@ -3981,6 +5601,10 @@ snapshots: dependencies: hasown: 2.0.2 + is-decimal@2.0.1: {} + + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -3989,10 +5613,14 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-module@1.0.0: {} is-number@7.0.0: {} + is-plain-obj@4.1.0: {} + is-reference@3.0.3: dependencies: '@types/estree': 1.0.7 @@ -4022,6 +5650,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + kind-of@6.0.3: {} + kleur@4.1.5: {} kolorist@1.8.0: {} @@ -4035,92 +5665,411 @@ snapshots: lightningcss-freebsd-x64@1.29.2: optional: true - lightningcss-linux-arm-gnueabihf@1.29.2: - optional: true + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + + lilconfig@3.1.3: + optional: true + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.1 + quansync: 0.2.10 + + locate-character@3.0.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash-es@4.18.1: {} + + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash.startcase@4.4.0: {} + + longest-streak@3.1.0: {} + + loupe@3.1.3: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@11.0.0: {} + + lz-string@1.5.0: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.30: {} + + mdsx@0.0.7(svelte@5.28.6): + dependencies: + esrap: 1.4.6 + hast-util-to-html: 9.0.5 + magic-string: 0.30.17 + mdast-util-to-markdown: 2.1.2 + rehype-stringify: 10.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + svelte: 5.28.6 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + yaml: 2.7.1 + zimmerframe: 1.1.2 + transitivePeerDependencies: + - supports-color + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lightningcss-linux-arm64-gnu@1.29.2: - optional: true + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lightningcss-linux-arm64-musl@1.29.2: - optional: true + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 - lightningcss-linux-x64-gnu@1.29.2: - optional: true + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lightningcss-linux-x64-musl@1.29.2: - optional: true + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - lightningcss-win32-arm64-msvc@1.29.2: - optional: true + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lightningcss-win32-x64-msvc@1.29.2: - optional: true + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lightningcss@1.29.2: + micromark-factory-space@2.0.1: dependencies: - detect-libc: 2.0.4 - optionalDependencies: - lightningcss-darwin-arm64: 1.29.2 - lightningcss-darwin-x64: 1.29.2 - lightningcss-freebsd-x64: 1.29.2 - lightningcss-linux-arm-gnueabihf: 1.29.2 - lightningcss-linux-arm64-gnu: 1.29.2 - lightningcss-linux-arm64-musl: 1.29.2 - lightningcss-linux-x64-gnu: 1.29.2 - lightningcss-linux-x64-musl: 1.29.2 - lightningcss-win32-arm64-msvc: 1.29.2 - lightningcss-win32-x64-msvc: 1.29.2 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - lilconfig@3.1.3: - optional: true + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - local-pkg@1.1.1: + micromark-factory-whitespace@2.0.1: dependencies: - mlly: 1.7.4 - pkg-types: 2.1.1 - quansync: 0.2.10 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - locate-character@3.0.0: {} + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - locate-path@5.0.0: + micromark-util-chunked@2.0.1: dependencies: - p-locate: 4.1.0 + micromark-util-symbol: 2.0.1 - lodash-es@4.17.21: {} + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lodash.castarray@4.4.0: {} + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - lodash.isplainobject@4.0.6: {} + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 - lodash.merge@4.6.2: {} + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - lodash.startcase@4.4.0: {} + micromark-util-encode@2.0.1: {} - loupe@3.1.3: {} + micromark-util-html-tag-name@2.0.1: {} - lower-case@2.0.2: + micromark-util-normalize-identifier@2.0.1: dependencies: - tslib: 2.8.1 - - lru-cache@11.0.0: {} + micromark-util-symbol: 2.0.1 - magic-string@0.30.17: + micromark-util-resolve-all@2.0.1: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + micromark-util-types: 2.0.2 - mdn-data@2.0.30: {} + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - mdsvex@0.12.6(svelte@5.28.6): + micromark-util-subtokenize@2.1.0: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 2.0.11 - prism-svelte: 0.4.7 - prismjs: 1.30.0 - svelte: 5.28.6 - unist-util-visit: 2.0.3 - vfile-message: 2.0.4 + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - merge2@1.4.1: {} + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.1 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color micromatch@4.0.8: dependencies: @@ -4186,6 +6135,14 @@ snapshots: ohash@2.0.11: {} + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -4198,6 +6155,10 @@ snapshots: dependencies: p-try: 2.2.0 + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.2 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -4214,6 +6175,22 @@ snapshots: package-manager-detector@1.3.0: {} + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-numeric-range@1.3.0: {} + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + pascal-case@3.1.2: dependencies: no-case: 3.0.4 @@ -4264,19 +6241,29 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 + playwright-core@1.60.0: {} + + playwright@1.60.0: + dependencies: + playwright-core: 1.60.0 + optionalDependencies: + fsevents: 2.3.2 + + pluralize@8.0.0: {} + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 postcss: 8.5.3 - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.4.2 postcss: 8.5.3 - tsx: 4.19.4 - yaml: 2.7.1 + tsx: 4.22.3 + yaml: 2.9.0 optional: true postcss-selector-parser@6.0.10: @@ -4310,14 +6297,14 @@ snapshots: printable-characters@1.0.42: {} - prism-svelte@0.4.7: {} - prism-svelte@0.5.0: {} prism-themes@1.9.0: {} prismjs@1.30.0: {} + property-information@7.1.0: {} + quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -4331,15 +6318,110 @@ snapshots: readdirp@4.1.2: {} + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + regexparam@3.0.0: {} + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-pretty-code@0.14.3(shiki@4.1.0): + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.0 + parse-numeric-range: 1.3.0 + rehype-parse: 9.0.1 + shiki: 4.1.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + rehype-slug@6.0.0: dependencies: '@types/hast': 3.0.4 github-slugger: 2.0.0 hast-util-heading-rank: 3.0.0 hast-util-to-string: 3.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdc@3.11.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + flat: 6.0.1 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark: 4.0.2 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + scule: 1.3.0 + stringify-entities: 4.0.4 + unified: 11.0.5 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + yaml: 2.9.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 resolve-from@5.0.0: {} @@ -4401,20 +6483,41 @@ snapshots: dependencies: queue-microtask: 1.2.3 + runed@0.37.1(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(zod@4.4.3): + dependencies: + dequal: 2.0.3 + esm-env: 1.2.2 + lz-string: 1.5.0 + svelte: 5.28.6 + optionalDependencies: + '@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) + zod: 4.4.3 + sade@1.8.1: dependencies: mri: 1.2.0 safer-buffer@2.1.2: {} + scule@1.3.0: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + semver@7.7.2: {} + semver@7.8.1: {} + + serialize-javascript@7.0.5: {} + set-cookie-parser@2.7.1: {} sharp@0.33.5: dependencies: color: 4.2.3 - detect-libc: 2.0.4 + detect-libc: 2.1.2 semver: 7.7.2 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 @@ -4438,12 +6541,54 @@ snapshots: '@img/sharp-win32-x64': 0.33.5 optional: true + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + shiki@4.1.0: + dependencies: + '@shikijs/core': 4.1.0 + '@shikijs/engine-javascript': 4.1.0 + '@shikijs/engine-oniguruma': 4.1.0 + '@shikijs/langs': 4.1.0 + '@shikijs/themes': 4.1.0 + '@shikijs/types': 4.1.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -4465,6 +6610,8 @@ snapshots: source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -4495,6 +6642,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -4503,11 +6655,13 @@ snapshots: dependencies: ansi-regex: 6.0.1 + strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} supports-preserve-symlinks-flag@1.0.0: {} - sveld@0.22.1(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1))(postcss@8.5.3): + sveld@0.22.1(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0))(postcss@8.5.3): dependencies: '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.2) acorn: 8.14.0 @@ -4516,7 +6670,7 @@ snapshots: rollup: 2.79.2 rollup-plugin-svelte: 7.2.2(rollup@2.79.2)(svelte@4.2.19) svelte: 4.2.19 - svelte-preprocess: 6.0.3(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1))(postcss@8.5.3)(svelte@4.2.19)(typescript@5.8.3) + svelte-preprocess: 6.0.3(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0))(postcss@8.5.3)(svelte@4.2.19)(typescript@5.8.3) tinyglobby: 0.2.12 typescript: 5.8.3 transitivePeerDependencies: @@ -4542,36 +6696,32 @@ snapshots: transitivePeerDependencies: - picomatch - svelte-json-tree@2.2.0(svelte@5.28.6): - dependencies: - svelte: 5.28.6 - - svelte-preprocess@6.0.3(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1))(postcss@8.5.3)(svelte@4.2.19)(typescript@5.8.3): + svelte-preprocess@6.0.3(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0))(postcss@8.5.3)(svelte@4.2.19)(typescript@5.8.3): dependencies: svelte: 4.2.19 optionalDependencies: postcss: 8.5.3 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0) typescript: 5.8.3 - svelte-ux@2.0.0-next.13(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1))(postcss@8.5.3)(svelte@5.28.6): + svelte-ux@2.0.0-next.22(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0))(postcss@8.5.3)(svelte@5.28.6): dependencies: - '@floating-ui/dom': 1.7.2 - '@layerstack/svelte-actions': 1.0.1-next.12 - '@layerstack/svelte-stores': 1.0.2-next.12 - '@layerstack/svelte-table': 1.0.1-next.12 - '@layerstack/tailwind': 2.0.0-next.15 - '@layerstack/utils': 2.0.0-next.12 - '@mdi/js': 7.4.47 + '@floating-ui/dom': 1.7.6 + '@layerstack/svelte-actions': 1.0.1-next.18 + '@layerstack/svelte-stores': 1.0.2-next.18 + '@layerstack/svelte-table': 1.0.1-next.18 + '@layerstack/tailwind': 2.0.0-next.22 + '@layerstack/utils': 2.0.0-next.18 + '@lucide/svelte': 0.577.0(svelte@5.28.6) d3-array: 3.2.4 d3-scale: 4.0.2 esm-env: 1.2.2 - immer: 10.1.1 - lodash-es: 4.17.21 + immer: 10.2.0 + lodash-es: 4.18.1 prism-svelte: 0.5.0 prism-themes: 1.9.0 prismjs: 1.30.0 - sveld: 0.22.1(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.4)(yaml@2.7.1))(postcss@8.5.3) + sveld: 0.22.1(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.22.3)(yaml@2.9.0))(postcss@8.5.3) svelte: 5.28.6 zod: 3.25.67 transitivePeerDependencies: @@ -4677,6 +6827,10 @@ snapshots: tr46@0.0.3: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + tslib@2.8.1: {} tsx@4.19.4: @@ -4686,12 +6840,17 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsx@4.22.3: + dependencies: + esbuild: 0.28.0 + optionalDependencies: + fsevents: 2.3.3 + optional: true + typescript@5.8.3: {} ufo@1.6.1: {} - undici-types@6.21.0: {} - undici-types@7.8.0: {} undici@5.29.0: @@ -4706,33 +6865,43 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 - unist-util-is@4.1.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-builder@4.0.0: + dependencies: + '@types/unist': 3.0.2 unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 - unist-util-stringify-position@2.0.3: + unist-util-position@5.0.0: dependencies: - '@types/unist': 2.0.11 + '@types/unist': 3.0.2 - unist-util-visit-parents@3.1.1: + unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 + '@types/unist': 3.0.3 unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - unist-util-visit@2.0.3: + unist-util-visit-parents@6.0.2: dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 - unist-util-visit@5.0.0: + unist-util-visit@5.1.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 @@ -4760,18 +6929,49 @@ snapshots: util-deprecate@1.0.2: {} - vfile-message@2.0.4: + vfile-location@5.0.3: dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position: 2.0.3 + '@types/unist': 3.0.2 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile-message: 4.0.3 + + vite-node@3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - vite-node@3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1): + vite-node@3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -4786,7 +6986,7 @@ snapshots: - tsx - yaml - vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1): + vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -4800,16 +7000,72 @@ snapshots: jiti: 2.4.2 lightningcss: 1.29.2 tsx: 4.19.4 - yaml: 2.7.1 + yaml: 2.9.0 + + vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0): + dependencies: + esbuild: 0.25.4 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.40.2 + tinyglobby: 0.2.13 + optionalDependencies: + '@types/node': 24.0.1 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.2 + tsx: 4.22.3 + yaml: 2.9.0 + + vitefu@1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)): + optionalDependencies: + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) - vitefu@1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)): + vitest@3.1.3(@types/debug@4.1.13)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0): + dependencies: + '@vitest/expect': 3.1.3 + '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0)) + '@vitest/pretty-format': 3.1.3 + '@vitest/runner': 3.1.3 + '@vitest/snapshot': 3.1.3 + '@vitest/spy': 3.1.3 + '@vitest/utils': 3.1.3 + chai: 5.2.0 + debug: 4.4.1 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0) + vite-node: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.9.0) + why-is-node-running: 2.3.0 optionalDependencies: - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + '@types/debug': 4.1.13 + '@types/node': 24.0.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - vitest@3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1): + vitest@3.1.3(@types/debug@4.1.13)(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0): dependencies: '@vitest/expect': 3.1.3 - '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1)) + '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/pretty-format': 3.1.3 '@vitest/runner': 3.1.3 '@vitest/snapshot': 3.1.3 @@ -4826,10 +7082,11 @@ snapshots: tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) - vite-node: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) + vite-node: 3.1.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.22.3)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: + '@types/debug': 4.1.13 '@types/node': 24.0.1 transitivePeerDependencies: - jiti @@ -4845,6 +7102,8 @@ snapshots: - tsx - yaml + web-namespaces@2.0.1: {} + web-vitals@4.2.4: {} webidl-conversions@3.0.1: {} @@ -4912,8 +7171,11 @@ snapshots: yallist@5.0.0: {} - yaml@2.7.1: - optional: true + yaml@2.7.1: {} + + yaml@2.9.0: {} + + yocto-queue@1.2.2: {} youch@3.3.4: dependencies: @@ -4928,3 +7190,7 @@ snapshots: zod@3.24.4: {} zod@3.25.67: {} + + zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5aef8cc..59a60bd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,3 @@ packages: - 'packages/*' - - 'sites/*' + - 'docs' diff --git a/sites/docs/mdsvex.config.js b/sites/docs/mdsvex.config.js deleted file mode 100644 index c23fe45..0000000 --- a/sites/docs/mdsvex.config.js +++ /dev/null @@ -1,11 +0,0 @@ -import { fileURLToPath } from 'node:url'; -import { dirname } from 'node:path'; -import slug from 'rehype-slug'; - -export default { - extensions: ['.md', '.svx'], - // https://github.com/pngwn/MDsveX/issues/556 - layout: dirname(fileURLToPath(import.meta.url)) + '/src/docs/Layout.svelte', - rehypePlugins: [slug], - // highlight: false -}; diff --git a/sites/docs/src/docs/Code.svelte b/sites/docs/src/docs/Code.svelte deleted file mode 100644 index 5e01aa5..0000000 --- a/sites/docs/src/docs/Code.svelte +++ /dev/null @@ -1,38 +0,0 @@ - - -
    - {#if source} -
    -
    -          {@html highlightedSource}
    -      
    - -
    - -
    -
    - {/if} -
    diff --git a/sites/docs/src/docs/Header1.svelte b/sites/docs/src/docs/Header1.svelte deleted file mode 100644 index ff25855..0000000 --- a/sites/docs/src/docs/Header1.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/sites/docs/src/docs/Json.svelte b/sites/docs/src/docs/Json.svelte deleted file mode 100644 index 4ff157a..0000000 --- a/sites/docs/src/docs/Json.svelte +++ /dev/null @@ -1,28 +0,0 @@ - - -
    - -
    diff --git a/sites/docs/src/docs/Layout.svelte b/sites/docs/src/docs/Layout.svelte deleted file mode 100644 index d182f8e..0000000 --- a/sites/docs/src/docs/Layout.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/sites/docs/src/docs/Link.svelte b/sites/docs/src/docs/Link.svelte deleted file mode 100644 index e607ded..0000000 --- a/sites/docs/src/docs/Link.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/sites/docs/src/docs/Preview.svelte b/sites/docs/src/docs/Preview.svelte deleted file mode 100644 index ef6d69d..0000000 --- a/sites/docs/src/docs/Preview.svelte +++ /dev/null @@ -1,79 +0,0 @@ - - -
    -
    - -
    - - {#if code && showCode} -
    - -
    - {/if} -
    - -{#if code} - -{/if} - -{#if data} - - - -
    -
    -
    Chart data
    -
    - - {#if copyValue} - - - - {/if} -
    - - - -
    - -
    -
    -
    -{/if} diff --git a/sites/docs/src/lib/plugins/svelte.js b/sites/docs/src/lib/plugins/svelte.js deleted file mode 100644 index bac6911..0000000 --- a/sites/docs/src/lib/plugins/svelte.js +++ /dev/null @@ -1,46 +0,0 @@ -import { format } from 'prettier'; -import typescriptPlugin from 'prettier/plugins/typescript'; -import sveltePlugin from 'prettier-plugin-svelte'; -import Prism from 'prismjs'; -import 'prism-svelte'; - -/** - * Add `code` and `highlightedCode` props to from slot contents - */ -export function codePreview() { - return { - /** - * @param {Object} options - * @param {string} options.content - * @param {string} options.filename - */ - async markup({ content, filename }) { - let code = content; - - // Process ... to `... - const previewMatches = content.match(//g) ?? []; - - for await (const previewMatch of previewMatches) { - const previewContent = previewMatch.match(/([^]*)<\/Preview>/)?.[1] ?? ''; - - const formattedCode = await format(previewContent, { - parser: 'svelte', - plugins: [typescriptPlugin, sveltePlugin], - }); - const highlightedCode = Prism.highlight(formattedCode, Prism.languages.svelte, 'svelte'); - - if (!previewMatch.includes('code=')) { - code = code.replace( - previewMatch, - previewMatch.replace( - ' - import { onMount } from 'svelte'; - import posthog from 'posthog-js'; - import 'prism-themes/themes/prism-vsc-dark-plus.css'; - import { mdiArrowTopRight, mdiDotsVertical, mdiGithub, mdiTwitter } from '@mdi/js'; - - import { - AppBar, - AppLayout, - Button, - Icon, - MenuButton, - QuickSearch, - ThemeInit, - ThemeSelect, - ThemeSwitch, - Tooltip, - // TODO: move/update - settings, - } from 'svelte-ux'; - - import { entries } from '@layerstack/utils'; - import { lgScreen } from '@layerstack/svelte-stores'; - - import NavMenu from './_NavMenu.svelte'; - - import { dev } from '$app/environment'; - import { afterNavigate, goto } from '$app/navigation'; - import { page } from '$app/stores'; - - import './app.css'; - - export let data; - - const baseGh = 'https://github.com/techniq/layerstack'; - $: ghLink = data.pr_id ? `${baseGh}/pull/${data.pr_id}` : baseGh; - const baseTitle = 'LayerStack'; - $: title = data.pr_id ? `🚧 (pr:${data.pr_id}) - ${baseTitle}` : baseTitle; - - settings({ - components: { - AppLayout: { - classes: { - aside: 'border-r', - nav: 'bg-surface-300 py-2', - }, - }, - AppBar: { - classes: - 'bg-primary text-primary-content shadow-md [text-shadow:1px_1px_2px_var(--color-primary-700)]', - }, - NavItem: { - classes: { - root: 'text-sm text-surface-content/70 pl-6 py-2 hover:bg-surface-100/70 relative', - active: - 'text-primary bg-surface-100 font-medium before:absolute before:bg-primary before:rounded-full before:w-1 before:h-2/3 before:left-[6px] shadow-sm z-10', - }, - }, - }, - themes: data.themes, - }); - - let mainEl: HTMLElement; - afterNavigate(() => { - mainEl.scrollTo({ top: 0, behavior: 'instant' }); - }); - - const groups = ['components', 'actions', 'stores', 'utils']; - const quickSearchOptions = entries( - import.meta.glob('./docs/**/+page.(md|svelte)', { query: '?raw', eager: true }) - ) - .flatMap(([file, source]) => { - const url = file.replace('.', '').replace(/\/\+page.(md|svelte)/, ''); - const [_, docs, group, name] = url.split('/'); - return { - label: name, - value: url, - group: group, - }; - }) - .sort((a, b) => groups.indexOf(a.group) - groups.indexOf(b.group)); - - let currentPath = ''; - onMount(() => { - // Delay adding `scroll-smooth` to `` as provides better refresh experience - // and fixes issue where sometimes doesn't scroll far enough - setTimeout(() => { - document.documentElement.classList.add('scroll-smooth'); - }, 0); - - // Posthog analytics - if (!dev) { - const unsubscribePage = page.subscribe(($page) => { - if (currentPath && currentPath !== $page.url.pathname) { - // Page navigated away - // @ts-expect-error - .capture() exists - posthog.capture('$pageleave'); - } - - // Page entered - currentPath = $page.url.pathname; - // @ts-expect-error - .capture() exists - posthog.capture('$pageview'); - }); - - const handleBeforeUnload = () => { - // Hard reloads or browser exit - // @ts-expect-error - .capture() exists - posthog.capture('$pageleave'); - }; - window.addEventListener('beforeunload', handleBeforeUnload); - - return () => { - unsubscribePage(); - window.removeEventListener('beforeunload', handleBeforeUnload); - }; - } - }); - - - - {#if $page.url.origin.includes('https')} - - - - {/if} - - - - - - - - - -
    -
    - - -
    - - - { - // @ts-expect-error - goto(e.detail.value); - }} - classes={{ button: 'max-sm:-mr-3' }} - /> - -
    - -
    - - {#if $lgScreen} - -
    -
    - -
    - -
    -
    diff --git a/sites/docs/src/routes/_NavMenu.svelte b/sites/docs/src/routes/_NavMenu.svelte deleted file mode 100644 index 9c21390..0000000 --- a/sites/docs/src/routes/_NavMenu.svelte +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - -

    svelte-actions

    -{#each actions as item} - -{/each} - -

    svelte-state

    -{#each state as item} - -{/each} - -

    svelte-stores

    -{#each stores as item} - -{/each} - -

    svelte-table

    -{#each table as item} - -{/each} - -

    tailwind

    -{#each tailwind as item} - -{/each} - -

    utils

    -{#each utils as item} - -{/each} diff --git a/sites/docs/src/routes/docs/+layout.svelte b/sites/docs/src/routes/docs/+layout.svelte deleted file mode 100644 index 79be6d2..0000000 --- a/sites/docs/src/routes/docs/+layout.svelte +++ /dev/null @@ -1,306 +0,0 @@ - - -
    - {#if title} -
    -
    Docs
    - -
    - {packageName} -
    -
    - -
    - {title} - {#if status} - - {status} - - {/if} -
    - - {#if description} -
    - {description} -
    - {/if} - -
    - - - - - {#if !hideTableOfContents} - - {/if} -
    - {/if} -
    - -
    - {#if !$xlScreen} - {#key page.route.id} - -
    On this page
    -
    - {/key} - {/if} - -
    -
    - {#if features} - {#key page.route.id} -

    Features

    -
      - {#each features as feature} -
    • - - {@html feature} -
    • - {/each} -
    - {/key} - {/if} - - - - {#if related} -

    Related

    - - {/if} - - {#if api} -

    API

    - - {/if} -
    - - {#if showTableOfContents && $xlScreen} -
    -
    - - On this page -
    - - {#key page.route.id} - - {/key} -
    - {/if} -
    -
    diff --git a/sites/docs/src/routes/docs/svelte-actions/dataBackground/+page.ts b/sites/docs/src/routes/docs/svelte-actions/dataBackground/+page.ts deleted file mode 100644 index 3a65836..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/dataBackground/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-actions/dataBackground.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Set background gradient based on data, similar to Excel. Typically used within a table', - related: ['components/Table', 'svelte-table/actions/table'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/input/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/input/+page.svelte deleted file mode 100644 index 107c303..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/input/+page.svelte +++ /dev/null @@ -1,60 +0,0 @@ - - -

    Usage

    - - - -

    autoFocus Auto focus node when rendered

    - - - - - -

    selectOnFocus Selects the text inside a text node when the node is focused

    - - - - - -

    blurOnEscape Blurs the node when Escape is pressed

    - - - - - -

    autoHeight Automatically resize textarea based on content

    - - - - - -

    debounceEvent Debounce any event (input, change, etc)

    - - - { - // @ts-expect-error - console.log(e.target.value); - }, - timeout: 1000, - }} - class="border" - /> - diff --git a/sites/docs/src/routes/docs/svelte-actions/input/+page.ts b/sites/docs/src/routes/docs/svelte-actions/input/+page.ts deleted file mode 100644 index 0c214a2..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/input/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import source from '$svelte-actions/input.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - related: ['components/TextField', 'components/Input'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/layout/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/layout/+page.svelte deleted file mode 100644 index 4b4c86d..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/layout/+page.svelte +++ /dev/null @@ -1,70 +0,0 @@ - - -

    Usage

    - - - -

    - remainingViewportHeight Set `height` or `max-height` to viewport height excluding node's current viewport top -

    - -
    TODO
    - -

    - remainingViewportWidth Set `width` or `max-width` to viewport width excluding node's current viewport left -

    - -
    TODO
    - -

    - overflow Watch for overflow changes (x or y) and dispatch `overflow` event with amount -

    - - -
    - - -
    -
    { - overflowX = e.detail.overflowX; - overflowY = e.detail.overflowY; - }} - > - {#each { length: overflowItems } as _} -
    Resize the window to see text truncate and watch values
    - {/each} -
    -
    overflowX: {overflowX}
    -
    overflowY: {overflowY}
    -
    diff --git a/sites/docs/src/routes/docs/svelte-actions/layout/+page.ts b/sites/docs/src/routes/docs/svelte-actions/layout/+page.ts deleted file mode 100644 index db71858..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/layout/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import source from '$svelte-actions/layout.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - related: ['components/Overflow'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/mouse/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/mouse/+page.svelte deleted file mode 100644 index b04f558..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/mouse/+page.svelte +++ /dev/null @@ -1,150 +0,0 @@ - - -

    Usage

    - - - -

    - longpress Dispatch event after element has been pressed for a duration of time -

    - - - - {#if longpressed} - Success! Repeat to hide - {/if} - - -

    movable Track mouse position changes from mouse down on node to mouse up

    - - -
    -
    { - coords.stiffness = 1; - coords.damping = 1; - }} - on:move={(e) => { - $coords.x += e.detail.dx; - $coords.y += e.detail.dy; - }} - on:moveend={() => { - coords.stiffness = 0.2; - coords.damping = 0.4; - coords.set({ x: 0, y: 0 }); - }} - style="transform: - translate({$coords.x}px,{$coords.y}px) - rotate({$coords.x * 0.2}deg)" - >
    -
    -
    - -

    With pixel steps / snapping

    - - -
    -
    { - coords.stiffness = 1; - coords.damping = 1; - }} - on:move={(e) => { - $coords.x += e.detail.dx; - $coords.y += e.detail.dy; - }} - on:moveend={() => { - coords.stiffness = 0.2; - coords.damping = 0.4; - coords.set({ x: 0, y: 0 }); - }} - style="transform: - translate({$coords.x}px,{$coords.y}px) - rotate({$coords.x * 0.2}deg)" - >
    -
    -
    - -

    With percentage of parent steps / snapping

    - - -
    -
    { - coords.stiffness = 1; - coords.damping = 1; - }} - on:move={(e) => { - $coords.x += e.detail.dx; - $coords.y += e.detail.dy; - }} - on:moveend={() => { - coords.stiffness = 0.2; - coords.damping = 0.4; - coords.set({ x: 0, y: 0 }); - }} - style="transform: - translate({$coords.x}px,{$coords.y}px) - rotate({$coords.x * 0.2}deg)" - >
    -
    -
    - -

    x-axis only

    - - -
    -
    { - coords.stiffness = 1; - coords.damping = 1; - }} - on:move={(e) => { - $coords.x += e.detail.dx; - $coords.y += e.detail.dy; - }} - on:moveend={() => { - coords.stiffness = 0.2; - coords.damping = 0.4; - coords.set({ x: 0, y: 0 }); - }} - style="transform: - translate({$coords.x}px,{$coords.y}px) - rotate({$coords.x * 0.2}deg) - " - >
    -
    -
    diff --git a/sites/docs/src/routes/docs/svelte-actions/mouse/+page.ts b/sites/docs/src/routes/docs/svelte-actions/mouse/+page.ts deleted file mode 100644 index a4bc974..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/mouse/+page.ts +++ /dev/null @@ -1,11 +0,0 @@ -import source from '$svelte-actions/mouse.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/multi/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/multi/+page.svelte deleted file mode 100644 index c9687aa..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/multi/+page.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

    Usage

    - - diff --git a/sites/docs/src/routes/docs/svelte-actions/multi/+page.ts b/sites/docs/src/routes/docs/svelte-actions/multi/+page.ts deleted file mode 100644 index 23a0414..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/multi/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-actions/multi.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Helper action to handle multiple actions as a single action. Useful for adding actions for custom components', - related: ['components/Button', 'components/Input', 'components/TextField'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/observer/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/observer/+page.svelte deleted file mode 100644 index a2566e7..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/observer/+page.svelte +++ /dev/null @@ -1,138 +0,0 @@ - - -

    Usage

    - - - -

    use:resize

    - -

    Basic

    - - -
    { - console.log(e.detail); - // @ts-expect-error - e.target.innerText = JSON.stringify(e.detail.contentRect, null, 2); - }} - class="resize overflow-auto whitespace-pre outline rounded-sm" - >
    -
    - -

    Full coordinates (using `getBoundingClientRect()`)

    - - -
    { - // @ts-expect-error - e.target.innerText = JSON.stringify(e.target.getBoundingClientRect(), null, 2); - }} - class="resize overflow-auto whitespace-pre outline rounded-sm" - >
    -
    - -

    Setting CSS variable

    - - -
    { - // @ts-expect-error - e.target.style.setProperty('--color', e.detail.contentRect.width % 255); - }} - style:background-color="hsl(var(--color), 100%, 70%)" - class="resize overflow-auto p-2 rounded-sm" - > - Resize and watch me change colors -
    -
    - -

    use:intersection

    - -

    Adding class when fully visible

    - - -
    - {#each { length: 10 } as _} -
    Scroll down
    - {/each} -
    { - if (e.detail.isIntersecting) { - // @ts-expect-error - e.target.classList.add('bg-danger'); - } else { - // @ts-expect-error - e.target.classList.remove('bg-danger'); - } - }} - class="transition-colors duration-500" - > - Watch me scroll away -
    - {#each { length: 10 } as _} -
    Scroll up
    - {/each} -
    -
    - -

    Show header on scroll away

    - - - -
    - {#if showHeader} -
    - Header -
    - {/if} -
    - {#each { length: 10 } as _} -
    Scroll down
    - {/each} -
    { - if (e.detail.isIntersecting) { - // Visible - toggleOff(); - } else { - if (e.detail.boundingClientRect.top < (e.detail.rootBounds?.top ?? 0)) { - // Scrolled off top - toggleOn(); - } else { - // Scrolled off bottom - } - } - }} - > - Watch me scroll away -
    - {#each { length: 10 } as _} -
    Scroll up
    - {/each} -
    -
    -
    -
    - -

    use:mutate

    - -
    TODO
    diff --git a/sites/docs/src/routes/docs/svelte-actions/observer/+page.ts b/sites/docs/src/routes/docs/svelte-actions/observer/+page.ts deleted file mode 100644 index 3278b0c..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/observer/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-actions/observer.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Actions for ResizeObserver, IntersectionObserver, and MutationObserver', - related: ['components/InfiniteScroll', 'components/Lazy'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/popover/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/popover/+page.svelte deleted file mode 100644 index 7be49c1..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/popover/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - -

    Usage

    - - diff --git a/sites/docs/src/routes/docs/svelte-actions/popover/+page.ts b/sites/docs/src/routes/docs/svelte-actions/popover/+page.ts deleted file mode 100644 index f403135..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/popover/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-actions/popover.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Svelte action for floating-ui with simplier setup, especially for middlware', - related: ['components/Popover'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/portal/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/portal/+page.svelte deleted file mode 100644 index 277447a..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/portal/+page.svelte +++ /dev/null @@ -1,125 +0,0 @@ - - -

    Usage

    - - - -

    Examples

    - -

    basic

    - - -
    - - -
    -
    Portal content
    - {#if enabled} - - {/if} -
    -
    -
    -
    - -

    first/sibling .PortalTarget

    - - - -
    - -
    -
    Portal content
    - {#if enabled} - - {/if} -
    -
    -
    -
    -
    - -

    anscestor .PortalTarget

    - - - - -
    -
    - -
    -
    Portal content
    - {#if enabled} - - {/if} -
    -
    -
    -
    -
    - -

    custom target

    - - - -
    - -
    -
    Portal content
    - {#if enabled} - - {/if} -
    -
    -
    -
    -
    - -

    Destroyable

    - - - - - {#if !destroyed} -
    -
    - - -
    -
    Portal content
    - {#if enabled} - - {/if} -
    -
    -
    -
    - {:else} - - {/if} -
    -
    -
    - - diff --git a/sites/docs/src/routes/docs/svelte-actions/portal/+page.ts b/sites/docs/src/routes/docs/svelte-actions/portal/+page.ts deleted file mode 100644 index 2b3da59..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/portal/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-actions/portal.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Render component outside current DOM hierarchy', - related: ['components/Dialog', 'components/Drawer', 'components/Backdrop'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/scroll/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/scroll/+page.svelte deleted file mode 100644 index 845770c..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/scroll/+page.svelte +++ /dev/null @@ -1,155 +0,0 @@ - - -

    Usage

    - - - -

    scrollIntoView Smootly scroll element into center of view

    - - - - {scrolledIndex} -
    - {#each items as item, i} -
    - {item} -
    - {/each} -
    -
    - -
    - Only if needed -
    - - - - {scrolledIndex} -
    - {#each items as item, i} -
    - {item} -
    - {/each} -
    -
    - -

    scrollShadow Add shadows to indicate scrolling available

    - - -
    - {#each items as item, i (item)} -
    {item}
    - {/each} -
    -
    - -

    with flip'd children

    - - -
    - {#each items as item, i (item)} -
    {item}
    - {/each} -
    -
    - -

    Horizontal scroll

    - - -
    -
    - {#each items as item, i} -
    {item}
    - {/each} -
    -
    -
    - -

    Surface shadow on bottom (fade content)

    - - -
    - {#each items as item, i} -
    {item}
    - {/each} -
    -
    - -

    with truncation

    - - -
    - {#each items as item, i} -
    {item} with a really long description
    - {/each} -
    -
    - -

    scrollFade Add shadows to indicate scrolling available

    - - -
    - {#each items as item, i (item)} -
    {item}
    - {/each} -
    -
    - -

    with flip'd children

    - - -
    - {#each items as item, i (item)} -
    {item}
    - {/each} -
    -
    - -

    Horizontal scroll

    - - -
    -
    - {#each items as item, i} -
    {item}
    - {/each} -
    -
    -
    - -
    - -
    diff --git a/sites/docs/src/routes/docs/svelte-actions/scroll/+page.ts b/sites/docs/src/routes/docs/svelte-actions/scroll/+page.ts deleted file mode 100644 index 73c179a..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/scroll/+page.ts +++ /dev/null @@ -1,11 +0,0 @@ -import source from '$svelte-actions/scroll.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/spotlight/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/spotlight/+page.svelte deleted file mode 100644 index 3f3ae43..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/spotlight/+page.svelte +++ /dev/null @@ -1,105 +0,0 @@ - - -

    Usage

    - - - - { - const body = window.document.body; - body.style.setProperty('--x', e.clientX + 'px'); - body.style.setProperty('--y', e.clientY + 'px'); - }} -/> - -

    Using global context and options

    - - -
    - {#each items as item, i} -
    - {item} -
    - {/each} -
    -
    - -

    Using global context and CSS variables

    - - -
    - {#each items as item, i} -
    - {item} -
    - {/each} -
    -
    - -

    Line example

    - - -
    - {#each items as item, i} -
    - {item} -
    - {/each} -
    -
    diff --git a/sites/docs/src/routes/docs/svelte-actions/spotlight/+page.ts b/sites/docs/src/routes/docs/svelte-actions/spotlight/+page.ts deleted file mode 100644 index 482b7d3..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/spotlight/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import source from '$svelte-actions/spotlight.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - related: ['components/Shine'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/sticky/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/sticky/+page.svelte deleted file mode 100644 index 998aa20..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/sticky/+page.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - -

    Usage

    - - - -

    sticky

    - -
    TODO
    - -

    stickyContext

    - -
    TODO
    diff --git a/sites/docs/src/routes/docs/svelte-actions/sticky/+page.ts b/sites/docs/src/routes/docs/svelte-actions/sticky/+page.ts deleted file mode 100644 index 028313a..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/sticky/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import source from '$svelte-actions/sticky.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - related: ['components/Table', 'svelte-table/actions/table'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-actions/styles/+page.svelte b/sites/docs/src/routes/docs/svelte-actions/styles/+page.svelte deleted file mode 100644 index f2f5b45..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/styles/+page.svelte +++ /dev/null @@ -1,86 +0,0 @@ - - -

    Usage

    - - - -

    - computedStyles - Retrieve all computed styles for element. Useful to resolve CSS variable values or working with - `canvas`. - -

    - - -
    -
    (_styles = styles)} - class={cls('size-10 rounded-sm outline-offset-2', backgroundClass)} - style:outline-style={outlineStyle} - >
    - -
    - - - primary - secondary - - - - - - solid - dashed - dotted - - -
    - - - - - - - - -
    -
    - -

    styleProps Reactively set style properties using a single object.

    - - - {@const styles = { '--background': background, '--border': border }} -
    -
    -
    - - -
    -
    -
    diff --git a/sites/docs/src/routes/docs/svelte-actions/styles/+page.ts b/sites/docs/src/routes/docs/svelte-actions/styles/+page.ts deleted file mode 100644 index d455715..0000000 --- a/sites/docs/src/routes/docs/svelte-actions/styles/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import source from '$svelte-actions/styles.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Actions to conveniently work with CSS styles', - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-state/MediaQueryPresets/+page.svelte b/sites/docs/src/routes/docs/svelte-state/MediaQueryPresets/+page.svelte deleted file mode 100644 index cca3abc..0000000 --- a/sites/docs/src/routes/docs/svelte-state/MediaQueryPresets/+page.svelte +++ /dev/null @@ -1,126 +0,0 @@ - - -

    Usage

    - - - import { MediaQueryPresets } from '@layerstack/svelte-state'; - const { mdScreen, print } = new MediaQueryPresets(); - - -{#if mdScreen.current} -
    Only visible on 768px+ screens
    -{/if} - -{#if print.current} -
    Only visable when printing
    -{/if}`} - language="svelte" -/> - -

    Examples

    - - -
    - {#if smScreen.current} - - {:else} - - {/if} - smScreen (640px) - - {#if mdScreen.current} - - {:else} - - {/if} - mdScreen (768px) - - {#if lgScreen.current} - - {:else} - - {/if} - lgScreen (1024px) - - {#if xlScreen.current} - - {:else} - - {/if} - xlScreen (1280px) - - {#if xxlScreen.current} - - {:else} - - {/if} - xxlScreen (1536px) - - {#if screen.current} - - {:else} - - {/if} - screen - - {#if print.current} - - {:else} - - {/if} - print - - {#if dark.current} - - {:else} - - {/if} - dark - - {#if motion.current} - - {:else} - - {/if} - motion - - {#if motionReduce.current} - - {:else} - - {/if} - motionReduce -
    - -
    - current width: {innerWidth}px -
    -
    - - diff --git a/sites/docs/src/routes/docs/svelte-state/MediaQueryPresets/+page.ts b/sites/docs/src/routes/docs/svelte-state/MediaQueryPresets/+page.ts deleted file mode 100644 index 57a5f73..0000000 --- a/sites/docs/src/routes/docs/svelte-state/MediaQueryPresets/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-state/mediaQueryPresets.svelte.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Presets to monitor media query matching, including screen width/height, orientation, print media, prefers dark/light scheme, and prefers reduced motion', - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-state/PaginationState/+page.svelte b/sites/docs/src/routes/docs/svelte-state/PaginationState/+page.svelte deleted file mode 100644 index d65d7ca..0000000 --- a/sites/docs/src/routes/docs/svelte-state/PaginationState/+page.svelte +++ /dev/null @@ -1,28 +0,0 @@ - - -

    Usage

    - - diff --git a/sites/docs/src/routes/docs/svelte-state/PaginationState/+page.ts b/sites/docs/src/routes/docs/svelte-state/PaginationState/+page.ts deleted file mode 100644 index c081072..0000000 --- a/sites/docs/src/routes/docs/svelte-state/PaginationState/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-state/paginationState.svelte.js?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Manage pagination state including current page and page navigation (next/previous/first/last). See related Paginate/Pagination components', - related: ['components/Paginate', 'components/Pagination'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-state/SelectionState/+page.svelte b/sites/docs/src/routes/docs/svelte-state/SelectionState/+page.svelte deleted file mode 100644 index b445b8b..0000000 --- a/sites/docs/src/routes/docs/svelte-state/SelectionState/+page.svelte +++ /dev/null @@ -1,156 +0,0 @@ - - -

    Usage

    - - - -

    Examples

    - -

    Basic

    - - - - - {#each data as d} -
    - selection.toggle(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify(selection.current)} -
    - -

    Initial selection

    - - - - - - - {#each data as d} -
    - selectionInitial.toggle(d.id)} - > - {d.id} - -
    - {/each} - selected: {JSON.stringify(selectionInitial.current)} -
    - -

    Max

    - - - - - {#each data as d} -
    - selectionSet.toggle(d.id)} - disabled={selectionSet.isDisabled(d.id)} - > - {d.id} - -
    - {/each} - selected: {JSON.stringify(selectionSet.current)} -
    - -

    Select all

    - - d.id) });`} - language="javascript" -/> - - - selectionAll.toggleAll()} - > - Select all - - {#each data as d} -
    - selectionAll.toggle(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify(selectionAll.current)} -
    - -

    Single

    - - - - - {#each data as d} -
    - selectionSingle.toggle(d.id)} - > - {d.id} - -
    - {/each} - selected: {JSON.stringify(selectionSingle.current)} -
    - -

    Set selection

    - - - - - - - - {#each data as d} -
    - selectionSet.toggle(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify(selectionSet.current)} -
    diff --git a/sites/docs/src/routes/docs/svelte-state/SelectionState/+page.ts b/sites/docs/src/routes/docs/svelte-state/SelectionState/+page.ts deleted file mode 100644 index 0158feb..0000000 --- a/sites/docs/src/routes/docs/svelte-state/SelectionState/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-state/selectionState.svelte.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Manage item selection state including toggling values, selecting all, and clear or reset selection', - related: ['svelte-state/UniqueState', 'components/MultiSelect', 'components/Selection'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-state/TimerState/+page.svelte b/sites/docs/src/routes/docs/svelte-state/TimerState/+page.svelte deleted file mode 100644 index 046d528..0000000 --- a/sites/docs/src/routes/docs/svelte-state/TimerState/+page.svelte +++ /dev/null @@ -1,54 +0,0 @@ - - -

    Usage

    - - - -({ initial?: T, tick?: (value: T) => {...}, delay?: number, disabled?: boolean })`} - language="javascript" -/> - -

    Examples

    - -

    Default

    - - - - -
    {dateTimer.current}
    - { - // @ts-expect-error - e.target?.checked ? dateTimer.start() : dateTimer.stop(); - }} - /> -
    - -

    Tick count

    - - value + 1 });`} - language="javascript" -/> - - -
    {tickTimer.current}
    - { - // @ts-expect-error - e.target?.checked ? tickTimer.start() : tickTimer.stop(); - }} - /> -
    diff --git a/sites/docs/src/routes/docs/svelte-state/TimerState/+page.ts b/sites/docs/src/routes/docs/svelte-state/TimerState/+page.ts deleted file mode 100644 index 43030ae..0000000 --- a/sites/docs/src/routes/docs/svelte-state/TimerState/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-state/timerState.svelte.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Manage interval ticks, useful for timely updates and countdowns', - related: ['components/Duration', 'components/ScrollingValue'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-state/UniqueState/+page.svelte b/sites/docs/src/routes/docs/svelte-state/UniqueState/+page.svelte deleted file mode 100644 index 3820017..0000000 --- a/sites/docs/src/routes/docs/svelte-state/UniqueState/+page.svelte +++ /dev/null @@ -1,49 +0,0 @@ - - -

    Usage

    - - - -

    Examples

    - -

    Basic

    - - - {#each data as d} -
    - state.toggle(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify([...state.current])} -
    diff --git a/sites/docs/src/routes/docs/svelte-state/UniqueState/+page.ts b/sites/docs/src/routes/docs/svelte-state/UniqueState/+page.ts deleted file mode 100644 index b55a2ee..0000000 --- a/sites/docs/src/routes/docs/svelte-state/UniqueState/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-state/uniqueState.svelte.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'State to manage unique values using `Set` with improves ergonomics and better control of updates', - related: ['svelte-state/SelectionState'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/changeStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/changeStore/+page.md deleted file mode 100644 index 8a7545b..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/changeStore/+page.md +++ /dev/null @@ -1,39 +0,0 @@ - - -

    Usage

    - -```svelte - -``` - -

    Example

    - - - -
    changed: {JSON.stringify($changed)}
    -
    - -

    Pagination

    - - -
    {JSON.stringify($paginationChanged, null, 2)}
    -
    diff --git a/sites/docs/src/routes/docs/svelte-stores/changeStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/changeStore/+page.ts deleted file mode 100644 index 5a5eb86..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/changeStore/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-stores/changeStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Track previous value. Calls onChange callback only after first change (not initial value)', - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/debounceStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/debounceStore/+page.md deleted file mode 100644 index 40ad8a6..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/debounceStore/+page.md +++ /dev/null @@ -1,30 +0,0 @@ - - -

    Usage

    - -```svelte - -``` - -

    Example

    - - - -
    value: {$value}
    -
    debouncedValue: {$debouncedValue}
    -
    diff --git a/sites/docs/src/routes/docs/svelte-stores/debounceStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/debounceStore/+page.ts deleted file mode 100644 index 7f158ef..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/debounceStore/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import source from '$svelte-stores/debounceStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Delay store update until some time has passed since the last update', - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/dirtyStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/dirtyStore/+page.md deleted file mode 100644 index ddefcac..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/dirtyStore/+page.md +++ /dev/null @@ -1,30 +0,0 @@ - - -

    Usage

    - -```svelte - -``` - -

    Example

    - - - -
    isDirty: {$isDirty}
    - -
    diff --git a/sites/docs/src/routes/docs/svelte-stores/dirtyStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/dirtyStore/+page.ts deleted file mode 100644 index 6eeaf2b..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/dirtyStore/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-stores/dirtyStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Track when a store becomes dirty (changed), with ability to reset. Useful to enable an apply button, etc', - related: ['components/MultiSelect'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/fetchStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/fetchStore/+page.ts deleted file mode 100644 index 0d3dcad..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/fetchStore/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-stores/fetchStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Fetch request as a store, with support for body parsing (json, text, arrayBuffer, etc), out of order responses, context configuration, and global errors', - related: ['svelte-stores/graphStore'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/formStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/formStore/+page.md deleted file mode 100644 index 2d7d761..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/formStore/+page.md +++ /dev/null @@ -1,11 +0,0 @@ - - -

    Usage

    - -```js -import { formStore } from '@layerstack/svelte-stores'; -``` diff --git a/sites/docs/src/routes/docs/svelte-stores/formStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/formStore/+page.ts deleted file mode 100644 index 154711c..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/formStore/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-stores/formStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Manage form state via immer draft and zod scehma, with undo history', - related: ['components/Form'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/graphStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/graphStore/+page.md deleted file mode 100644 index f69cb73..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/graphStore/+page.md +++ /dev/null @@ -1,13 +0,0 @@ - - -

    Usage

    - -```js -import { graphStore } from '@layerstack/svelte-stores'; -``` diff --git a/sites/docs/src/routes/docs/svelte-stores/graphStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/graphStore/+page.ts deleted file mode 100644 index c1e8c2b..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/graphStore/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-stores/graphStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: ['GraphQL requests powered by fetchStore'], - related: ['svelte-stores/fetchStore'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/localStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/localStore/+page.md deleted file mode 100644 index 81973d9..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/localStore/+page.md +++ /dev/null @@ -1,24 +0,0 @@ - - -

    Usage

    - -```svelte - -``` - -

    Tests

    - - diff --git a/sites/docs/src/routes/docs/svelte-stores/localStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/localStore/+page.ts deleted file mode 100644 index 30708a0..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/localStore/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import source from '$svelte-stores/localStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Read and write to localStorage with expiration support', - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/mapStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/mapStore/+page.ts deleted file mode 100644 index 42e2825..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/mapStore/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-stores/mapStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Store to wrap `Map` to simplify syncing state (set, delete, clear) with Svelte', - related: ['svelte-stores/uniqueStore'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/matchMedia/+page.md b/sites/docs/src/routes/docs/svelte-stores/matchMedia/+page.md deleted file mode 100644 index 1d45711..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/matchMedia/+page.md +++ /dev/null @@ -1,149 +0,0 @@ - - -

    Usage

    - -

    Full media query

    - -```svelte - - -{#if $isLargeScreen} -
    Only visible on 768px+ screens
    -{/if} -``` - -

    Convenient width media query

    - -```svelte - - -{#if $isLargeScreen} -
    Only visible on 768px+ screens
    -{/if} -``` - -

    Convenient presets (tailwind defaults)

    - -```svelte - - -{#if $mdScreen} -
    Only visible on 768px+ screens
    -{/if} -``` - -```svelte - - -{#if $print} -
    Only visable when printing
    -{/if} -``` - -

    Examples

    - - -
    - {#if $smScreen} - - {:else} - - {/if} - $smScreen (640px) - - {#if $mdScreen} - - {:else} - - {/if} - $mdScreen (768px) - - {#if $lgScreen} - - {:else} - - {/if} - $lgScreen (1024px) - - {#if $xlScreen} - - {:else} - - {/if} - $xlScreen (1280px) - - {#if $xxlScreen} - - {:else} - - {/if} - $xxlScreen (1536px) - - {#if $screen} - - {:else} - - {/if} - $screen - - {#if $print} - - {:else} - - {/if} - $print - - {#if $darkColorScheme} - - {:else} - - {/if} - $darkColorScheme - - {#if $motionReduce} - - {:else} - - {/if} - $motionReduce - -
    - -
    - current width: {innerWidth}px -
    -
    - - diff --git a/sites/docs/src/routes/docs/svelte-stores/matchMedia/+page.ts b/sites/docs/src/routes/docs/svelte-stores/matchMedia/+page.ts deleted file mode 100644 index 617704f..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/matchMedia/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-stores/matchMedia.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Store to monitor media query matching, including screen width/height, orientation, print media, prefers dark/light scheme, and prefers reduced motion', - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/paginationStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/paginationStore/+page.md deleted file mode 100644 index 10f658c..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/paginationStore/+page.md +++ /dev/null @@ -1,11 +0,0 @@ - - -

    Usage

    - -```js -import { paginationStore } from '@layerstack/svelte-stores'; -``` diff --git a/sites/docs/src/routes/docs/svelte-stores/paginationStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/paginationStore/+page.ts deleted file mode 100644 index 0fa0d21..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/paginationStore/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-stores/paginationStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Manage pagination state including current page and page navigation (next/previous/first/last). See related Paginate/Pagination components', - related: ['components/Paginate', 'components/Pagination'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/promiseStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/promiseStore/+page.md deleted file mode 100644 index 7219c21..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/promiseStore/+page.md +++ /dev/null @@ -1,13 +0,0 @@ - - -

    Usage

    - -```js -import { promiseStore } from '@layerstack/svelte-stores'; -``` diff --git a/sites/docs/src/routes/docs/svelte-stores/promiseStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/promiseStore/+page.ts deleted file mode 100644 index 76d2155..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/promiseStore/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import source from '$svelte-stores/promiseStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Wraps a Promise as a store. Useful for SvelteKit streamed data handling', - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/queryParamsStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/queryParamsStore/+page.ts deleted file mode 100644 index e67ef2d..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/queryParamsStore/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-stores/queryParamsStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - title: 'Query params', - description: 'Manage query params as a store, with multiple serialization strategies', - hideUsage: true, - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/selectionStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/selectionStore/+page.md deleted file mode 100644 index 44bd108..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/selectionStore/+page.md +++ /dev/null @@ -1,107 +0,0 @@ - - -

    Usage

    - -

    Max

    - -```js -const selection = selectionStore({ max: 3 }); -``` - - - {#each data as d} -
    - $selection5.toggleSelected(d.id)} disabled={$selection5.isDisabled(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify($selection5.selected)} -
    - -

    Basic

    - -```js -const selection = selectionStore(); -``` - - - {#each data as d} -
    - $selection.toggleSelected(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify($selection.selected)} -
    - -

    Initial selection

    - -```js -const selection2 = selectionStore({ initial: [3, 4, 5] }); -``` - - - {#each data as d} -
    - $selection2.toggleSelected(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify($selection2.selected)} -
    - -

    Select all

    - -```js -const selection3 = selectionStore({ all: data.map((d) => d.id) }); -``` - - - $selection3.toggleAll()}> - Select all - - {#each data as d} -
    - $selection3.toggleSelected(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify($selection3.selected)} -
    - -

    Single

    - -```js -const selection4 = selectionStore({ single: true }); -``` - - - {#each data as d} -
    - $selection4.toggleSelected(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify($selection4.selected)} -
    diff --git a/sites/docs/src/routes/docs/svelte-stores/selectionStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/selectionStore/+page.ts deleted file mode 100644 index d67bb39..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/selectionStore/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-stores/selectionStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Manage item selection state including toggling values, selecting all, and clear or reset selection', - related: ['components/MultiSelect', 'components/Selection'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/timerStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/timerStore/+page.md deleted file mode 100644 index 772b44c..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/timerStore/+page.md +++ /dev/null @@ -1,49 +0,0 @@ - - -

    Usage

    - -```js -const timer = timerStore(); -``` - -```ts -const timer = timerStore({ initial?: T, onTick?: (value: T) => {...}, delay?: number, disabled?: boolean }) -``` - -

    Examples

    - -

    Default

    - -```svelte - -``` - - -
    {$dateTimer}
    - e.target.checked ? dateTimer.start() : dateTimer.stop()} /> -
    - -

    Tick count

    - -```svelte - -``` - - -
    {$tickTimer}
    - e.target.checked ? tickTimer.start() : tickTimer.stop()} /> -
    diff --git a/sites/docs/src/routes/docs/svelte-stores/timerStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/timerStore/+page.ts deleted file mode 100644 index 9995ec8..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/timerStore/+page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import source from '$svelte-stores/timerStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: 'Manage interval ticks, useful for timely updates and countdowns', - related: ['components/Duration', 'components/ScrollingValue'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-stores/uniqueStore/+page.md b/sites/docs/src/routes/docs/svelte-stores/uniqueStore/+page.md deleted file mode 100644 index c58b23c..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/uniqueStore/+page.md +++ /dev/null @@ -1,41 +0,0 @@ - - -

    Usage

    - -```js -import { uniqueStore } from '@layerstack/svelte-stores'; - -const store = uniqueStore(); -// $store.has(value) -// $store.size -// store.add(value); -// store.delete(value); -// store.toggle(value); -``` - -

    Examples

    - -

    Basic

    - - - {#each data as d} -
    - selected.toggle(d.id)}> - {d.id} - -
    - {/each} - selected: {JSON.stringify([...$selected])} -
    diff --git a/sites/docs/src/routes/docs/svelte-stores/uniqueStore/+page.ts b/sites/docs/src/routes/docs/svelte-stores/uniqueStore/+page.ts deleted file mode 100644 index d990bce..0000000 --- a/sites/docs/src/routes/docs/svelte-stores/uniqueStore/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-stores/uniqueStore.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Store to manage unique values using `Set` with improves ergonomics and better control of updates', - related: ['svelte-stores/selectionStore', 'svelte-stores/mapStore', 'components/MultiSelect'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-table/actions/+page.svelte b/sites/docs/src/routes/docs/svelte-table/actions/+page.svelte deleted file mode 100644 index cc3e655..0000000 --- a/sites/docs/src/routes/docs/svelte-table/actions/+page.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

    Usage

    - - diff --git a/sites/docs/src/routes/docs/svelte-table/actions/+page.ts b/sites/docs/src/routes/docs/svelte-table/actions/+page.ts deleted file mode 100644 index b3b135c..0000000 --- a/sites/docs/src/routes/docs/svelte-table/actions/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-table/actions.ts?raw'; -import pageSource from './+page.svelte?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Apply ColumnDef to a table cell . Includes order by, dataBackground, and sticky support', - related: ['components/Table', 'svelte-actions/dataBackground'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/svelte-table/stores/+page.md b/sites/docs/src/routes/docs/svelte-table/stores/+page.md deleted file mode 100644 index 7d49dba..0000000 --- a/sites/docs/src/routes/docs/svelte-table/stores/+page.md +++ /dev/null @@ -1,11 +0,0 @@ - - -

    Usage

    - -```js -import { tableOrderStore } from '@layerstack/svelte-table'; -``` diff --git a/sites/docs/src/routes/docs/svelte-table/stores/+page.ts b/sites/docs/src/routes/docs/svelte-table/stores/+page.ts deleted file mode 100644 index 52deed1..0000000 --- a/sites/docs/src/routes/docs/svelte-table/stores/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import source from '$svelte-table/stores.ts?raw'; -import pageSource from './+page.md?raw'; - -export async function load() { - return { - meta: { - source, - pageSource, - description: - 'Manage table column sorting selection and direction. Compliments Table component', - related: ['svelte-table/actions', 'components/Table'], - }, - }; -} diff --git a/sites/docs/src/routes/docs/tailwind/utils/+page.md b/sites/docs/src/routes/docs/tailwind/utils/+page.md deleted file mode 100644 index 5f1c655..0000000 --- a/sites/docs/src/routes/docs/tailwind/utils/+page.md +++ /dev/null @@ -1,13 +0,0 @@ - - -

    Usage

    - -```svelte - - -