From facb6580f1e104b81e3f4c64f2bd103de3ea6ebe Mon Sep 17 00:00:00 2001 From: Ahmed Yasin Koculu Date: Thu, 8 Oct 2026 03:16:55 +0200 Subject: [PATCH 1/6] Drop astro, wire in purestack latest. --- .gitignore | 3 +- README.md | 2 +- docs-site/.gitignore | 2 +- docs-site/README.md | 41 +- docs-site/astro.config.ts | 67 - .../docs => content}/api/addUnbinder.md | 0 .../content/docs => content}/api/batch.md | 0 .../docs => content}/api/collectRefs.md | 0 .../docs => content}/api/computeMany.md | 0 .../docs => content}/api/computeRef.md | 0 .../content/docs => content}/api/computed.md | 0 .../docs => content}/api/contextRegistry.md | 0 .../content/docs => content}/api/createApp.md | 0 .../{src/content/docs => content}/api/cref.md | 0 .../docs => content}/api/defineComponent.md | 0 .../docs => content}/api/drainUnbind.md | 0 .../content/docs => content}/api/endBatch.md | 0 .../content/docs => content}/api/entangle.md | 0 .../content/docs => content}/api/flatten.md | 0 .../docs => content}/api/getBindData.md | 0 .../{src/content/docs => content}/api/html.md | 0 .../content/docs => content}/api/index.md | 3 +- .../content/docs => content}/api/isDeepRef.md | 0 .../content/docs => content}/api/isRaw.md | 0 .../content/docs => content}/api/isRef.md | 0 .../content/docs => content}/api/markRaw.md | 0 .../content/docs => content}/api/observe.md | 0 .../docs => content}/api/observeMany.md | 0 .../docs => content}/api/observerCount.md | 0 .../content/docs => content}/api/onMounted.md | 0 .../docs => content}/api/onUnmounted.md | 0 .../content/docs => content}/api/pause.md | 0 .../content/docs => content}/api/persist.md | 0 .../{src/content/docs => content}/api/pval.md | 0 .../{src/content/docs => content}/api/raw.md | 0 .../{src/content/docs => content}/api/ref.md | 0 .../docs => content}/api/regorConfig.md | 0 .../docs => content}/api/removeNode.md | 0 .../content/docs => content}/api/resume.md | 0 .../content/docs => content}/api/silence.md | 0 .../{src/content/docs => content}/api/sref.md | 0 .../docs => content}/api/startBatch.md | 0 .../{src/content/docs => content}/api/svg.md | 0 .../docs => content}/api/toFragment.md | 0 .../docs => content}/api/toJsonTemplate.md | 0 .../content/docs => content}/api/trigger.md | 0 .../content/docs => content}/api/unbind.md | 0 .../content/docs => content}/api/unref.md | 0 .../content/docs => content}/api/useScope.md | 0 .../docs => content}/api/warningHandler.md | 0 .../docs => content}/api/watchEffect.md | 0 .../assets/favicon.svg} | 0 docs-site/content/assets/regor-logo.svg | 125 + .../docs => content}/directives/class.md | 0 .../docs => content}/directives/context.md | 0 .../docs => content}/directives/index.md | 3 +- .../content/docs => content}/directives/is.md | 0 .../docs => content}/directives/r-bind.md | 0 .../docs => content}/directives/r-for.md | 0 .../docs => content}/directives/r-html.md | 0 .../docs => content}/directives/r-if.md | 0 .../docs => content}/directives/r-model.md | 0 .../docs => content}/directives/r-on.md | 0 .../docs => content}/directives/r-pre.md | 0 .../docs => content}/directives/r-show.md | 0 .../docs => content}/directives/r-teleport.md | 0 .../docs => content}/directives/r-text.md | 0 .../docs => content}/directives/ref.md | 0 .../docs => content}/directives/style.md | 0 .../docs => content}/getting-started.md | 3 +- .../docs => content}/guide/components.md | 3 +- .../content/docs => content}/guide/index.md | 71 +- .../guide/lifecycle-and-cleanup.md | 3 +- .../docs => content}/guide/mounting.md | 3 +- .../docs => content}/guide/performance.md | 3 +- .../docs => content}/guide/persisted-state.md | 3 +- .../docs => content}/guide/reactivity.md | 3 +- .../docs => content}/guide/templates.md | 3 +- .../docs => content}/guide/troubleshooting.md | 3 +- .../docs => content}/guide/typescript.md | 3 +- docs-site/content/header.mdx | 10 + docs-site/content/index.mdx | 55 + .../{src/content/docs => content}/overview.md | 3 +- docs-site/{public => content}/sample.html | 0 docs-site/content/siteConfig.json | 41 + docs-site/package.json | 13 +- docs-site/src/content/config.ts | 10 - docs-site/src/content/docs/index.mdx | 86 - docs-site/src/env.d.ts | 1 - docs-site/tsconfig.json | 10 - docs-site/yarn.lock | 5990 ++++------------- docs/index.md | 4 +- 92 files changed, 1727 insertions(+), 4843 deletions(-) delete mode 100644 docs-site/astro.config.ts rename docs-site/{src/content/docs => content}/api/addUnbinder.md (100%) rename docs-site/{src/content/docs => content}/api/batch.md (100%) rename docs-site/{src/content/docs => content}/api/collectRefs.md (100%) rename docs-site/{src/content/docs => content}/api/computeMany.md (100%) rename docs-site/{src/content/docs => content}/api/computeRef.md (100%) rename docs-site/{src/content/docs => content}/api/computed.md (100%) rename docs-site/{src/content/docs => content}/api/contextRegistry.md (100%) rename docs-site/{src/content/docs => content}/api/createApp.md (100%) rename docs-site/{src/content/docs => content}/api/cref.md (100%) rename docs-site/{src/content/docs => content}/api/defineComponent.md (100%) rename docs-site/{src/content/docs => content}/api/drainUnbind.md (100%) rename docs-site/{src/content/docs => content}/api/endBatch.md (100%) rename docs-site/{src/content/docs => content}/api/entangle.md (100%) rename docs-site/{src/content/docs => content}/api/flatten.md (100%) rename docs-site/{src/content/docs => content}/api/getBindData.md (100%) rename docs-site/{src/content/docs => content}/api/html.md (100%) rename docs-site/{src/content/docs => content}/api/index.md (98%) rename docs-site/{src/content/docs => content}/api/isDeepRef.md (100%) rename docs-site/{src/content/docs => content}/api/isRaw.md (100%) rename docs-site/{src/content/docs => content}/api/isRef.md (100%) rename docs-site/{src/content/docs => content}/api/markRaw.md (100%) rename docs-site/{src/content/docs => content}/api/observe.md (100%) rename docs-site/{src/content/docs => content}/api/observeMany.md (100%) rename docs-site/{src/content/docs => content}/api/observerCount.md (100%) rename docs-site/{src/content/docs => content}/api/onMounted.md (100%) rename docs-site/{src/content/docs => content}/api/onUnmounted.md (100%) rename docs-site/{src/content/docs => content}/api/pause.md (100%) rename docs-site/{src/content/docs => content}/api/persist.md (100%) rename docs-site/{src/content/docs => content}/api/pval.md (100%) rename docs-site/{src/content/docs => content}/api/raw.md (100%) rename docs-site/{src/content/docs => content}/api/ref.md (100%) rename docs-site/{src/content/docs => content}/api/regorConfig.md (100%) rename docs-site/{src/content/docs => content}/api/removeNode.md (100%) rename docs-site/{src/content/docs => content}/api/resume.md (100%) rename docs-site/{src/content/docs => content}/api/silence.md (100%) rename docs-site/{src/content/docs => content}/api/sref.md (100%) rename docs-site/{src/content/docs => content}/api/startBatch.md (100%) rename docs-site/{src/content/docs => content}/api/svg.md (100%) rename docs-site/{src/content/docs => content}/api/toFragment.md (100%) rename docs-site/{src/content/docs => content}/api/toJsonTemplate.md (100%) rename docs-site/{src/content/docs => content}/api/trigger.md (100%) rename docs-site/{src/content/docs => content}/api/unbind.md (100%) rename docs-site/{src/content/docs => content}/api/unref.md (100%) rename docs-site/{src/content/docs => content}/api/useScope.md (100%) rename docs-site/{src/content/docs => content}/api/warningHandler.md (100%) rename docs-site/{src/content/docs => content}/api/watchEffect.md (100%) rename docs-site/{src/assets/regor-logo.svg => content/assets/favicon.svg} (100%) create mode 100644 docs-site/content/assets/regor-logo.svg rename docs-site/{src/content/docs => content}/directives/class.md (100%) rename docs-site/{src/content/docs => content}/directives/context.md (100%) rename docs-site/{src/content/docs => content}/directives/index.md (98%) rename docs-site/{src/content/docs => content}/directives/is.md (100%) rename docs-site/{src/content/docs => content}/directives/r-bind.md (100%) rename docs-site/{src/content/docs => content}/directives/r-for.md (100%) rename docs-site/{src/content/docs => content}/directives/r-html.md (100%) rename docs-site/{src/content/docs => content}/directives/r-if.md (100%) rename docs-site/{src/content/docs => content}/directives/r-model.md (100%) rename docs-site/{src/content/docs => content}/directives/r-on.md (100%) rename docs-site/{src/content/docs => content}/directives/r-pre.md (100%) rename docs-site/{src/content/docs => content}/directives/r-show.md (100%) rename docs-site/{src/content/docs => content}/directives/r-teleport.md (100%) rename docs-site/{src/content/docs => content}/directives/r-text.md (100%) rename docs-site/{src/content/docs => content}/directives/ref.md (100%) rename docs-site/{src/content/docs => content}/directives/style.md (100%) rename docs-site/{src/content/docs => content}/getting-started.md (99%) rename docs-site/{src/content/docs => content}/guide/components.md (99%) rename docs-site/{src/content/docs => content}/guide/index.md (95%) rename docs-site/{src/content/docs => content}/guide/lifecycle-and-cleanup.md (99%) rename docs-site/{src/content/docs => content}/guide/mounting.md (99%) rename docs-site/{src/content/docs => content}/guide/performance.md (99%) rename docs-site/{src/content/docs => content}/guide/persisted-state.md (99%) rename docs-site/{src/content/docs => content}/guide/reactivity.md (99%) rename docs-site/{src/content/docs => content}/guide/templates.md (99%) rename docs-site/{src/content/docs => content}/guide/troubleshooting.md (99%) rename docs-site/{src/content/docs => content}/guide/typescript.md (99%) create mode 100644 docs-site/content/header.mdx create mode 100644 docs-site/content/index.mdx rename docs-site/{src/content/docs => content}/overview.md (99%) rename docs-site/{public => content}/sample.html (100%) create mode 100644 docs-site/content/siteConfig.json delete mode 100644 docs-site/src/content/config.ts delete mode 100644 docs-site/src/content/docs/index.mdx delete mode 100644 docs-site/src/env.d.ts delete mode 100644 docs-site/tsconfig.json diff --git a/.gitignore b/.gitignore index 977259c..1e74cf7 100644 --- a/.gitignore +++ b/.gitignore @@ -10,9 +10,10 @@ dist/ .yarn/install-state.gz .yarn/sdks/ -.astro .yarn docs-dist +docs-publish +.tmp/ # Perf profiling artifacts *.cpuprofile diff --git a/README.md b/README.md index faf582c..187ad07 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Its template syntax is familiar to Vue users (`r-if`, `r-model`, `r-for`, `r-bin Discover the capabilities of Regor by diving into our comprehensive documentation. Whether you're new to Regor or an experienced user, our documentation provides in-depth insights into its features, API, directives, and more. -Start exploring the [Regor Documentation](https://tenray.io//regor) now to harness the full potential of this powerful UI framework. The documentation sources are located in [docs-site](docs-site/). +Start exploring the [Regor Documentation](https://regor.purestack.studio/) now to harness the full potential of this powerful UI framework. The documentation sources are located in [docs-site](docs-site/), built with PureStack. ## Requirements diff --git a/docs-site/.gitignore b/docs-site/.gitignore index e1d067c..23bf17f 100644 --- a/docs-site/.gitignore +++ b/docs-site/.gitignore @@ -1,7 +1,7 @@ node_modules docs-dist/ +docs-publish/ *.tgz -.astro .yarn # Yarn (Berry) artifacts diff --git a/docs-site/README.md b/docs-site/README.md index e9d4299..12de8f6 100644 --- a/docs-site/README.md +++ b/docs-site/README.md @@ -1,25 +1,34 @@ -# Regor Documentation Site +# Regor documentation -This directory contains the source for Regor's documentation built with [Astro](https://astro.build/) and the Starlight theme. +The source for , built with **PureStack**. -## Requirements +Use Node.js 22 or newer and Yarn 4.9.2. From this directory: -- Node.js 18 or newer -- Yarn (v4) - -## Getting Started - -Install dependencies and start a local server: - -```bash -yarn install +```sh +yarn install --immutable yarn dev ``` -To create a production build: +Open . PureStack watches `content/` and reloads changes. -```bash -yarn build +```sh +yarn build # Clean development build in docs-dist/ +yarn release # Minified deployment artifact in docs-publish/ ``` -The generated site will be written to `docs-dist/`. +`release` prepares static files; it does not upload them. Serve the contents of +`docs-publish/` at the root of `regor.purestack.studio`, with directory-index +support (`/guide/` serves `/guide/index.html`). No `/regor` base path is needed. +DNS and the host's TLS certificate must be configured for that domain separately. + +Write pages in `content/` as Markdown or Regor MDX. Filenames define routes; +`index.md` defines a directory's landing page. Keep API filenames and links in +matching case. Use top-level `order` frontmatter to order navigation. Put static +files in `content/`; they are copied into the output at the same relative path. + +`content/siteConfig.json` configures the logo, light/dark theme, navigation, +table of contents, Pagefind search, syntax highlighting, sitemap, and robots.txt. +The sitemap uses `https://regor.purestack.studio` as its public URL. + +The docs CI workflow builds a release and uploads `docs-publish/` as an artifact. +Regor's npm package is built and published independently from this site. diff --git a/docs-site/astro.config.ts b/docs-site/astro.config.ts deleted file mode 100644 index 1d05d79..0000000 --- a/docs-site/astro.config.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { defineConfig } from 'astro/config' -import starlight from '@astrojs/starlight' - -export default defineConfig({ - site: 'https:/tenray.io/', - base: '/regor/', - trailingSlash: 'ignore', - integrations: [ - starlight({ - title: 'Regor', - social: [ - { - icon: 'github', - label: 'GitHub', - href: 'https://github.com/koculu/regor', - }, - ], - pagefind: true, - }), - ], - outDir: './docs-dist', - markdown: { - remarkPlugins: [], - rehypePlugins: [ - () => { - return (node) => { - return stripMdExtensions(node) - } - }, - ], - }, -}) - -interface Properties { - href?: string -} - -interface Node { - type: string - children?: Node[] - properties?: Properties -} - -function stripMdExtensions(node: Node) { - const href = node?.properties?.href - if (href) { - if (href.endsWith('.md')) { - node.properties!.href = href.slice(0, href.length - 3).toLocaleLowerCase() - } else if (href.endsWith('mdx')) { - node.properties!.href = href.slice(0, href.length - 4).toLocaleLowerCase() - } else { - node.properties!.href = href.toLocaleLowerCase() - } - //Rooted urls should contain base url. - if (href.startsWith('/') && !href.startsWith('/regor')) { - node.properties!.href = '/regor' + node.properties!.href - } - console.log(node.properties!.href) - return - } - - if (Array.isArray(node.children)) { - for (const child of node.children) { - stripMdExtensions(child) - } - } -} diff --git a/docs-site/src/content/docs/api/addUnbinder.md b/docs-site/content/api/addUnbinder.md similarity index 100% rename from docs-site/src/content/docs/api/addUnbinder.md rename to docs-site/content/api/addUnbinder.md diff --git a/docs-site/src/content/docs/api/batch.md b/docs-site/content/api/batch.md similarity index 100% rename from docs-site/src/content/docs/api/batch.md rename to docs-site/content/api/batch.md diff --git a/docs-site/src/content/docs/api/collectRefs.md b/docs-site/content/api/collectRefs.md similarity index 100% rename from docs-site/src/content/docs/api/collectRefs.md rename to docs-site/content/api/collectRefs.md diff --git a/docs-site/src/content/docs/api/computeMany.md b/docs-site/content/api/computeMany.md similarity index 100% rename from docs-site/src/content/docs/api/computeMany.md rename to docs-site/content/api/computeMany.md diff --git a/docs-site/src/content/docs/api/computeRef.md b/docs-site/content/api/computeRef.md similarity index 100% rename from docs-site/src/content/docs/api/computeRef.md rename to docs-site/content/api/computeRef.md diff --git a/docs-site/src/content/docs/api/computed.md b/docs-site/content/api/computed.md similarity index 100% rename from docs-site/src/content/docs/api/computed.md rename to docs-site/content/api/computed.md diff --git a/docs-site/src/content/docs/api/contextRegistry.md b/docs-site/content/api/contextRegistry.md similarity index 100% rename from docs-site/src/content/docs/api/contextRegistry.md rename to docs-site/content/api/contextRegistry.md diff --git a/docs-site/src/content/docs/api/createApp.md b/docs-site/content/api/createApp.md similarity index 100% rename from docs-site/src/content/docs/api/createApp.md rename to docs-site/content/api/createApp.md diff --git a/docs-site/src/content/docs/api/cref.md b/docs-site/content/api/cref.md similarity index 100% rename from docs-site/src/content/docs/api/cref.md rename to docs-site/content/api/cref.md diff --git a/docs-site/src/content/docs/api/defineComponent.md b/docs-site/content/api/defineComponent.md similarity index 100% rename from docs-site/src/content/docs/api/defineComponent.md rename to docs-site/content/api/defineComponent.md diff --git a/docs-site/src/content/docs/api/drainUnbind.md b/docs-site/content/api/drainUnbind.md similarity index 100% rename from docs-site/src/content/docs/api/drainUnbind.md rename to docs-site/content/api/drainUnbind.md diff --git a/docs-site/src/content/docs/api/endBatch.md b/docs-site/content/api/endBatch.md similarity index 100% rename from docs-site/src/content/docs/api/endBatch.md rename to docs-site/content/api/endBatch.md diff --git a/docs-site/src/content/docs/api/entangle.md b/docs-site/content/api/entangle.md similarity index 100% rename from docs-site/src/content/docs/api/entangle.md rename to docs-site/content/api/entangle.md diff --git a/docs-site/src/content/docs/api/flatten.md b/docs-site/content/api/flatten.md similarity index 100% rename from docs-site/src/content/docs/api/flatten.md rename to docs-site/content/api/flatten.md diff --git a/docs-site/src/content/docs/api/getBindData.md b/docs-site/content/api/getBindData.md similarity index 100% rename from docs-site/src/content/docs/api/getBindData.md rename to docs-site/content/api/getBindData.md diff --git a/docs-site/src/content/docs/api/html.md b/docs-site/content/api/html.md similarity index 100% rename from docs-site/src/content/docs/api/html.md rename to docs-site/content/api/html.md diff --git a/docs-site/src/content/docs/api/index.md b/docs-site/content/api/index.md similarity index 98% rename from docs-site/src/content/docs/api/index.md rename to docs-site/content/api/index.md index 0c09c73..58ec25e 100644 --- a/docs-site/src/content/docs/api/index.md +++ b/docs-site/content/api/index.md @@ -1,7 +1,6 @@ --- title: Regor API -sidebar: - order: 6 +order: 6 --- This section contains the function-level reference for Regor. diff --git a/docs-site/src/content/docs/api/isDeepRef.md b/docs-site/content/api/isDeepRef.md similarity index 100% rename from docs-site/src/content/docs/api/isDeepRef.md rename to docs-site/content/api/isDeepRef.md diff --git a/docs-site/src/content/docs/api/isRaw.md b/docs-site/content/api/isRaw.md similarity index 100% rename from docs-site/src/content/docs/api/isRaw.md rename to docs-site/content/api/isRaw.md diff --git a/docs-site/src/content/docs/api/isRef.md b/docs-site/content/api/isRef.md similarity index 100% rename from docs-site/src/content/docs/api/isRef.md rename to docs-site/content/api/isRef.md diff --git a/docs-site/src/content/docs/api/markRaw.md b/docs-site/content/api/markRaw.md similarity index 100% rename from docs-site/src/content/docs/api/markRaw.md rename to docs-site/content/api/markRaw.md diff --git a/docs-site/src/content/docs/api/observe.md b/docs-site/content/api/observe.md similarity index 100% rename from docs-site/src/content/docs/api/observe.md rename to docs-site/content/api/observe.md diff --git a/docs-site/src/content/docs/api/observeMany.md b/docs-site/content/api/observeMany.md similarity index 100% rename from docs-site/src/content/docs/api/observeMany.md rename to docs-site/content/api/observeMany.md diff --git a/docs-site/src/content/docs/api/observerCount.md b/docs-site/content/api/observerCount.md similarity index 100% rename from docs-site/src/content/docs/api/observerCount.md rename to docs-site/content/api/observerCount.md diff --git a/docs-site/src/content/docs/api/onMounted.md b/docs-site/content/api/onMounted.md similarity index 100% rename from docs-site/src/content/docs/api/onMounted.md rename to docs-site/content/api/onMounted.md diff --git a/docs-site/src/content/docs/api/onUnmounted.md b/docs-site/content/api/onUnmounted.md similarity index 100% rename from docs-site/src/content/docs/api/onUnmounted.md rename to docs-site/content/api/onUnmounted.md diff --git a/docs-site/src/content/docs/api/pause.md b/docs-site/content/api/pause.md similarity index 100% rename from docs-site/src/content/docs/api/pause.md rename to docs-site/content/api/pause.md diff --git a/docs-site/src/content/docs/api/persist.md b/docs-site/content/api/persist.md similarity index 100% rename from docs-site/src/content/docs/api/persist.md rename to docs-site/content/api/persist.md diff --git a/docs-site/src/content/docs/api/pval.md b/docs-site/content/api/pval.md similarity index 100% rename from docs-site/src/content/docs/api/pval.md rename to docs-site/content/api/pval.md diff --git a/docs-site/src/content/docs/api/raw.md b/docs-site/content/api/raw.md similarity index 100% rename from docs-site/src/content/docs/api/raw.md rename to docs-site/content/api/raw.md diff --git a/docs-site/src/content/docs/api/ref.md b/docs-site/content/api/ref.md similarity index 100% rename from docs-site/src/content/docs/api/ref.md rename to docs-site/content/api/ref.md diff --git a/docs-site/src/content/docs/api/regorConfig.md b/docs-site/content/api/regorConfig.md similarity index 100% rename from docs-site/src/content/docs/api/regorConfig.md rename to docs-site/content/api/regorConfig.md diff --git a/docs-site/src/content/docs/api/removeNode.md b/docs-site/content/api/removeNode.md similarity index 100% rename from docs-site/src/content/docs/api/removeNode.md rename to docs-site/content/api/removeNode.md diff --git a/docs-site/src/content/docs/api/resume.md b/docs-site/content/api/resume.md similarity index 100% rename from docs-site/src/content/docs/api/resume.md rename to docs-site/content/api/resume.md diff --git a/docs-site/src/content/docs/api/silence.md b/docs-site/content/api/silence.md similarity index 100% rename from docs-site/src/content/docs/api/silence.md rename to docs-site/content/api/silence.md diff --git a/docs-site/src/content/docs/api/sref.md b/docs-site/content/api/sref.md similarity index 100% rename from docs-site/src/content/docs/api/sref.md rename to docs-site/content/api/sref.md diff --git a/docs-site/src/content/docs/api/startBatch.md b/docs-site/content/api/startBatch.md similarity index 100% rename from docs-site/src/content/docs/api/startBatch.md rename to docs-site/content/api/startBatch.md diff --git a/docs-site/src/content/docs/api/svg.md b/docs-site/content/api/svg.md similarity index 100% rename from docs-site/src/content/docs/api/svg.md rename to docs-site/content/api/svg.md diff --git a/docs-site/src/content/docs/api/toFragment.md b/docs-site/content/api/toFragment.md similarity index 100% rename from docs-site/src/content/docs/api/toFragment.md rename to docs-site/content/api/toFragment.md diff --git a/docs-site/src/content/docs/api/toJsonTemplate.md b/docs-site/content/api/toJsonTemplate.md similarity index 100% rename from docs-site/src/content/docs/api/toJsonTemplate.md rename to docs-site/content/api/toJsonTemplate.md diff --git a/docs-site/src/content/docs/api/trigger.md b/docs-site/content/api/trigger.md similarity index 100% rename from docs-site/src/content/docs/api/trigger.md rename to docs-site/content/api/trigger.md diff --git a/docs-site/src/content/docs/api/unbind.md b/docs-site/content/api/unbind.md similarity index 100% rename from docs-site/src/content/docs/api/unbind.md rename to docs-site/content/api/unbind.md diff --git a/docs-site/src/content/docs/api/unref.md b/docs-site/content/api/unref.md similarity index 100% rename from docs-site/src/content/docs/api/unref.md rename to docs-site/content/api/unref.md diff --git a/docs-site/src/content/docs/api/useScope.md b/docs-site/content/api/useScope.md similarity index 100% rename from docs-site/src/content/docs/api/useScope.md rename to docs-site/content/api/useScope.md diff --git a/docs-site/src/content/docs/api/warningHandler.md b/docs-site/content/api/warningHandler.md similarity index 100% rename from docs-site/src/content/docs/api/warningHandler.md rename to docs-site/content/api/warningHandler.md diff --git a/docs-site/src/content/docs/api/watchEffect.md b/docs-site/content/api/watchEffect.md similarity index 100% rename from docs-site/src/content/docs/api/watchEffect.md rename to docs-site/content/api/watchEffect.md diff --git a/docs-site/src/assets/regor-logo.svg b/docs-site/content/assets/favicon.svg similarity index 100% rename from docs-site/src/assets/regor-logo.svg rename to docs-site/content/assets/favicon.svg diff --git a/docs-site/content/assets/regor-logo.svg b/docs-site/content/assets/regor-logo.svg new file mode 100644 index 0000000..7f303e0 --- /dev/null +++ b/docs-site/content/assets/regor-logo.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-site/src/content/docs/directives/class.md b/docs-site/content/directives/class.md similarity index 100% rename from docs-site/src/content/docs/directives/class.md rename to docs-site/content/directives/class.md diff --git a/docs-site/src/content/docs/directives/context.md b/docs-site/content/directives/context.md similarity index 100% rename from docs-site/src/content/docs/directives/context.md rename to docs-site/content/directives/context.md diff --git a/docs-site/src/content/docs/directives/index.md b/docs-site/content/directives/index.md similarity index 98% rename from docs-site/src/content/docs/directives/index.md rename to docs-site/content/directives/index.md index ad55fed..40dfb85 100644 --- a/docs-site/src/content/docs/directives/index.md +++ b/docs-site/content/directives/index.md @@ -1,7 +1,6 @@ --- title: Directives -sidebar: - order: 5 +order: 5 --- Directives are Regor’s runtime template control surface. diff --git a/docs-site/src/content/docs/directives/is.md b/docs-site/content/directives/is.md similarity index 100% rename from docs-site/src/content/docs/directives/is.md rename to docs-site/content/directives/is.md diff --git a/docs-site/src/content/docs/directives/r-bind.md b/docs-site/content/directives/r-bind.md similarity index 100% rename from docs-site/src/content/docs/directives/r-bind.md rename to docs-site/content/directives/r-bind.md diff --git a/docs-site/src/content/docs/directives/r-for.md b/docs-site/content/directives/r-for.md similarity index 100% rename from docs-site/src/content/docs/directives/r-for.md rename to docs-site/content/directives/r-for.md diff --git a/docs-site/src/content/docs/directives/r-html.md b/docs-site/content/directives/r-html.md similarity index 100% rename from docs-site/src/content/docs/directives/r-html.md rename to docs-site/content/directives/r-html.md diff --git a/docs-site/src/content/docs/directives/r-if.md b/docs-site/content/directives/r-if.md similarity index 100% rename from docs-site/src/content/docs/directives/r-if.md rename to docs-site/content/directives/r-if.md diff --git a/docs-site/src/content/docs/directives/r-model.md b/docs-site/content/directives/r-model.md similarity index 100% rename from docs-site/src/content/docs/directives/r-model.md rename to docs-site/content/directives/r-model.md diff --git a/docs-site/src/content/docs/directives/r-on.md b/docs-site/content/directives/r-on.md similarity index 100% rename from docs-site/src/content/docs/directives/r-on.md rename to docs-site/content/directives/r-on.md diff --git a/docs-site/src/content/docs/directives/r-pre.md b/docs-site/content/directives/r-pre.md similarity index 100% rename from docs-site/src/content/docs/directives/r-pre.md rename to docs-site/content/directives/r-pre.md diff --git a/docs-site/src/content/docs/directives/r-show.md b/docs-site/content/directives/r-show.md similarity index 100% rename from docs-site/src/content/docs/directives/r-show.md rename to docs-site/content/directives/r-show.md diff --git a/docs-site/src/content/docs/directives/r-teleport.md b/docs-site/content/directives/r-teleport.md similarity index 100% rename from docs-site/src/content/docs/directives/r-teleport.md rename to docs-site/content/directives/r-teleport.md diff --git a/docs-site/src/content/docs/directives/r-text.md b/docs-site/content/directives/r-text.md similarity index 100% rename from docs-site/src/content/docs/directives/r-text.md rename to docs-site/content/directives/r-text.md diff --git a/docs-site/src/content/docs/directives/ref.md b/docs-site/content/directives/ref.md similarity index 100% rename from docs-site/src/content/docs/directives/ref.md rename to docs-site/content/directives/ref.md diff --git a/docs-site/src/content/docs/directives/style.md b/docs-site/content/directives/style.md similarity index 100% rename from docs-site/src/content/docs/directives/style.md rename to docs-site/content/directives/style.md diff --git a/docs-site/src/content/docs/getting-started.md b/docs-site/content/getting-started.md similarity index 99% rename from docs-site/src/content/docs/getting-started.md rename to docs-site/content/getting-started.md index 9a42729..4c6855e 100644 --- a/docs-site/src/content/docs/getting-started.md +++ b/docs-site/content/getting-started.md @@ -1,7 +1,6 @@ --- title: Getting Started -sidebar: - order: 3 +order: 3 --- Regor binds runtime behavior directly to DOM you already have, or to template diff --git a/docs-site/src/content/docs/guide/components.md b/docs-site/content/guide/components.md similarity index 99% rename from docs-site/src/content/docs/guide/components.md rename to docs-site/content/guide/components.md index baf3628..e26de68 100644 --- a/docs-site/src/content/docs/guide/components.md +++ b/docs-site/content/guide/components.md @@ -1,7 +1,6 @@ --- title: Components -sidebar: - order: 30 +order: 30 --- This guide documents how Regor components work in runtime, based on current implementation and tests. diff --git a/docs-site/src/content/docs/guide/index.md b/docs-site/content/guide/index.md similarity index 95% rename from docs-site/src/content/docs/guide/index.md rename to docs-site/content/guide/index.md index 5472f35..0467212 100644 --- a/docs-site/src/content/docs/guide/index.md +++ b/docs-site/content/guide/index.md @@ -1,37 +1,36 @@ ---- -title: Guide -sidebar: - order: 4 ---- - -The Guide explains how Regor behaves in real runtime usage, with patterns that map directly to production code. - -## Guide Map - -1. [Reactivity](/guide/reactivity) - Core primitives (`ref`, `sref`, computed, observers), update semantics, and state design. - -2. [Templates and Expressions](/guide/templates) +--- +title: Guide +order: 4 +--- + +The Guide explains how Regor behaves in real runtime usage, with patterns that map directly to production code. + +## Guide Map + +1. [Reactivity](/guide/reactivity) + Core primitives (`ref`, `sref`, computed, observers), update semantics, and state design. + +2. [Templates and Expressions](/guide/templates) Interpolation behavior, parser/evaluator capabilities, and template authoring patterns. - -3. [Components](/guide/components) - Component creation, input channels (`:x`, `r-bind:x`, `:context`, `r-context`), slots, and inherit behavior. - -4. [TypeScript](/guide/typescript) - Strong typing patterns for app contexts, class-based contexts, and `ComponentHead`. - -5. [Lifecycle and Cleanup](/guide/lifecycle-and-cleanup) - Mounted/unmounted hooks, `unmount` vs `unbind`, and `drainUnbind` usage. - -6. [Mounting](/guide/mounting) - Static-first + dynamic islands and existing-markup binding patterns. - -7. [Persisted State](/guide/persisted-state) - `persist(...)` patterns for durable reactive state. - -8. [Performance](/guide/performance) - Benchmark methodology, bottleneck analysis, and optimization workflow. - -9. [Troubleshooting](/guide/troubleshooting) - Symptom -> cause -> fix guide for common runtime issues. - + +3. [Components](/guide/components) + Component creation, input channels (`:x`, `r-bind:x`, `:context`, `r-context`), slots, and inherit behavior. + +4. [TypeScript](/guide/typescript) + Strong typing patterns for app contexts, class-based contexts, and `ComponentHead`. + +5. [Lifecycle and Cleanup](/guide/lifecycle-and-cleanup) + Mounted/unmounted hooks, `unmount` vs `unbind`, and `drainUnbind` usage. + +6. [Mounting](/guide/mounting) + Static-first + dynamic islands and existing-markup binding patterns. + +7. [Persisted State](/guide/persisted-state) + `persist(...)` patterns for durable reactive state. + +8. [Performance](/guide/performance) + Benchmark methodology, bottleneck analysis, and optimization workflow. + +9. [Troubleshooting](/guide/troubleshooting) + Symptom -> cause -> fix guide for common runtime issues. + diff --git a/docs-site/src/content/docs/guide/lifecycle-and-cleanup.md b/docs-site/content/guide/lifecycle-and-cleanup.md similarity index 99% rename from docs-site/src/content/docs/guide/lifecycle-and-cleanup.md rename to docs-site/content/guide/lifecycle-and-cleanup.md index 2d46ac3..9278f9f 100644 --- a/docs-site/src/content/docs/guide/lifecycle-and-cleanup.md +++ b/docs-site/content/guide/lifecycle-and-cleanup.md @@ -1,7 +1,6 @@ --- title: Lifecycle and Cleanup -sidebar: - order: 50 +order: 50 --- This page describes Regor lifecycle and teardown behavior from the actual runtime flow. diff --git a/docs-site/src/content/docs/guide/mounting.md b/docs-site/content/guide/mounting.md similarity index 99% rename from docs-site/src/content/docs/guide/mounting.md rename to docs-site/content/guide/mounting.md index c19a84b..3a1cf3b 100644 --- a/docs-site/src/content/docs/guide/mounting.md +++ b/docs-site/content/guide/mounting.md @@ -1,7 +1,6 @@ --- title: Mounting -sidebar: - order: 60 +order: 60 --- Regor can mount directly on existing DOM and compose with many rendering/runtime strategies. diff --git a/docs-site/src/content/docs/guide/performance.md b/docs-site/content/guide/performance.md similarity index 99% rename from docs-site/src/content/docs/guide/performance.md rename to docs-site/content/guide/performance.md index 8ce0dfe..1ff92e0 100644 --- a/docs-site/src/content/docs/guide/performance.md +++ b/docs-site/content/guide/performance.md @@ -1,7 +1,6 @@ --- title: Performance -sidebar: - order: 80 +order: 80 --- This guide shows how to measure Regor performance with stable, repeatable workflows: diff --git a/docs-site/src/content/docs/guide/persisted-state.md b/docs-site/content/guide/persisted-state.md similarity index 99% rename from docs-site/src/content/docs/guide/persisted-state.md rename to docs-site/content/guide/persisted-state.md index 617d631..863b97f 100644 --- a/docs-site/src/content/docs/guide/persisted-state.md +++ b/docs-site/content/guide/persisted-state.md @@ -1,7 +1,6 @@ --- title: Persisted State -sidebar: - order: 70 +order: 70 --- `persist(...)` is one of Regor’s highest-leverage features: diff --git a/docs-site/src/content/docs/guide/reactivity.md b/docs-site/content/guide/reactivity.md similarity index 99% rename from docs-site/src/content/docs/guide/reactivity.md rename to docs-site/content/guide/reactivity.md index e405e5f..b1ec014 100644 --- a/docs-site/src/content/docs/guide/reactivity.md +++ b/docs-site/content/guide/reactivity.md @@ -1,7 +1,6 @@ --- title: Reactivity -sidebar: - order: 10 +order: 10 --- This page describes Regor reactivity based on actual runtime behavior. diff --git a/docs-site/src/content/docs/guide/templates.md b/docs-site/content/guide/templates.md similarity index 99% rename from docs-site/src/content/docs/guide/templates.md rename to docs-site/content/guide/templates.md index 3ef2ff0..7b4dc91 100644 --- a/docs-site/src/content/docs/guide/templates.md +++ b/docs-site/content/guide/templates.md @@ -1,7 +1,6 @@ --- title: Templates and Expressions -sidebar: - order: 20 +order: 20 --- This page describes how Regor turns templates into live bindings, and what expression syntax is supported in runtime. diff --git a/docs-site/src/content/docs/guide/troubleshooting.md b/docs-site/content/guide/troubleshooting.md similarity index 99% rename from docs-site/src/content/docs/guide/troubleshooting.md rename to docs-site/content/guide/troubleshooting.md index 086601c..c4abe9a 100644 --- a/docs-site/src/content/docs/guide/troubleshooting.md +++ b/docs-site/content/guide/troubleshooting.md @@ -1,7 +1,6 @@ --- title: Troubleshooting -sidebar: - order: 90 +order: 90 --- Use this page as a symptom -> cause -> fix reference based on current Regor runtime behavior. diff --git a/docs-site/src/content/docs/guide/typescript.md b/docs-site/content/guide/typescript.md similarity index 99% rename from docs-site/src/content/docs/guide/typescript.md rename to docs-site/content/guide/typescript.md index cf1fbf8..ec58910 100644 --- a/docs-site/src/content/docs/guide/typescript.md +++ b/docs-site/content/guide/typescript.md @@ -1,7 +1,6 @@ --- title: TypeScript -sidebar: - order: 40 +order: 40 --- Regor has strong TypeScript support across app context, component context, and component head typing. diff --git a/docs-site/content/header.mdx b/docs-site/content/header.mdx new file mode 100644 index 0000000..5f33233 --- /dev/null +++ b/docs-site/content/header.mdx @@ -0,0 +1,10 @@ + + + diff --git a/docs-site/content/index.mdx b/docs-site/content/index.mdx new file mode 100644 index 0000000..83b7037 --- /dev/null +++ b/docs-site/content/index.mdx @@ -0,0 +1,55 @@ +--- +title: Regor +description: Direct DOM binding, precise reactivity, and TypeScript-native workflows for real applications. +template: doc +order: 1 +layout: + showToc: false +--- + +# Reactive UI without framework lock-in + +Regor gives you direct DOM binding, precise reactivity primitives, and +TypeScript-native workflows for real applications. + + + Start building + Read the guide + GitHub + + +Regor is a modern reactive UI library for teams that want **power and control**. +Bind existing markup, build components in TypeScript, and adopt reactivity at +your own pace. + + + + + + + + + + + + +## Start here + +- [Overview](/overview/) - Core philosophy, strengths, and tradeoffs. +- [Getting started](/getting-started/) - Install and ship your first Regor app. +- [Guide](/guide/) - Reactivity, templates, components, lifecycle, and troubleshooting. +- [Directives](/directives/) - Syntax, behavior, and practical usage patterns. +- [API reference](/api/) - Complete API index by category. +- [Performance guide](/guide/performance/) - Benchmark and optimize with confidence. + +## Regor and PureStack + +This documentation is built with [PureStack](https://purestack.studio/), which +uses Regor for its components and browser behavior. Write Markdown for content +and use Regor MDX when a page needs components or interactivity. + +## Community and contribution + +- [GitHub Discussions](https://github.com/koculu/regor/discussions) +- [Contributing guide](https://github.com/koculu/regor/blob/main/.github/CONTRIBUTING.md) +- [Issue tracker](https://github.com/koculu/regor/issues) diff --git a/docs-site/src/content/docs/overview.md b/docs-site/content/overview.md similarity index 99% rename from docs-site/src/content/docs/overview.md rename to docs-site/content/overview.md index 2d51bc7..76182c4 100644 --- a/docs-site/src/content/docs/overview.md +++ b/docs-site/content/overview.md @@ -1,7 +1,6 @@ --- title: Overview -sidebar: - order: 2 +order: 2 --- Regor is a reactive UI library designed for engineers who want: diff --git a/docs-site/public/sample.html b/docs-site/content/sample.html similarity index 100% rename from docs-site/public/sample.html rename to docs-site/content/sample.html diff --git a/docs-site/content/siteConfig.json b/docs-site/content/siteConfig.json new file mode 100644 index 0000000..2214e61 --- /dev/null +++ b/docs-site/content/siteConfig.json @@ -0,0 +1,41 @@ +{ + "$schema": "../node_modules/@purestack/ts-ssg/schema/siteConfig.schema.json", + "siteTitle": "Regor", + "logo": { + "brand": "Regor", + "imageSrc": "/assets/regor-logo.svg", + "href": "/", + "ariaLabel": "Regor home" + }, + "style": { + "themes": ["light", "dark"], + "theme": { + "skin": "standard", + "presets": ["blue"] + } + }, + "navigation": { + "mode": "auto", + "maxDepth": 3, + "includeIndex": true, + "sortBy": "order" + }, + "pageToc": { "enabled": true }, + "pagefind": { "enabled": true }, + "sitemap": { + "enabled": true, + "baseUrl": "https://regor.purestack.studio", + "robots": { + "enabled": true, + "host": "regor.purestack.studio" + } + }, + "preview": { + "title": "Regor", + "description": "Direct DOM binding, precise reactivity, and TypeScript-native workflows for real applications.", + "siteName": "Regor" + }, + "mdx": { "highlighter": "shiki" }, + "outDir": "../dist/web-dev", + "publishDir": "../dist/web" +} diff --git a/docs-site/package.json b/docs-site/package.json index c574063..346f578 100644 --- a/docs-site/package.json +++ b/docs-site/package.json @@ -3,13 +3,12 @@ "private": true, "type": "module", "scripts": { - "dev": "astro dev", - "build": "astro build", - "preview": "astro preview" + "serve": "purestack serve --content ./content", + "build": "purestack build --content ./content --clean", + "release": "purestack publish --content ./content" }, "dependencies": { - "@astrojs/starlight": "^0.34.3", - "astro": "^5.9.2", - "glob": "^11.0.3" - } + "purestack": "1.1.7" + }, + "packageManager": "yarn@4.9.2" } diff --git a/docs-site/src/content/config.ts b/docs-site/src/content/config.ts deleted file mode 100644 index 684958b..0000000 --- a/docs-site/src/content/config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineCollection } from 'astro:content' -import { docsSchema } from '@astrojs/starlight/schema' -import { docsLoader } from '@astrojs/starlight/loaders' - -export const collections = { - docs: defineCollection({ - schema: docsSchema({}), - loader: docsLoader(), - }), -} diff --git a/docs-site/src/content/docs/index.mdx b/docs-site/src/content/docs/index.mdx deleted file mode 100644 index 51f8be1..0000000 --- a/docs-site/src/content/docs/index.mdx +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Regor -template: splash -sidebar: - order: 1 -hero: - title: "Reactive UI without framework lock-in" - tagline: | - Regor gives you direct DOM binding, precise reactivity primitives, - and TypeScript-native workflows for real applications. - image: - file: ../../assets/regor-logo.svg - actions: - - text: "Start Building" - icon: right-arrow - link: ./getting-started - - text: "Read the Guide" - link: ./guide - - text: "GitHub" - icon: external - variant: minimal - link: https://github.com/koculu/regor - attrs: - target: _blank ---- - -import { CardGrid, Card, LinkCard } from '@astrojs/starlight/components'; - - -Regor is a modern reactive UI library for teams that want **power and control** instead of rigid framework constraints. - -It supports: - -1. Direct DOM binding over existing markup (no Virtual DOM dependency). -2. Fine-grained reactive primitives (`ref`, `sref`, `computed`, `observe`, `batch`, `pause`, `resume`, `entangle`). -3. Component and context models that stay flexible in mixed rendering stacks. -4. Build-less and CSP-friendly runtime workflows when deployment constraints require them. - - - - Bind dynamic behavior directly on existing DOM. Regor does not require full-template ownership. - - - - Use `ref`, `sref`, `computed`, `watchEffect`, observers, batch updates, and pause/resume controls to model state precisely. - - - - Rich directives for lists, conditionals, events, text/HTML binding, forms, dynamic components, and attribute orchestration. - - - - Build components in TypeScript with practical context behavior and dynamic composition. - - - - Use npm packages, CDN ESM, or global build. Choose the workflow that fits your deployment model. - - - - Stay close to the DOM and optimize hot paths with full visibility instead of opaque rendering internals. - - - - Adopt Regor incrementally in legacy or mixed-stack applications, including static-first pages with dynamic islands. - - - - Integrates cleanly with external DOM logic and micro-frontend environments. - - - -## Start Here - - - - - - - - -## Community and Contribution - - - - diff --git a/docs-site/src/env.d.ts b/docs-site/src/env.d.ts deleted file mode 100644 index f964fe0..0000000 --- a/docs-site/src/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/docs-site/tsconfig.json b/docs-site/tsconfig.json deleted file mode 100644 index df53d35..0000000 --- a/docs-site/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "astro/tsconfigs/strict", - "include": [ - ".astro/types.d.ts", - "**/*" - ], - "exclude": [ - "dist" - ] -} \ No newline at end of file diff --git a/docs-site/yarn.lock b/docs-site/yarn.lock index 2ee8033..bd2d6fb 100644 --- a/docs-site/yarn.lock +++ b/docs-site/yarn.lock @@ -5,4824 +5,2096 @@ __metadata: version: 8 cacheKey: 10c0 -"@astrojs/compiler@npm:^2.12.2": - version: 2.12.2 - resolution: "@astrojs/compiler@npm:2.12.2" - checksum: 10c0/3e63055117010247a9fa6d2c8de1263b3e6f3c089bb6b3cddea76bf3eea6b62b77359c89950e6d048d860874a79521ca2c0cc734af1ee59c7568e01e76a4df10 - languageName: node - linkType: hard - -"@astrojs/internal-helpers@npm:0.6.1": - version: 0.6.1 - resolution: "@astrojs/internal-helpers@npm:0.6.1" - checksum: 10c0/2f03ea5d8a673f74f153ea4fb3ec3e50399093f4bea0e2aaebf6ef3ae336be3f7dfb13abfdffe1953814b5b870d59d641937d271822881778600fe47d99e7ef3 - languageName: node - linkType: hard - -"@astrojs/markdown-remark@npm:6.3.2, @astrojs/markdown-remark@npm:^6.3.1": - version: 6.3.2 - resolution: "@astrojs/markdown-remark@npm:6.3.2" - dependencies: - "@astrojs/internal-helpers": "npm:0.6.1" - "@astrojs/prism": "npm:3.3.0" - github-slugger: "npm:^2.0.0" - hast-util-from-html: "npm:^2.0.3" - hast-util-to-text: "npm:^4.0.2" - import-meta-resolve: "npm:^4.1.0" - js-yaml: "npm:^4.1.0" - mdast-util-definitions: "npm:^6.0.0" - rehype-raw: "npm:^7.0.0" - rehype-stringify: "npm:^10.0.1" - remark-gfm: "npm:^4.0.1" - remark-parse: "npm:^11.0.0" - remark-rehype: "npm:^11.1.2" - remark-smartypants: "npm:^3.0.2" - shiki: "npm:^3.2.1" - smol-toml: "npm:^1.3.1" - unified: "npm:^11.0.5" - unist-util-remove-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - unist-util-visit-parents: "npm:^6.0.1" - vfile: "npm:^6.0.3" - checksum: 10c0/e4e9926286def70548505d49333c0b80624e36dad035d0b943ef4d56211530784a8317f92277c702b6a47b68dea0f9afd154aacf2c6b8361177a51ac3c8b20bc - languageName: node - linkType: hard - -"@astrojs/mdx@npm:^4.2.3": - version: 4.3.0 - resolution: "@astrojs/mdx@npm:4.3.0" - dependencies: - "@astrojs/markdown-remark": "npm:6.3.2" - "@mdx-js/mdx": "npm:^3.1.0" - acorn: "npm:^8.14.1" - es-module-lexer: "npm:^1.6.0" - estree-util-visit: "npm:^2.0.0" - hast-util-to-html: "npm:^9.0.5" - kleur: "npm:^4.1.5" - rehype-raw: "npm:^7.0.0" - remark-gfm: "npm:^4.0.1" - remark-smartypants: "npm:^3.0.2" - source-map: "npm:^0.7.4" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.3" - peerDependencies: - astro: ^5.0.0 - checksum: 10c0/26af7eef30e7f89f30ab89971d8b320678788a4a56f9e8a22e5b5eb1885c105dd1c0e5fe94c564a44a87e293bdb1a1b666f1f04004afcbfb3b53b462a759a9ef - languageName: node - linkType: hard - -"@astrojs/prism@npm:3.3.0": - version: 3.3.0 - resolution: "@astrojs/prism@npm:3.3.0" - dependencies: - prismjs: "npm:^1.30.0" - checksum: 10c0/8a87f2589f4a3e9ea982e3dd0a3e4ebf565b2e5cf16aa70d979cbddab241a7a24d7be45176fa8c5f69f000cd9ab311ab4677d7a15e2ba0cbd610c80db8b9d7dd - languageName: node - linkType: hard - -"@astrojs/sitemap@npm:^3.3.0": - version: 3.4.1 - resolution: "@astrojs/sitemap@npm:3.4.1" - dependencies: - sitemap: "npm:^8.0.0" - stream-replace-string: "npm:^2.0.0" - zod: "npm:^3.24.2" - checksum: 10c0/d36ba848c753f1abcc9cc603d38be8cb355ed86c8481168b8405d822fbc07d2eb6b971fd25f2e8cb98b889e7d1c2bafb736808ab3f6ad25d6b2da46dd5173b7e - languageName: node - linkType: hard - -"@astrojs/starlight@npm:^0.34.3": - version: 0.34.3 - resolution: "@astrojs/starlight@npm:0.34.3" - dependencies: - "@astrojs/markdown-remark": "npm:^6.3.1" - "@astrojs/mdx": "npm:^4.2.3" - "@astrojs/sitemap": "npm:^3.3.0" - "@pagefind/default-ui": "npm:^1.3.0" - "@types/hast": "npm:^3.0.4" - "@types/js-yaml": "npm:^4.0.9" - "@types/mdast": "npm:^4.0.4" - astro-expressive-code: "npm:^0.41.1" - bcp-47: "npm:^2.1.0" - hast-util-from-html: "npm:^2.0.1" - hast-util-select: "npm:^6.0.2" - hast-util-to-string: "npm:^3.0.0" - hastscript: "npm:^9.0.0" - i18next: "npm:^23.11.5" - js-yaml: "npm:^4.1.0" - klona: "npm:^2.0.6" - mdast-util-directive: "npm:^3.0.0" - mdast-util-to-markdown: "npm:^2.1.0" - mdast-util-to-string: "npm:^4.0.0" - pagefind: "npm:^1.3.0" - rehype: "npm:^13.0.1" - rehype-format: "npm:^5.0.0" - remark-directive: "npm:^3.0.0" - ultrahtml: "npm:^1.6.0" - unified: "npm:^11.0.5" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.2" - peerDependencies: - astro: ^5.5.0 - checksum: 10c0/c823177fb13423021154b5400b4b68dca2b32b04fae1425673cef223f72b6a7f6aa5b626b7bd11f6cfe5470fe718d7857b45e02f3c74b6400ecb9313c7ff9088 - languageName: node - linkType: hard - -"@astrojs/telemetry@npm:3.3.0": - version: 3.3.0 - resolution: "@astrojs/telemetry@npm:3.3.0" - dependencies: - ci-info: "npm:^4.2.0" - debug: "npm:^4.4.0" - dlv: "npm:^1.1.3" - dset: "npm:^3.1.4" - is-docker: "npm:^3.0.0" - is-wsl: "npm:^3.1.0" - which-pm-runs: "npm:^1.1.0" - checksum: 10c0/7c575aad221d7335b6b1378ceac0e60a25c9540cdde8f5584b0ffe565d06b3ecfc2217738d1ce55ac13eb66e1a6251453bddf117d7f793e51b3fc7be5d001ea4 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-string-parser@npm:7.27.1" - checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-identifier@npm:7.27.1" - checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.25.4": - version: 7.27.5 - resolution: "@babel/parser@npm:7.27.5" - dependencies: - "@babel/types": "npm:^7.27.3" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/f7faaebf21cc1f25d9ca8ac02c447ed38ef3460ea95be7ea760916dcf529476340d72a5a6010c6641d9ed9d12ad827c8424840277ec2295c5b082ba0f291220a - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.23.2": - version: 7.27.6 - resolution: "@babel/runtime@npm:7.27.6" - checksum: 10c0/89726be83f356f511dcdb74d3ea4d873a5f0cf0017d4530cb53aa27380c01ca102d573eff8b8b77815e624b1f8c24e7f0311834ad4fb632c90a770fda00bd4c8 - languageName: node - linkType: hard - -"@babel/types@npm:^7.25.4, @babel/types@npm:^7.27.3": - version: 7.27.6 - resolution: "@babel/types@npm:7.27.6" - dependencies: - "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10c0/39d556be114f2a6d874ea25ad39826a9e3a0e98de0233ae6d932f6d09a4b222923a90a7274c635ed61f1ba49bbd345329226678800900ad1c8d11afabd573aaf - languageName: node - linkType: hard - -"@capsizecss/unpack@npm:^2.4.0": - version: 2.4.0 - resolution: "@capsizecss/unpack@npm:2.4.0" - dependencies: - blob-to-buffer: "npm:^1.2.8" - cross-fetch: "npm:^3.0.4" - fontkit: "npm:^2.0.2" - checksum: 10c0/4f1598627872a0b69190b326136f896ff666323b86865c4973a5feb11f99fc057ebaca2d057048f87b93db2500662416ce37a170c034f56a4720f1363f91f828 - languageName: node - linkType: hard - -"@ctrl/tinycolor@npm:^4.0.4": - version: 4.1.0 - resolution: "@ctrl/tinycolor@npm:4.1.0" - checksum: 10c0/813dd960366df057006a1b93d7403ec7a48db1e79bec846d38fab15a1e0f37efd3ab96b0c780a14867ddc1f4c5a473e403c5c88e96d212c544ad934411e5307f - languageName: node - linkType: hard - -"@emnapi/runtime@npm:^1.2.0": - version: 1.4.3 - resolution: "@emnapi/runtime@npm:1.4.3" +"@11ty/gray-matter@npm:^3.0.0": + version: 3.0.0 + resolution: "@11ty/gray-matter@npm:3.0.0" dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/3b7ab72d21cb4e034f07df80165265f85f445ef3f581d1bc87b67e5239428baa00200b68a7d5e37a0425c3a78320b541b07f76c5530f6f6f95336a6294ebf30b + js-yaml: "npm:^5.2.2" + section-matter: "npm:^1.0.0" + checksum: 10c0/f9f03dd1e17450cea2dd6331be0eae13e897ea1c9b5fd7b3bc802aafaf861f76c8f526d394242bb3a35a3184396e2793475ebd0557e4b6bcc16d54c327c27235 languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/aix-ppc64@npm:0.25.5" +"@esbuild/aix-ppc64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/aix-ppc64@npm:0.28.2" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/android-arm64@npm:0.25.5" +"@esbuild/android-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-arm64@npm:0.28.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/android-arm@npm:0.25.5" +"@esbuild/android-arm@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-arm@npm:0.28.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/android-x64@npm:0.25.5" +"@esbuild/android-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/android-x64@npm:0.28.2" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/darwin-arm64@npm:0.25.5" +"@esbuild/darwin-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/darwin-arm64@npm:0.28.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/darwin-x64@npm:0.25.5" +"@esbuild/darwin-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/darwin-x64@npm:0.28.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/freebsd-arm64@npm:0.25.5" +"@esbuild/freebsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/freebsd-arm64@npm:0.28.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/freebsd-x64@npm:0.25.5" +"@esbuild/freebsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/freebsd-x64@npm:0.28.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-arm64@npm:0.25.5" +"@esbuild/linux-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-arm64@npm:0.28.2" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-arm@npm:0.25.5" +"@esbuild/linux-arm@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-arm@npm:0.28.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-ia32@npm:0.25.5" +"@esbuild/linux-ia32@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-ia32@npm:0.28.2" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-loong64@npm:0.25.5" +"@esbuild/linux-loong64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-loong64@npm:0.28.2" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-mips64el@npm:0.25.5" +"@esbuild/linux-mips64el@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-mips64el@npm:0.28.2" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-ppc64@npm:0.25.5" +"@esbuild/linux-ppc64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-ppc64@npm:0.28.2" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-riscv64@npm:0.25.5" +"@esbuild/linux-riscv64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-riscv64@npm:0.28.2" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-s390x@npm:0.25.5" +"@esbuild/linux-s390x@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-s390x@npm:0.28.2" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/linux-x64@npm:0.25.5" +"@esbuild/linux-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/linux-x64@npm:0.28.2" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/netbsd-arm64@npm:0.25.5" +"@esbuild/netbsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/netbsd-arm64@npm:0.28.2" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/netbsd-x64@npm:0.25.5" +"@esbuild/netbsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/netbsd-x64@npm:0.28.2" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/openbsd-arm64@npm:0.25.5" +"@esbuild/openbsd-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openbsd-arm64@npm:0.28.2" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/openbsd-x64@npm:0.25.5" +"@esbuild/openbsd-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openbsd-x64@npm:0.28.2" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/sunos-x64@npm:0.25.5" +"@esbuild/openharmony-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/openharmony-arm64@npm:0.28.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/sunos-x64@npm:0.28.2" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/win32-arm64@npm:0.25.5" +"@esbuild/win32-arm64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-arm64@npm:0.28.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/win32-ia32@npm:0.25.5" +"@esbuild/win32-ia32@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-ia32@npm:0.28.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.25.5": - version: 0.25.5 - resolution: "@esbuild/win32-x64@npm:0.25.5" +"@esbuild/win32-x64@npm:0.28.2": + version: 0.28.2 + resolution: "@esbuild/win32-x64@npm:0.28.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@expressive-code/core@npm:^0.41.2": - version: 0.41.2 - resolution: "@expressive-code/core@npm:0.41.2" +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: - "@ctrl/tinycolor": "npm:^4.0.4" - hast-util-select: "npm:^6.0.2" - hast-util-to-html: "npm:^9.0.1" - hast-util-to-text: "npm:^4.0.1" - hastscript: "npm:^9.0.0" - postcss: "npm:^8.4.38" - postcss-nested: "npm:^6.0.1" - unist-util-visit: "npm:^5.0.0" - unist-util-visit-parents: "npm:^6.0.1" - checksum: 10c0/7bf066c3ea1876014e4bc6392b476a44d294fdcc64169759c594976723702b2514a46d813bc121ba0617114a0822378a91fb33a7224214e23d069d043a4c7653 + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b languageName: node linkType: hard -"@expressive-code/plugin-frames@npm:^0.41.2": - version: 0.41.2 - resolution: "@expressive-code/plugin-frames@npm:0.41.2" - dependencies: - "@expressive-code/core": "npm:^0.41.2" - checksum: 10c0/270bc3b087970879e52425ca90357541901bd38fe3c8043bc9ed21ccf1ad364f1667e9b5672e4cf9791dccade15aac6edd6665abacb33ce71dd8b81759a2b292 +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e languageName: node linkType: hard -"@expressive-code/plugin-shiki@npm:^0.41.2": - version: 0.41.2 - resolution: "@expressive-code/plugin-shiki@npm:0.41.2" +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" dependencies: - "@expressive-code/core": "npm:^0.41.2" - shiki: "npm:^3.2.2" - checksum: 10c0/06061ea639fbf8f5fac37cc8cc930a19cb2f725bfe903e24f1029b2efad8750d3d1253cdc8c72b03069952464890b3081ed751969763df9a21a0a566b2a55a71 + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/50a4fdafe0b8f655cb2877e59fe81320272eaa4ccdbe6b9b87f10614b2220399ae3e05c16137a59db1f189523b42c7f88bd097ee991dbd7bc0e01113c583e844 languageName: node linkType: hard -"@expressive-code/plugin-text-markers@npm:^0.41.2": - version: 0.41.2 - resolution: "@expressive-code/plugin-text-markers@npm:0.41.2" - dependencies: - "@expressive-code/core": "npm:^0.41.2" - checksum: 10c0/0514bb0d4a1c0e34bd00fb671cb94c46227f5ec9b6d25ea7605757abe1d5ea63e3c9c45db4c6db5ef5d36bb37a4e4afaca53be8687543e451640fa6cfb28779a +"@jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.6.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.6.0" + checksum: 10c0/b5be700e45a775f218589c3466c4ffea630582b4988657652da464e5ab8a7d18bf928ee4fd2363fb346ede4bea9c6ff0bae05a538358c4565ece6199531b5f72 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 languageName: node linkType: hard -"@img/sharp-darwin-arm64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-darwin-arm64@npm:0.33.5" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: - "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-darwin-arm64": - optional: true - conditions: os=darwin & cpu=arm64 + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 languageName: node linkType: hard -"@img/sharp-darwin-x64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-darwin-x64@npm:0.33.5" +"@logpot/printer@npm:1.0.7": + version: 1.0.7 + resolution: "@logpot/printer@npm:1.0.7" dependencies: - "@img/sharp-libvips-darwin-x64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-darwin-x64": - optional: true - conditions: os=darwin & cpu=x64 + "@logpot/utils": "npm:1.0.7" + checksum: 10c0/b931c374f6150052b2701cdff4fae35240400bcd33a82963ea60e712decbf88a894ee84d3f68d2908eb56a7349409937059c6f9fe20c126fd14f837b5fe4057d languageName: node linkType: hard -"@img/sharp-libvips-darwin-arm64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4" +"@logpot/utils@npm:1.0.7": + version: 1.0.7 + resolution: "@logpot/utils@npm:1.0.7" + checksum: 10c0/fdd1ac1c3d43c420538bd11475ab55e55fe791ba28d1b500408a0b4089e9fa72e051218f60c0d521765419cdef03d052c577dfdde69b057c5c222cfae8603b8a + languageName: node + linkType: hard + +"@pagefind/darwin-arm64@npm:1.5.2": + version: 1.5.2 + resolution: "@pagefind/darwin-arm64@npm:1.5.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@img/sharp-libvips-darwin-x64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4" +"@pagefind/darwin-x64@npm:1.5.2": + version: 1.5.2 + resolution: "@pagefind/darwin-x64@npm:1.5.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@img/sharp-libvips-linux-arm64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4" - conditions: os=linux & cpu=arm64 & libc=glibc +"@pagefind/freebsd-x64@npm:1.5.2": + version: 1.5.2 + resolution: "@pagefind/freebsd-x64@npm:1.5.2" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@img/sharp-libvips-linux-arm@npm:1.0.5": - version: 1.0.5 - resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5" - conditions: os=linux & cpu=arm & libc=glibc +"@pagefind/linux-arm64@npm:1.5.2": + version: 1.5.2 + resolution: "@pagefind/linux-arm64@npm:1.5.2" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@img/sharp-libvips-linux-s390x@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4" - conditions: os=linux & cpu=s390x & libc=glibc +"@pagefind/linux-x64@npm:1.5.2": + version: 1.5.2 + resolution: "@pagefind/linux-x64@npm:1.5.2" + conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@img/sharp-libvips-linux-x64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4" - conditions: os=linux & cpu=x64 & libc=glibc +"@pagefind/windows-arm64@npm:1.5.2": + version: 1.5.2 + resolution: "@pagefind/windows-arm64@npm:1.5.2" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4" - conditions: os=linux & cpu=arm64 & libc=musl +"@pagefind/windows-x64@npm:1.5.2": + version: 1.5.2 + resolution: "@pagefind/windows-x64@npm:1.5.2" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@img/sharp-libvips-linuxmusl-x64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4" - conditions: os=linux & cpu=x64 & libc=musl +"@purestack/ts-common@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-common@npm:1.1.7" + dependencies: + "@purestack/ts-html": "npm:^1.1.7" + "@purestack/ts-style": "npm:^1.1.7" + "@purestack/ts-util": "npm:^1.1.7" + checksum: 10c0/13cf2d5240e2f3b85c662fd126c4ba1b7172acb417ebd09f476f5cdee030f69c50500f14057e13f86aa76e386d5e88c017cb5056831a2d179a63908a314bef54 languageName: node linkType: hard -"@img/sharp-linux-arm64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linux-arm64@npm:0.33.5" +"@purestack/ts-components@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-components@npm:1.1.7" dependencies: - "@img/sharp-libvips-linux-arm64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linux-arm64": - optional: true - conditions: os=linux & cpu=arm64 & libc=glibc + "@purestack/ts-common": "npm:^1.1.7" + "@purestack/ts-css": "npm:^1.1.7" + "@purestack/ts-page-scripts": "npm:^1.1.7" + "@purestack/ts-style": "npm:^1.1.7" + "@purestack/ts-util": "npm:^1.1.7" + regor: "npm:^1.7.3" + checksum: 10c0/8e0e215ef7d8bfdd025dad619a19b2299a4a99d69c06c61a9f4b2474b65fc6cb5eea17e94cbafacb692e733684fbba350f6314c112e2d90543b93a1b32571434 languageName: node linkType: hard -"@img/sharp-linux-arm@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linux-arm@npm:0.33.5" +"@purestack/ts-css@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-css@npm:1.1.7" dependencies: - "@img/sharp-libvips-linux-arm": "npm:1.0.5" - dependenciesMeta: - "@img/sharp-libvips-linux-arm": - optional: true - conditions: os=linux & cpu=arm & libc=glibc + "@purestack/ts-util": "npm:^1.1.7" + prettier: "npm:^3.8.1" + checksum: 10c0/34d70b79e6ae464836950692bd4cee5123a23f27ca076c1b2155983b5678a7901648ca141d162c171cb75d388331913b4491275646bc8e792afd527d527ee72e languageName: node linkType: hard -"@img/sharp-linux-s390x@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linux-s390x@npm:0.33.5" +"@purestack/ts-html@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-html@npm:1.1.7" dependencies: - "@img/sharp-libvips-linux-s390x": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linux-s390x": - optional: true - conditions: os=linux & cpu=s390x & libc=glibc + "@purestack/ts-util": "npm:^1.1.7" + prettier: "npm:^3.8.1" + checksum: 10c0/30db0bc677e85293eb2ed192fbd296d4c400b4e01b5458726f02473d2c3b9803657d335e1b06e5ae30966dfa28e36a6fa6cd8cadc26a16c44a1e32d271ca69cf + languageName: node + linkType: hard + +"@purestack/ts-minidom@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-minidom@npm:1.1.7" + checksum: 10c0/02c13d1d27ae8ad3eeab6fe230350cc5bf9cf84900715a4fc1479fd1120d1ba3f5b9a2db63dab2637a90e541e24d78ab27ee6e685fd70132f5b2f97ed4d090e4 languageName: node linkType: hard -"@img/sharp-linux-x64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linux-x64@npm:0.33.5" +"@purestack/ts-page-scripts@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-page-scripts@npm:1.1.7" dependencies: - "@img/sharp-libvips-linux-x64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linux-x64": - optional: true - conditions: os=linux & cpu=x64 & libc=glibc + "@purestack/ts-common": "npm:^1.1.7" + checksum: 10c0/57556ad41998a1e53e689d11d16156d29ce491617beb52b0e2225df3317d2715718eb3f6932e33116109c3bf0f844a9365ad049a35a99e2527b84f27e3b83855 languageName: node linkType: hard -"@img/sharp-linuxmusl-arm64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5" +"@purestack/ts-render@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-render@npm:1.1.7" dependencies: - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linuxmusl-arm64": - optional: true - conditions: os=linux & cpu=arm64 & libc=musl + "@purestack/ts-common": "npm:^1.1.7" + "@purestack/ts-minidom": "npm:^1.1.7" + "@purestack/ts-page-scripts": "npm:^1.1.7" + "@purestack/ts-util": "npm:^1.1.7" + regor: "npm:^1.7.3" + checksum: 10c0/f880913263be54cd2283cc103804d9260de8a2e2ebd5ead4fec7c2414dd01a2a0c23214a1171b3ba940ad8fac2e1cc4124ee7eb287dc6ae75b55b153d3e5643b languageName: node linkType: hard -"@img/sharp-linuxmusl-x64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5" +"@purestack/ts-ssg@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-ssg@npm:1.1.7" dependencies: - "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linuxmusl-x64": - optional: true - conditions: os=linux & cpu=x64 & libc=musl + "@11ty/gray-matter": "npm:^3.0.0" + "@purestack/ts-common": "npm:^1.1.7" + "@purestack/ts-components": "npm:^1.1.7" + "@purestack/ts-html": "npm:^1.1.7" + "@purestack/ts-minidom": "npm:^1.1.7" + "@purestack/ts-page-scripts": "npm:^1.1.7" + "@purestack/ts-render": "npm:^1.1.7" + "@purestack/ts-style": "npm:^1.1.7" + "@purestack/ts-svg-icons": "npm:^1.1.7" + "@purestack/ts-util": "npm:^1.1.7" + "@purestack/ts-util-node": "npm:^1.1.7" + esbuild: "npm:^0.28.0" + hast-util-from-html: "npm:^2.0.3" + hast-util-to-html: "npm:^9.0.5" + highlight.js: "npm:^11.11.1" + html-minifier-next: "npm:^4.19.1" + logpot: "npm:^1.0.7" + mdast-util-to-hast: "npm:^13.2.1" + pagefind: "npm:^1.4.0" + regor: "npm:^1.7.3" + rehype-raw: "npm:^7.0.0" + rehype-stringify: "npm:^10.0.1" + remark-gfm: "npm:^4.0.1" + remark-parse: "npm:^11.0.0" + remark-rehype: "npm:^11.1.2" + shiki: "npm:^3.22.0" + unified: "npm:^11.0.5" + bin: + ts-ssg: dist/cli.mjs + checksum: 10c0/d2e1f027628b3235dd523cd3093f82ebb94f2a2707d37b7196be2c41f4fae9edd2beb41393326257db32956dbedf52dfef2b9b07ef9e9a7ede2f28bfb664c0fb languageName: node linkType: hard -"@img/sharp-wasm32@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-wasm32@npm:0.33.5" +"@purestack/ts-style@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-style@npm:1.1.7" dependencies: - "@emnapi/runtime": "npm:^1.2.0" - conditions: cpu=wasm32 + "@purestack/ts-css": "npm:^1.1.7" + "@purestack/ts-util": "npm:^1.1.7" + checksum: 10c0/5b6beebaaa3cd571ac1f78d04cd90d1025d2bc8358fc9c0565de64dc440c90cfe93990e35647741d914b483680ac65fb0d7fb919fc7f8eec4bcca619b3212a9d languageName: node linkType: hard -"@img/sharp-win32-ia32@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-win32-ia32@npm:0.33.5" - conditions: os=win32 & cpu=ia32 +"@purestack/ts-svg-icons@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-svg-icons@npm:1.1.7" + checksum: 10c0/6c8c1acc4b7dd8ffc15fef81052f0ab595c364dc4506a4ca701e41254538c8f8e406664efef2dc8d92b7021bff5079526e27ad6a757f66d56b45c08f7ba46dde languageName: node linkType: hard -"@img/sharp-win32-x64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-win32-x64@npm:0.33.5" - conditions: os=win32 & cpu=x64 +"@purestack/ts-util-node@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-util-node@npm:1.1.7" + checksum: 10c0/04681cdb7f675a8de3d87f27dfc9f6ebee0c1a4d5a6edc53d0c25c802f5d83b3c0fc460d89e160f1ce3be3d19b683abfc28d7eaea40da9f95de9bb8bb187946a languageName: node linkType: hard -"@isaacs/balanced-match@npm:^4.0.1": - version: 4.0.1 - resolution: "@isaacs/balanced-match@npm:4.0.1" - checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 +"@purestack/ts-util@npm:^1.1.7": + version: 1.1.7 + resolution: "@purestack/ts-util@npm:1.1.7" + checksum: 10c0/2a24f9f359af259850519b63337fc332e89ac575b09f30ff6fa85e7375922928c9a02b8a38d811116088d9a7fddedcf72823910cc635fd5a69f4adff54595b45 languageName: node linkType: hard -"@isaacs/brace-expansion@npm:^5.0.0": - version: 5.0.0 - resolution: "@isaacs/brace-expansion@npm:5.0.0" +"@shikijs/core@npm:3.23.0": + version: 3.23.0 + resolution: "@shikijs/core@npm:3.23.0" dependencies: - "@isaacs/balanced-match": "npm:^4.0.1" - checksum: 10c0/b4d4812f4be53afc2c5b6c545001ff7a4659af68d4484804e9d514e183d20269bb81def8682c01a22b17c4d6aed14292c8494f7d2ac664e547101c1a905aa977 + "@shikijs/types": "npm:3.23.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + hast-util-to-html: "npm:^9.0.5" + checksum: 10c0/c595f1f2ec09cab102d2b3e03a3c64bfaace5fe52760cfbcced961d3e16571aa646c7e6f85b3d2d0242efd2c832ce4d150b5f1b7332982c17cfbe72f32bd0850 languageName: node linkType: hard -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" +"@shikijs/engine-javascript@npm:3.23.0": + version: 3.23.0 + resolution: "@shikijs/engine-javascript@npm:3.23.0" dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + "@shikijs/types": "npm:3.23.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + oniguruma-to-es: "npm:^4.3.4" + checksum: 10c0/884ebb7f66312c9f43e71fb33a3ac0e52f925fc6932de9f68f1bf171019c011c988a4bc0217212589985b1e1bc49452ed67eacbf3d74200b4a3725f11fd8ad98 languageName: node linkType: hard -"@isaacs/fs-minipass@npm:^4.0.0": - version: 4.0.1 - resolution: "@isaacs/fs-minipass@npm:4.0.1" +"@shikijs/engine-oniguruma@npm:3.23.0": + version: 3.23.0 + resolution: "@shikijs/engine-oniguruma@npm:3.23.0" dependencies: - minipass: "npm:^7.0.4" - checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + "@shikijs/types": "npm:3.23.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + checksum: 10c0/40dbda7aef55d5946c45b8cfe56f484eadb611f9f7c9eb77ff21f0dfce2bcc775686a61eda9e06401ddd71195945a522293f51d6522fce49244b1a6b9c0f61f7 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 +"@shikijs/langs@npm:3.23.0": + version: 3.23.0 + resolution: "@shikijs/langs@npm:3.23.0" + dependencies: + "@shikijs/types": "npm:3.23.0" + checksum: 10c0/513b90cfee0fa167d2063b7fbc2318b303a604f2e1fa156aa8b4659b49792401531a74acf68de622ecfff15738e1947a46cfe92a32fcd6a4ee5e70bcf1d06c66 languageName: node linkType: hard -"@mdx-js/mdx@npm:^3.1.0": - version: 3.1.0 - resolution: "@mdx-js/mdx@npm:3.1.0" +"@shikijs/themes@npm:3.23.0": + version: 3.23.0 + resolution: "@shikijs/themes@npm:3.23.0" dependencies: - "@types/estree": "npm:^1.0.0" - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdx": "npm:^2.0.0" - collapse-white-space: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - estree-util-scope: "npm:^1.0.0" - estree-walker: "npm:^3.0.0" - hast-util-to-jsx-runtime: "npm:^2.0.0" - markdown-extensions: "npm:^2.0.0" - recma-build-jsx: "npm:^1.0.0" - recma-jsx: "npm:^1.0.0" - recma-stringify: "npm:^1.0.0" - rehype-recma: "npm:^1.0.0" - remark-mdx: "npm:^3.0.0" - remark-parse: "npm:^11.0.0" - remark-rehype: "npm:^11.0.0" - source-map: "npm:^0.7.0" - unified: "npm:^11.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - unist-util-stringify-position: "npm:^4.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/e586ab772dcfee2bab334d5aac54c711e6d6d550085271c38a49c629b3e3954b5f41f488060761284a5e00649d0638d6aba6c0a7c66f91db80dee0ccc304ab32 + "@shikijs/types": "npm:3.23.0" + checksum: 10c0/5c99036d4a765765018f9106a354ebe5ccac204c69f00e3cda265828d493f005412659213f6574fa0e187c7d4437b3327bd6dad2e2146b2c472d2bf493d790dd languageName: node linkType: hard -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" +"@shikijs/types@npm:3.23.0": + version: 3.23.0 + resolution: "@shikijs/types@npm:3.23.0" dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/bd0d1593f830a6b4e55c77871ec1b95cc44855d6e0e26282a948a3c58827237826e4110af27eb4d3231361f1e182c4410434a1dc15ec40aea988dc92dc97e9d6 languageName: node linkType: hard -"@npmcli/fs@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/fs@npm:4.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 +"@shikijs/vscode-textmate@npm:^10.0.2": + version: 10.0.2 + resolution: "@shikijs/vscode-textmate@npm:10.0.2" + checksum: 10c0/36b682d691088ec244de292dc8f91b808f95c89466af421cf84cbab92230f03c8348649c14b3251991b10ce632b0c715e416e992dd5f28ff3221dc2693fd9462 languageName: node linkType: hard -"@oslojs/encoding@npm:^1.1.0": - version: 1.1.0 - resolution: "@oslojs/encoding@npm:1.1.0" - checksum: 10c0/5553a0974dca60e1a8b247b7b97abcb141cc7ee4e22444f424a07921d6a5f76a43c316f3ee669222787fdef6549f8749cc6d68ff5a631e2542521c56fe36417f +"@types/debug@npm:^4.0.0": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "npm:*" + checksum: 10c0/5dcd465edbb5a7f226e9a5efd1f399c6172407ef5840686b73e3608ce135eeca54ae8037dcd9f16bdb2768ac74925b820a8b9ecc588a58ca09eca6acabe33e2f languageName: node linkType: hard -"@pagefind/darwin-arm64@npm:1.3.0": - version: 1.3.0 - resolution: "@pagefind/darwin-arm64@npm:1.3.0" - conditions: os=darwin & cpu=arm64 +"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7 languageName: node linkType: hard -"@pagefind/darwin-x64@npm:1.3.0": - version: 1.3.0 - resolution: "@pagefind/darwin-x64@npm:1.3.0" - conditions: os=darwin & cpu=x64 +"@types/mdast@npm:^4.0.0": + version: 4.0.4 + resolution: "@types/mdast@npm:4.0.4" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/84f403dbe582ee508fd9c7643ac781ad8597fcbfc9ccb8d4715a2c92e4545e5772cbd0dbdf18eda65789386d81b009967fdef01b24faf6640f817287f54d9c82 languageName: node linkType: hard -"@pagefind/default-ui@npm:^1.3.0": - version: 1.3.0 - resolution: "@pagefind/default-ui@npm:1.3.0" - checksum: 10c0/ee8d534a2dd74386b10c94c75cd2f5aae1800fdfa2ced646d923e77d1ca717937f914611e17ff4590806dba88ff792ab9f658b889fb8aa08f3882dc4dd6608e1 +"@types/ms@npm:*": + version: 2.1.0 + resolution: "@types/ms@npm:2.1.0" + checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225 languageName: node linkType: hard -"@pagefind/linux-arm64@npm:1.3.0": - version: 1.3.0 - resolution: "@pagefind/linux-arm64@npm:1.3.0" - conditions: os=linux & cpu=arm64 +"@types/relateurl@npm:^0.2.33": + version: 0.2.33 + resolution: "@types/relateurl@npm:0.2.33" + checksum: 10c0/6b6aafe9ed59bf674703555d9fbd3d54c4f27eab3b2abed8faa750ca8b93d883727e111948d3537e6429b43c0990a734525a1aed1baf4c51aebc4f69e3f3fb9f languageName: node linkType: hard -"@pagefind/linux-x64@npm:1.3.0": - version: 1.3.0 - resolution: "@pagefind/linux-x64@npm:1.3.0" - conditions: os=linux & cpu=x64 +"@types/unist@npm:*, @types/unist@npm:^3.0.0": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 languageName: node linkType: hard -"@pagefind/windows-x64@npm:1.3.0": +"@ungap/structured-clone@npm:^1.0.0": version: 1.3.0 - resolution: "@pagefind/windows-x64@npm:1.3.0" - conditions: os=win32 & cpu=x64 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd +"acorn@npm:^8.15.0": + version: 8.19.0 + resolution: "acorn@npm:8.19.0" + bin: + acorn: bin/acorn + checksum: 10c0/21007e0ca638dd13d44a0ad26856b7a885cc6c4319cd2bc71694bc8ec3f0606c23ecd12b157e167f909d9d2b2d68d5b50fe3f54211b1aab7c3451a7c801fe62e languageName: node linkType: hard -"@rollup/pluginutils@npm:^5.1.4": - version: 5.1.4 - resolution: "@rollup/pluginutils@npm:5.1.4" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^2.0.2" - picomatch: "npm:^4.0.2" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/6d58fbc6f1024eb4b087bc9bf59a1d655a8056a60c0b4021d3beaeec3f0743503f52467fd89d2cf0e7eccf2831feb40a05ad541a17637ea21ba10b21c2004deb +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.43.0" - conditions: os=android & cpu=arm +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: 10c0/25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-android-arm64@npm:4.43.0" - conditions: os=android & cpu=arm64 +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.43.0" - conditions: os=darwin & cpu=arm64 +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.43.0" - conditions: os=darwin & cpu=x64 +"capital-case@npm:^1.0.4": + version: 1.0.4 + resolution: "capital-case@npm:1.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case-first: "npm:^2.0.2" + checksum: 10c0/6a034af73401f6e55d91ea35c190bbf8bda21714d4ea8bb8f1799311d123410a80f0875db4e3236dc3f97d74231ff4bf1c8783f2be13d7733c7d990c57387281 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.43.0" - conditions: os=freebsd & cpu=arm64 +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 10c0/3939b1664390174484322bc3f45b798462e6c07ee6384cb3d645e0aa2f318502d174845198c1561930e1d431087f74cf1fe291ae9a4722821a9f4ba67e574350 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.43.0" - conditions: os=freebsd & cpu=x64 +"change-case@npm:^4.1.2": + version: 4.1.2 + resolution: "change-case@npm:4.1.2" + dependencies: + camel-case: "npm:^4.1.2" + capital-case: "npm:^1.0.4" + constant-case: "npm:^3.0.4" + dot-case: "npm:^3.0.4" + header-case: "npm:^2.0.4" + no-case: "npm:^3.0.4" + param-case: "npm:^3.0.4" + pascal-case: "npm:^3.1.2" + path-case: "npm:^3.0.4" + sentence-case: "npm:^3.0.4" + snake-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/95a6e48563cd393241ce18470c7310a8a050304a64b63addac487560ab039ce42b099673d1d293cc10652324d92060de11b5d918179fe3b5af2ee521fb03ca58 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.43.0" - conditions: os=linux & cpu=arm & libc=glibc +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 10c0/fe61b553f083400c20c0b0fd65095df30a0b445d960f3bbf271536ae6c3ba676f39cb7af0b4bf2755812f08ab9b88f2feed68f9aebb73bb153f7a115fe5c6e40 languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.43.0" - conditions: os=linux & cpu=arm & libc=musl +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 10c0/ec4b430af873661aa754a896a2b55af089b4e938d3d010fad5219299a6b6d32ab175142699ee250640678cd64bdecd6db3c9af0b8759ab7b155d970d84c4c7d1 languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.43.0" - conditions: os=linux & cpu=arm64 & libc=glibc +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: 10c0/b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308 languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.43.0" - conditions: os=linux & cpu=arm64 & libc=musl +"comma-separated-tokens@npm:^2.0.0": + version: 2.0.3 + resolution: "comma-separated-tokens@npm:2.0.3" + checksum: 10c0/91f90f1aae320f1755d6957ef0b864fe4f54737f3313bd95e0802686ee2ca38bff1dd381964d00ae5db42912dd1f4ae5c2709644e82706ffc6f6842a813cdd67 languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.43.0" - conditions: os=linux & cpu=loong64 & libc=glibc +"commander@npm:^14.0.2": + version: 14.0.3 + resolution: "commander@npm:14.0.3" + checksum: 10c0/755652564bbf56ff2ff083313912b326450d3f8d8c85f4b71416539c9a05c3c67dbd206821ca72635bf6b160e2afdefcb458e86b317827d5cb333b69ce7f1a24 languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.43.0" - conditions: os=linux & cpu=ppc64 & libc=glibc +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.43.0" - conditions: os=linux & cpu=riscv64 & libc=glibc +"constant-case@npm:^3.0.4": + version: 3.0.4 + resolution: "constant-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case: "npm:^2.0.2" + checksum: 10c0/91d54f18341fcc491ae66d1086642b0cc564be3e08984d7b7042f8b0a721c8115922f7f11d6a09f13ed96ff326eabae11f9d1eb0335fa9d8b6e39e4df096010e languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.43.0" - conditions: os=linux & cpu=riscv64 & libc=musl +"debug@npm:^4.0.0": + version: 4.4.1 + resolution: "debug@npm:4.4.1" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.43.0" - conditions: os=linux & cpu=s390x & libc=glibc +"decode-named-character-reference@npm:^1.0.0": + version: 1.1.0 + resolution: "decode-named-character-reference@npm:1.1.0" + dependencies: + character-entities: "npm:^2.0.0" + checksum: 10c0/359c76305b47e67660ec096c5cd3f65972ed75b8a53a40435a7a967cfab3e9516e64b443cbe0c7edcf5ab77f65a6924f12fb1872b1e09e2f044f28f4fd10996a languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.43.0" - conditions: os=linux & cpu=x64 & libc=glibc +"dequal@npm:^2.0.0": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.43.0" - conditions: os=linux & cpu=x64 & libc=musl +"detect-libc@npm:^2.0.3": + version: 2.0.4 + resolution: "detect-libc@npm:2.0.4" + checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.43.0" - conditions: os=win32 & cpu=arm64 +"devlop@npm:^1.0.0, devlop@npm:^1.1.0": + version: 1.1.0 + resolution: "devlop@npm:1.1.0" + dependencies: + dequal: "npm:^2.0.0" + checksum: 10c0/e0928ab8f94c59417a2b8389c45c55ce0a02d9ac7fd74ef62d01ba48060129e1d594501b77de01f3eeafc7cb00773819b0df74d96251cf20b31c5b3071f45c0e languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.43.0" - conditions: os=win32 & cpu=ia32 +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.43.0" - conditions: os=win32 & cpu=x64 +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 languageName: node linkType: hard -"@shikijs/core@npm:3.6.0": - version: 3.6.0 - resolution: "@shikijs/core@npm:3.6.0" - dependencies: - "@shikijs/types": "npm:3.6.0" - "@shikijs/vscode-textmate": "npm:^10.0.2" - "@types/hast": "npm:^3.0.4" - hast-util-to-html: "npm:^9.0.5" - checksum: 10c0/cd12f225df50d6773a3005a8a86fcd1d3c7dcb3b90a01f97f2269ecdc5600f8f3df28181ee5f5bb6ff623090bfe7b98ac9353ae24691a84b0a34e127db6a5f13 +"entities@npm:^7.0.0": + version: 7.0.1 + resolution: "entities@npm:7.0.1" + checksum: 10c0/b4fb9937bb47ecb00aaaceb9db9cdd1cc0b0fb649c0e843d05cf5dbbd2e9d2df8f98721d8b1b286445689c72af7b54a7242fc2d63ef7c9739037a8c73363e7ca + languageName: node + linkType: hard + +"esbuild@npm:^0.28.0": + version: 0.28.2 + resolution: "esbuild@npm:0.28.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.28.2" + "@esbuild/android-arm": "npm:0.28.2" + "@esbuild/android-arm64": "npm:0.28.2" + "@esbuild/android-x64": "npm:0.28.2" + "@esbuild/darwin-arm64": "npm:0.28.2" + "@esbuild/darwin-x64": "npm:0.28.2" + "@esbuild/freebsd-arm64": "npm:0.28.2" + "@esbuild/freebsd-x64": "npm:0.28.2" + "@esbuild/linux-arm": "npm:0.28.2" + "@esbuild/linux-arm64": "npm:0.28.2" + "@esbuild/linux-ia32": "npm:0.28.2" + "@esbuild/linux-loong64": "npm:0.28.2" + "@esbuild/linux-mips64el": "npm:0.28.2" + "@esbuild/linux-ppc64": "npm:0.28.2" + "@esbuild/linux-riscv64": "npm:0.28.2" + "@esbuild/linux-s390x": "npm:0.28.2" + "@esbuild/linux-x64": "npm:0.28.2" + "@esbuild/netbsd-arm64": "npm:0.28.2" + "@esbuild/netbsd-x64": "npm:0.28.2" + "@esbuild/openbsd-arm64": "npm:0.28.2" + "@esbuild/openbsd-x64": "npm:0.28.2" + "@esbuild/openharmony-arm64": "npm:0.28.2" + "@esbuild/sunos-x64": "npm:0.28.2" + "@esbuild/win32-arm64": "npm:0.28.2" + "@esbuild/win32-ia32": "npm:0.28.2" + "@esbuild/win32-x64": "npm:0.28.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/9b19edb63bd7780fd2e8e65a1394a0e8a05a17d697f73f0647ffe3c134709d8dbe744ab3fd57b35c9470db268cae7678fafd3dcd3ce1f34fc590568c2433f5d2 languageName: node linkType: hard -"@shikijs/engine-javascript@npm:3.6.0": - version: 3.6.0 - resolution: "@shikijs/engine-javascript@npm:3.6.0" - dependencies: - "@shikijs/types": "npm:3.6.0" - "@shikijs/vscode-textmate": "npm:^10.0.2" - oniguruma-to-es: "npm:^4.3.3" - checksum: 10c0/30a455f58ded393c6a8de22d090b64aeab06c0a063e71fccedc05de91900fa4bb691ffcaaf5d3799cf8a040849fe71685d3f1f3b29764e34111fd425310b924a +"escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:3.6.0": - version: 3.6.0 - resolution: "@shikijs/engine-oniguruma@npm:3.6.0" +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" dependencies: - "@shikijs/types": "npm:3.6.0" - "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10c0/2e3a1fb02d823be5d998a310fa2e5e34e92a7498996bed2ec52eb9368dbba99e10571619a364c406d79f3047b966fecc7afb29635a8fdfa6a25c9ee5cd8f2f34 + is-extendable: "npm:^0.1.0" + checksum: 10c0/ee1cb0a18c9faddb42d791b2d64867bd6cfd0f3affb711782eb6e894dd193e2934a7f529426aac7c8ddb31ac5d38000a00aa2caf08aa3dfc3e1c8ff6ba340bd9 languageName: node linkType: hard -"@shikijs/langs@npm:3.6.0": - version: 3.6.0 - resolution: "@shikijs/langs@npm:3.6.0" - dependencies: - "@shikijs/types": "npm:3.6.0" - checksum: 10c0/b904e230c5b4e1cd0c1c09d36b3704ac961b8b27802581ee375c2c1f92f5df5e93dc88ddf882be094fe42c3bd374c67e10f2f14d4974d0cb8e04efc8ba3492f0 +"extend@npm:^3.0.0": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 languageName: node linkType: hard -"@shikijs/themes@npm:3.6.0": - version: 3.6.0 - resolution: "@shikijs/themes@npm:3.6.0" +"hast-util-from-html@npm:^2.0.3": + version: 2.0.3 + resolution: "hast-util-from-html@npm:2.0.3" dependencies: - "@shikijs/types": "npm:3.6.0" - checksum: 10c0/33be969bc56ea86590d63042a24ab715527f30f9488cca6fe17dfff67894ca1e75e83ddca9c9b5d449a8e8586ad014ace8b92b389e73be2c35280d6f805b87a3 + "@types/hast": "npm:^3.0.0" + devlop: "npm:^1.1.0" + hast-util-from-parse5: "npm:^8.0.0" + parse5: "npm:^7.0.0" + vfile: "npm:^6.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10c0/993ef707c1a12474c8d4094fc9706a72826c660a7e308ea54c50ad893353d32e139b7cbc67510c2e82feac572b320e3b05aeb13d0f9c6302d61261f337b46764 languageName: node linkType: hard -"@shikijs/types@npm:3.6.0": - version: 3.6.0 - resolution: "@shikijs/types@npm:3.6.0" +"hast-util-from-parse5@npm:^8.0.0": + version: 8.0.3 + resolution: "hast-util-from-parse5@npm:8.0.3" dependencies: - "@shikijs/vscode-textmate": "npm:^10.0.2" - "@types/hast": "npm:^3.0.4" - checksum: 10c0/5ea6246541b18e67bde854c4b72fb3aecde4a7da080be827645e4728945b782df9dc6498115085afbcf180e21e06e949bc3b8c3162233a2bdf4313979f49a6f7 - languageName: node - linkType: hard - -"@shikijs/vscode-textmate@npm:^10.0.2": - version: 10.0.2 - resolution: "@shikijs/vscode-textmate@npm:10.0.2" - checksum: 10c0/36b682d691088ec244de292dc8f91b808f95c89466af421cf84cbab92230f03c8348649c14b3251991b10ce632b0c715e416e992dd5f28ff3221dc2693fd9462 + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + devlop: "npm:^1.0.0" + hastscript: "npm:^9.0.0" + property-information: "npm:^7.0.0" + vfile: "npm:^6.0.0" + vfile-location: "npm:^5.0.0" + web-namespaces: "npm:^2.0.0" + checksum: 10c0/40ace6c0ad43c26f721c7499fe408e639cde917b2350c9299635e6326559855896dae3c3ebf7440df54766b96c4276a7823e8f376a2b6a28b37b591f03412545 languageName: node linkType: hard -"@swc/helpers@npm:^0.5.12": - version: 0.5.17 - resolution: "@swc/helpers@npm:0.5.17" +"hast-util-parse-selector@npm:^4.0.0": + version: 4.0.0 + resolution: "hast-util-parse-selector@npm:4.0.0" dependencies: - tslib: "npm:^2.8.0" - checksum: 10c0/fe1f33ebb968558c5a0c595e54f2e479e4609bff844f9ca9a2d1ffd8dd8504c26f862a11b031f48f75c95b0381c2966c3dd156e25942f90089badd24341e7dbb + "@types/hast": "npm:^3.0.0" + checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f languageName: node linkType: hard -"@types/debug@npm:^4.0.0": - version: 4.1.12 - resolution: "@types/debug@npm:4.1.12" +"hast-util-raw@npm:^9.0.0": + version: 9.1.0 + resolution: "hast-util-raw@npm:9.1.0" dependencies: - "@types/ms": "npm:*" - checksum: 10c0/5dcd465edbb5a7f226e9a5efd1f399c6172407ef5840686b73e3608ce135eeca54ae8037dcd9f16bdb2768ac74925b820a8b9ecc588a58ca09eca6acabe33e2f + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + hast-util-from-parse5: "npm:^8.0.0" + hast-util-to-parse5: "npm:^8.0.0" + html-void-elements: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + parse5: "npm:^7.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc languageName: node linkType: hard -"@types/estree-jsx@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree-jsx@npm:1.0.5" +"hast-util-to-html@npm:^9.0.0, hast-util-to-html@npm:^9.0.5": + version: 9.0.5 + resolution: "hast-util-to-html@npm:9.0.5" dependencies: - "@types/estree": "npm:*" - checksum: 10c0/07b354331516428b27a3ab99ee397547d47eb223c34053b48f84872fafb841770834b90cc1a0068398e7c7ccb15ec51ab00ec64b31dc5e3dbefd624638a35c6d + "@types/hast": "npm:^3.0.0" + "@types/unist": "npm:^3.0.0" + ccount: "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-whitespace: "npm:^3.0.0" + html-void-elements: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + stringify-entities: "npm:^4.0.0" + zwitch: "npm:^2.0.4" + checksum: 10c0/b7a08c30bab4371fc9b4a620965c40b270e5ae7a8e94cf885f43b21705179e28c8e43b39c72885d1647965fb3738654e6962eb8b58b0c2a84271655b4d748836 languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0": - version: 1.0.8 - resolution: "@types/estree@npm:1.0.8" - checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 +"hast-util-to-parse5@npm:^8.0.0": + version: 8.0.0 + resolution: "hast-util-to-parse5@npm:8.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + devlop: "npm:^1.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd languageName: node linkType: hard -"@types/estree@npm:1.0.7": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c +"hast-util-whitespace@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-whitespace@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/b898bc9fe27884b272580d15260b6bbdabe239973a147e97fa98c45fa0ffec967a481aaa42291ec34fb56530dc2d484d473d7e2bae79f39c83f3762307edfea8 languageName: node linkType: hard -"@types/fontkit@npm:^2.0.8": - version: 2.0.8 - resolution: "@types/fontkit@npm:2.0.8" +"hastscript@npm:^9.0.0": + version: 9.0.1 + resolution: "hastscript@npm:9.0.1" dependencies: - "@types/node": "npm:*" - checksum: 10c0/e5a124d468f17d3b74a07d38257fc38b8d3d1e3e1e68b1c4a3314beb274223499009f4a6c1d2f15a9928ad6643fb8bfca4881d13447cfbf5de1733ad6fd5d4b1 + "@types/hast": "npm:^3.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-parse-selector: "npm:^4.0.0" + property-information: "npm:^7.0.0" + space-separated-tokens: "npm:^2.0.0" + checksum: 10c0/18dc8064e5c3a7a2ae862978e626b97a254e1c8a67ee9d0c9f06d373bba155ed805fc5b5ce21b990fb7bc174624889e5e1ce1cade264f1b1d58b48f994bc85ce languageName: node linkType: hard -"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": - version: 3.0.4 - resolution: "@types/hast@npm:3.0.4" +"header-case@npm:^2.0.4": + version: 2.0.4 + resolution: "header-case@npm:2.0.4" dependencies: - "@types/unist": "npm:*" - checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7 + capital-case: "npm:^1.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/c9f295d9d8e38fa50679281fd70d80726962256e888a76c8e72e526453da7a1832dcb427caa716c1ad5d79841d4537301b90156fa30298fefd3d68f4ea2181bb languageName: node linkType: hard -"@types/js-yaml@npm:^4.0.9": - version: 4.0.9 - resolution: "@types/js-yaml@npm:4.0.9" - checksum: 10c0/24de857aa8d61526bbfbbaa383aa538283ad17363fcd5bb5148e2c7f604547db36646440e739d78241ed008702a8920665d1add5618687b6743858fae00da211 +"highlight.js@npm:^11.11.1": + version: 11.12.0 + resolution: "highlight.js@npm:11.12.0" + checksum: 10c0/c62ebfad125b541790412374a15ae1ca15a45fdfac0fae2b5c96b6a10dc8d5d15380adf748584fb08cfeb4db2b3a749a170e2afd0b640e9fad86445b1c435777 languageName: node linkType: hard -"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.4": - version: 4.0.4 - resolution: "@types/mdast@npm:4.0.4" +"html-minifier-next@npm:^4.19.1": + version: 4.19.1 + resolution: "html-minifier-next@npm:4.19.1" dependencies: - "@types/unist": "npm:*" - checksum: 10c0/84f403dbe582ee508fd9c7643ac781ad8597fcbfc9ccb8d4715a2c92e4545e5772cbd0dbdf18eda65789386d81b009967fdef01b24faf6640f817287f54d9c82 + "@types/relateurl": "npm:^0.2.33" + change-case: "npm:^4.1.2" + commander: "npm:^14.0.2" + entities: "npm:^7.0.0" + lightningcss: "npm:^1.28.2" + relateurl: "npm:^0.2.7" + terser: "npm:^5.46.0" + peerDependencies: + "@swc/core": ^1.15.7 + peerDependenciesMeta: + "@swc/core": + optional: true + bin: + html-minifier-next: cli.js + checksum: 10c0/387d62c64030388baf58bc3994dd7d3c46475e0a87a07da27b98fc83fdba3377856d97418195d9e7589dfef5d96975e2d7810554f033dc608953643b9bfe9610 languageName: node linkType: hard -"@types/mdx@npm:^2.0.0": - version: 2.0.13 - resolution: "@types/mdx@npm:2.0.13" - checksum: 10c0/5edf1099505ac568da55f9ae8a93e7e314e8cbc13d3445d0be61b75941226b005e1390d9b95caecf5dcb00c9d1bab2f1f60f6ff9876dc091a48b547495007720 +"html-void-elements@npm:^3.0.0": + version: 3.0.0 + resolution: "html-void-elements@npm:3.0.0" + checksum: 10c0/a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2 languageName: node linkType: hard -"@types/ms@npm:*": - version: 2.1.0 - resolution: "@types/ms@npm:2.1.0" - checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225 +"is-extendable@npm:^0.1.0": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 10c0/dd5ca3994a28e1740d1e25192e66eed128e0b2ff161a7ea348e87ae4f616554b486854de423877a2a2c171d5f7cd6e8093b91f54533bc88a59ee1c9838c43879 languageName: node linkType: hard -"@types/nlcst@npm:^2.0.0": - version: 2.0.3 - resolution: "@types/nlcst@npm:2.0.3" - dependencies: - "@types/unist": "npm:*" - checksum: 10c0/d83549aaee59681ae8fa2a78d8a1b968a41eb7c0422773dff12acbf3661e4b2b2859740c3effdad9d0cd12ea14a0ec33ca302da12106476b627e09d2a029d3c1 +"is-plain-obj@npm:^4.0.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e languageName: node linkType: hard -"@types/node@npm:*": - version: 24.0.1 - resolution: "@types/node@npm:24.0.1" +"js-yaml@npm:^5.2.2": + version: 5.4.3 + resolution: "js-yaml@npm:5.4.3" dependencies: - undici-types: "npm:~7.8.0" - checksum: 10c0/91cd50d1ac32a2172cbc67b65c78391fbd469b24743e3665427aa60bebaf4620cb9ac2e91c09a8081a78d08855c00faca659c287c1725ce8ca5e80ece3a20520 - languageName: node - linkType: hard - -"@types/node@npm:^17.0.5": - version: 17.0.45 - resolution: "@types/node@npm:17.0.45" - checksum: 10c0/0db377133d709b33a47892581a21a41cd7958f22723a3cc6c71d55ac018121382de42fbfc7970d5ae3e7819dbe5f40e1c6a5174aedf7e7964e9cb8fa72b580b0 - languageName: node - linkType: hard - -"@types/sax@npm:^1.2.1": - version: 1.2.7 - resolution: "@types/sax@npm:1.2.7" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/d077a761a0753b079bf8279b3993948030ca86ed9125437b9b29c1de40db9b2deb7fddc369f014b58861d450e8b8cc75f163aa29dc8cea81952efbfd859168cf + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.mjs + checksum: 10c0/7180bf35feef9815a06cb2f8845c1196f1e4264430a04623884d87c3d21475de7d46a86c9c5142dcc1646c788bc0e676eb09ba817810707e0b4e984f7cf93a5f languageName: node linkType: hard -"@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.3 - resolution: "@types/unist@npm:3.0.3" - checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 +"kind-of@npm:^6.0.0": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 languageName: node linkType: hard -"@types/unist@npm:^2.0.0": - version: 2.0.11 - resolution: "@types/unist@npm:2.0.11" - checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d +"lightningcss-android-arm64@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-android-arm64@npm:1.33.0" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.0.0": - version: 1.3.0 - resolution: "@ungap/structured-clone@npm:1.3.0" - checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a +"lightningcss-darwin-arm64@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-darwin-arm64@npm:1.33.0" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"abbrev@npm:^3.0.0": - version: 3.0.1 - resolution: "abbrev@npm:3.0.1" - checksum: 10c0/21ba8f574ea57a3106d6d35623f2c4a9111d9ee3e9a5be47baed46ec2457d2eac46e07a5c4a60186f88cb98abbe3e24f2d4cca70bc2b12f1692523e2209a9ccf +"lightningcss-darwin-x64@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-darwin-x64@npm:1.33.0" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"acorn-jsx@npm:^5.0.0": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 +"lightningcss-freebsd-x64@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-freebsd-x64@npm:1.33.0" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"acorn@npm:^8.0.0, acorn@npm:^8.14.1": - version: 8.15.0 - resolution: "acorn@npm:8.15.0" - bin: - acorn: bin/acorn - checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec +"lightningcss-linux-arm-gnueabihf@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.33.0" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 +"lightningcss-linux-arm64-gnu@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.33.0" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"ansi-align@npm:^3.0.1": - version: 3.0.1 - resolution: "ansi-align@npm:3.0.1" - dependencies: - string-width: "npm:^4.1.0" - checksum: 10c0/ad8b755a253a1bc8234eb341e0cec68a857ab18bf97ba2bda529e86f6e30460416523e0ec58c32e5c21f0ca470d779503244892873a5895dbd0c39c788e82467 +"lightningcss-linux-arm64-musl@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.33.0" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 +"lightningcss-linux-x64-gnu@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.33.0" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc +"lightningcss-linux-x64-musl@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-linux-x64-musl@npm:1.33.0" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"ansi-styles@npm:^4.0.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 +"lightningcss-win32-arm64-msvc@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-win32-arm64-msvc@npm:1.33.0" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c +"lightningcss-win32-x64-msvc@npm:1.33.0": + version: 1.33.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.33.0" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"anymatch@npm:^3.1.3": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" +"lightningcss@npm:^1.28.2": + version: 1.33.0 + resolution: "lightningcss@npm:1.33.0" dependencies: - normalize-path: "npm:^3.0.0" - picomatch: "npm:^2.0.4" - checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.33.0" + lightningcss-darwin-arm64: "npm:1.33.0" + lightningcss-darwin-x64: "npm:1.33.0" + lightningcss-freebsd-x64: "npm:1.33.0" + lightningcss-linux-arm-gnueabihf: "npm:1.33.0" + lightningcss-linux-arm64-gnu: "npm:1.33.0" + lightningcss-linux-arm64-musl: "npm:1.33.0" + lightningcss-linux-x64-gnu: "npm:1.33.0" + lightningcss-linux-x64-musl: "npm:1.33.0" + lightningcss-win32-arm64-msvc: "npm:1.33.0" + lightningcss-win32-x64-msvc: "npm:1.33.0" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/ce1f8279fbae636dbf37fa6e7385d5f98ed881d72af3362f24afbd4685e19c1fcdfecf17e5dd77f2ebee3d0c23ade276230d85842d07292229a2cffba8ff20a3 languageName: node linkType: hard -"arg@npm:^5.0.0": - version: 5.0.2 - resolution: "arg@npm:5.0.2" - checksum: 10c0/ccaf86f4e05d342af6666c569f844bec426595c567d32a8289715087825c2ca7edd8a3d204e4d2fb2aa4602e09a57d0c13ea8c9eea75aac3dbb4af5514e6800e +"logpot@npm:^1.0.7": + version: 1.0.7 + resolution: "logpot@npm:1.0.7" + dependencies: + "@logpot/printer": "npm:1.0.7" + "@logpot/utils": "npm:1.0.7" + checksum: 10c0/3e1b94ccabcfe3064f4b13b32542e4e40b4e19c5856a870151b9bacadfdf576782b2b58bed9bd37af5c65b632be0eefbad3ada9cdbd3c741ae8822cc6973508a languageName: node linkType: hard -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: 10c0/7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa languageName: node linkType: hard -"aria-query@npm:^5.3.2": - version: 5.3.2 - resolution: "aria-query@npm:5.3.2" - checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b languageName: node linkType: hard -"array-iterate@npm:^2.0.0": - version: 2.0.1 - resolution: "array-iterate@npm:2.0.1" - checksum: 10c0/756c08334f95e290f03ab2141b034514af1311ef7b62f15b0f5ea6f8f3033ee9cc6a8f1c3e9ff4803d4d723cf992aa61460acf5fce884936972db966b1da287d +"markdown-table@npm:^3.0.0": + version: 3.0.4 + resolution: "markdown-table@npm:3.0.4" + checksum: 10c0/1257b31827629a54c24a5030a3dac952256c559174c95ce3ef89bebd6bff0cb1444b1fd667b1a1bb53307f83278111505b3e26f0c4e7b731e0060d435d2d930b languageName: node linkType: hard -"astring@npm:^1.8.0": - version: 1.9.0 - resolution: "astring@npm:1.9.0" - bin: - astring: bin/astring - checksum: 10c0/e7519544d9824494e80ef0e722bb3a0c543a31440d59691c13aeaceb75b14502af536b23f08db50aa6c632dafaade54caa25f0788aa7550b6b2d6e2df89e0830 +"mdast-util-find-and-replace@npm:^3.0.0": + version: 3.0.2 + resolution: "mdast-util-find-and-replace@npm:3.0.2" + dependencies: + "@types/mdast": "npm:^4.0.0" + escape-string-regexp: "npm:^5.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10c0/c8417a35605d567772ff5c1aa08363ff3010b0d60c8ea68c53cba09bf25492e3dd261560425c1756535f3b7107f62e7ff3857cdd8fb1e62d1b2cc2ea6e074ca2 languageName: node linkType: hard -"astro-expressive-code@npm:^0.41.1": - version: 0.41.2 - resolution: "astro-expressive-code@npm:0.41.2" +"mdast-util-from-markdown@npm:^2.0.0": + version: 2.0.2 + resolution: "mdast-util-from-markdown@npm:2.0.2" dependencies: - rehype-expressive-code: "npm:^0.41.2" - peerDependencies: - astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 - checksum: 10c0/a485e821ee3879bdfb367ea7c76e9fa7c88d0d5b9c5ad5739f0d291090f932cc15812a9de7115c5bcec3dea61a0036fe709526680450c76612a596212e3fb551 + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + mdast-util-to-string: "npm:^4.0.0" + micromark: "npm:^4.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-decode-string: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unist-util-stringify-position: "npm:^4.0.0" + checksum: 10c0/76eb2bd2c6f7a0318087c73376b8af6d7561c1e16654e7667e640f391341096c56142618fd0ff62f6d39e5ab4895898b9789c84cd7cec2874359a437a0e1ff15 languageName: node linkType: hard -"astro@npm:^5.9.2": - version: 5.9.2 - resolution: "astro@npm:5.9.2" +"mdast-util-gfm-autolink-literal@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" dependencies: - "@astrojs/compiler": "npm:^2.12.2" - "@astrojs/internal-helpers": "npm:0.6.1" - "@astrojs/markdown-remark": "npm:6.3.2" - "@astrojs/telemetry": "npm:3.3.0" - "@capsizecss/unpack": "npm:^2.4.0" - "@oslojs/encoding": "npm:^1.1.0" - "@rollup/pluginutils": "npm:^5.1.4" - acorn: "npm:^8.14.1" - aria-query: "npm:^5.3.2" - axobject-query: "npm:^4.1.0" - boxen: "npm:8.0.1" - ci-info: "npm:^4.2.0" - clsx: "npm:^2.1.1" - common-ancestor-path: "npm:^1.0.1" - cookie: "npm:^1.0.2" - cssesc: "npm:^3.0.0" - debug: "npm:^4.4.0" - deterministic-object-hash: "npm:^2.0.2" - devalue: "npm:^5.1.1" - diff: "npm:^5.2.0" - dlv: "npm:^1.1.3" - dset: "npm:^3.1.4" - es-module-lexer: "npm:^1.6.0" - esbuild: "npm:^0.25.0" - estree-walker: "npm:^3.0.3" - flattie: "npm:^1.1.1" - fontace: "npm:~0.3.0" - github-slugger: "npm:^2.0.0" - html-escaper: "npm:3.0.3" - http-cache-semantics: "npm:^4.1.1" - import-meta-resolve: "npm:^4.1.0" - js-yaml: "npm:^4.1.0" - kleur: "npm:^4.1.5" - magic-string: "npm:^0.30.17" - magicast: "npm:^0.3.5" - mrmime: "npm:^2.0.1" - neotraverse: "npm:^0.6.18" - p-limit: "npm:^6.2.0" - p-queue: "npm:^8.1.0" - package-manager-detector: "npm:^1.1.0" - picomatch: "npm:^4.0.2" - prompts: "npm:^2.4.2" - rehype: "npm:^13.0.2" - semver: "npm:^7.7.1" - sharp: "npm:^0.33.3" - shiki: "npm:^3.2.1" - tinyexec: "npm:^0.3.2" - tinyglobby: "npm:^0.2.12" - tsconfck: "npm:^3.1.5" - ultrahtml: "npm:^1.6.0" - unifont: "npm:~0.5.0" - unist-util-visit: "npm:^5.0.0" - unstorage: "npm:^1.15.0" - vfile: "npm:^6.0.3" - vite: "npm:^6.3.4" - vitefu: "npm:^1.0.6" - xxhash-wasm: "npm:^1.1.0" - yargs-parser: "npm:^21.1.1" - yocto-spinner: "npm:^0.2.1" - zod: "npm:^3.24.2" - zod-to-json-schema: "npm:^3.24.5" - zod-to-ts: "npm:^1.2.0" - dependenciesMeta: - sharp: - optional: true - bin: - astro: astro.js - checksum: 10c0/6da1590fb367f9332bd83580d81c1d56a25be2dbd27f34488691ada167384d9bdf3ab195a71d3f94bf4a0118e53476630b9f7fb0b3b8d2581923ff7658f27b11 + "@types/mdast": "npm:^4.0.0" + ccount: "npm:^2.0.0" + devlop: "npm:^1.0.0" + mdast-util-find-and-replace: "npm:^3.0.0" + micromark-util-character: "npm:^2.0.0" + checksum: 10c0/963cd22bd42aebdec7bdd0a527c9494d024d1ad0739c43dc040fee35bdfb5e29c22564330a7418a72b5eab51d47a6eff32bc0255ef3ccb5cebfe8970e91b81b6 languageName: node linkType: hard -"axobject-query@npm:^4.1.0": - version: 4.1.0 - resolution: "axobject-query@npm:4.1.0" - checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775 +"mdast-util-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "mdast-util-gfm-footnote@npm:2.1.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.1.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + checksum: 10c0/8ab965ee6be3670d76ec0e95b2ba3101fc7444eec47564943ab483d96ac17d29da2a4e6146a2a288be30c21b48c4f3938a1e54b9a46fbdd321d49a5bc0077ed0 languageName: node linkType: hard -"bail@npm:^2.0.0": - version: 2.0.2 - resolution: "bail@npm:2.0.2" - checksum: 10c0/25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b +"mdast-util-gfm-strikethrough@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056 languageName: node linkType: hard -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee +"mdast-util-gfm-table@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-table@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + markdown-table: "npm:^3.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e languageName: node linkType: hard -"base-64@npm:^1.0.0": - version: 1.0.0 - resolution: "base-64@npm:1.0.0" - checksum: 10c0/d886cb3236cee0bed9f7075675748b59b32fad623ddb8ce1793c790306aa0f76a03238cad4b3fb398abda6527ce08a5588388533a4ccade0b97e82b9da660e28 +"mdast-util-gfm-task-list-item@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834 languageName: node linkType: hard -"base64-js@npm:^1.1.2, base64-js@npm:^1.3.0": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf +"mdast-util-gfm@npm:^3.0.0": + version: 3.1.0 + resolution: "mdast-util-gfm@npm:3.1.0" + dependencies: + mdast-util-from-markdown: "npm:^2.0.0" + mdast-util-gfm-autolink-literal: "npm:^2.0.0" + mdast-util-gfm-footnote: "npm:^2.0.0" + mdast-util-gfm-strikethrough: "npm:^2.0.0" + mdast-util-gfm-table: "npm:^2.0.0" + mdast-util-gfm-task-list-item: "npm:^2.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + checksum: 10c0/4bedcfb6a20e39901c8772f0d2bb2d7a64ae87a54c13cbd92eec062cf470fbb68c2ad754e149af5b30794e2de61c978ab1de1ace03c0c40f443ca9b9b8044f81 languageName: node linkType: hard -"bcp-47-match@npm:^2.0.0": - version: 2.0.3 - resolution: "bcp-47-match@npm:2.0.3" - checksum: 10c0/ae5c202854df8a9ad4777dc3b49562578495a69164869f365a88c1a089837a9fbbce4c0c44f6f1a5e44c7841f47e91fe6fea00306ca49ce5ec95a7eb71f839c4 +"mdast-util-phrasing@npm:^4.0.0": + version: 4.1.0 + resolution: "mdast-util-phrasing@npm:4.1.0" + dependencies: + "@types/mdast": "npm:^4.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/bf6c31d51349aa3d74603d5e5a312f59f3f65662ed16c58017169a5fb0f84ca98578f626c5ee9e4aa3e0a81c996db8717096705521bddb4a0185f98c12c9b42f languageName: node linkType: hard -"bcp-47@npm:^2.1.0": - version: 2.1.0 - resolution: "bcp-47@npm:2.1.0" +"mdast-util-to-hast@npm:^13.0.0": + version: 13.2.0 + resolution: "mdast-util-to-hast@npm:13.2.0" dependencies: - is-alphabetical: "npm:^2.0.0" - is-alphanumerical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - checksum: 10c0/0b461b6d5bad215665e59bc57c4e1489312da541612558629e4f3d3538b16ce6c2709a4b62ec9ed6fca7a339740c27df6a454d5821a849b3df5ff7e697372885 + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + trim-lines: "npm:^3.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/9ee58def9287df8350cbb6f83ced90f9c088d72d4153780ad37854f87144cadc6f27b20347073b285173b1649b0723ddf0b9c78158608a804dcacb6bda6e1816 languageName: node linkType: hard -"blob-to-buffer@npm:^1.2.8": - version: 1.2.9 - resolution: "blob-to-buffer@npm:1.2.9" - checksum: 10c0/ff8d3327f030fcd98b28c7557158721bc36b2102452bb4d8808d7bf497a6feee34623a40f80ec8a097851c866369fc76ef948cee4e78373f34738b70ab3f8cf6 +"mdast-util-to-hast@npm:^13.2.1": + version: 13.2.1 + resolution: "mdast-util-to-hast@npm:13.2.1" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + trim-lines: "npm:^3.0.0" + unist-util-position: "npm:^5.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/3eeaf28a5e84e1e08e6d54a1a8a06c0fca88cb5d36f4cf8086f0177248d1ce6e4e751f4ad0da19a3dea1c6ea61bd80784acc3ae021e44ceeb21aa5413a375e43 languageName: node linkType: hard -"boolbase@npm:^1.0.0": - version: 1.0.0 - resolution: "boolbase@npm:1.0.0" - checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.2 + resolution: "mdast-util-to-markdown@npm:2.1.2" + dependencies: + "@types/mdast": "npm:^4.0.0" + "@types/unist": "npm:^3.0.0" + longest-streak: "npm:^3.0.0" + mdast-util-phrasing: "npm:^4.0.0" + mdast-util-to-string: "npm:^4.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-decode-string: "npm:^2.0.0" + unist-util-visit: "npm:^5.0.0" + zwitch: "npm:^2.0.0" + checksum: 10c0/4649722a6099f12e797bd8d6469b2b43b44e526b5182862d9c7766a3431caad2c0112929c538a972f214e63c015395e5d3f54bd81d9ac1b16e6d8baaf582f749 languageName: node linkType: hard -"boxen@npm:8.0.1": - version: 8.0.1 - resolution: "boxen@npm:8.0.1" +"mdast-util-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-to-string@npm:4.0.0" dependencies: - ansi-align: "npm:^3.0.1" - camelcase: "npm:^8.0.0" - chalk: "npm:^5.3.0" - cli-boxes: "npm:^3.0.0" - string-width: "npm:^7.2.0" - type-fest: "npm:^4.21.0" - widest-line: "npm:^5.0.0" - wrap-ansi: "npm:^9.0.0" - checksum: 10c0/8c54f9797bf59eec0b44c9043d9cb5d5b2783dc673e4650235e43a5155c43334e78ec189fd410cf92056c1054aee3758279809deed115b49e68f1a1c6b3faa32 + "@types/mdast": "npm:^4.0.0" + checksum: 10c0/2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7 languageName: node linkType: hard -"brace-expansion@npm:^2.0.1": - version: 2.0.2 - resolution: "brace-expansion@npm:2.0.2" +"micromark-core-commonmark@npm:^2.0.0": + version: 2.0.3 + resolution: "micromark-core-commonmark@npm:2.0.3" dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-factory-destination: "npm:^2.0.0" + micromark-factory-label: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-factory-title: "npm:^2.0.0" + micromark-factory-whitespace: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-html-tag-name: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-subtokenize: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bd4a794fdc9e88dbdf59eaf1c507ddf26e5f7ddf4e52566c72239c0f1b66adbcd219ba2cd42350debbe24471434d5f5e50099d2b3f4e5762ca222ba8e5b549ee languageName: node linkType: hard -"brotli@npm:^1.3.2": - version: 1.3.3 - resolution: "brotli@npm:1.3.3" +"micromark-extension-gfm-autolink-literal@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" dependencies: - base64-js: "npm:^1.1.2" - checksum: 10c0/9d24e24f8b7eabf44af034ed5f7d5530008b835f09a107a84ac060723e86dd43c6aa68958691fe5df524f59473b35f5ce2e0854aa1152c0a254d1010f51bcf22 + micromark-util-character: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/84e6fbb84ea7c161dfa179665dc90d51116de4c28f3e958260c0423e5a745372b7dcbc87d3cde98213b532e6812f847eef5ae561c9397d7f7da1e59872ef3efe languageName: node linkType: hard -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" +"micromark-extension-gfm-footnote@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-footnote@npm:2.1.0" dependencies: - "@npmcli/fs": "npm:^4.0.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^7.0.2" - ssri: "npm:^12.0.0" - tar: "npm:^7.4.3" - unique-filename: "npm:^4.0.0" - checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c - languageName: node - linkType: hard - -"camelcase@npm:^8.0.0": - version: 8.0.0 - resolution: "camelcase@npm:8.0.0" - checksum: 10c0/56c5fe072f0523c9908cdaac21d4a3b3fb0f608fb2e9ba90a60e792b95dd3bb3d1f3523873ab17d86d146e94171305f73ef619e2f538bd759675bc4a14b4bff3 + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc languageName: node linkType: hard -"ccount@npm:^2.0.0": - version: 2.0.1 - resolution: "ccount@npm:2.0.1" - checksum: 10c0/3939b1664390174484322bc3f45b798462e6c07ee6384cb3d645e0aa2f318502d174845198c1561930e1d431087f74cf1fe291ae9a4722821a9f4ba67e574350 - languageName: node - linkType: hard - -"chalk@npm:^5.3.0": - version: 5.4.1 - resolution: "chalk@npm:5.4.1" - checksum: 10c0/b23e88132c702f4855ca6d25cb5538b1114343e41472d5263ee8a37cccfccd9c4216d111e1097c6a27830407a1dc81fecdf2a56f2c63033d4dbbd88c10b0dcef - languageName: node - linkType: hard - -"character-entities-html4@npm:^2.0.0": +"micromark-extension-gfm-strikethrough@npm:^2.0.0": version: 2.1.0 - resolution: "character-entities-html4@npm:2.1.0" - checksum: 10c0/fe61b553f083400c20c0b0fd65095df30a0b445d960f3bbf271536ae6c3ba676f39cb7af0b4bf2755812f08ab9b88f2feed68f9aebb73bb153f7a115fe5c6e40 - languageName: node - linkType: hard - -"character-entities-legacy@npm:^3.0.0": - version: 3.0.0 - resolution: "character-entities-legacy@npm:3.0.0" - checksum: 10c0/ec4b430af873661aa754a896a2b55af089b4e938d3d010fad5219299a6b6d32ab175142699ee250640678cd64bdecd6db3c9af0b8759ab7b155d970d84c4c7d1 - languageName: node - linkType: hard - -"character-entities@npm:^2.0.0": - version: 2.0.2 - resolution: "character-entities@npm:2.0.2" - checksum: 10c0/b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308 - languageName: node - linkType: hard - -"character-reference-invalid@npm:^2.0.0": - version: 2.0.1 - resolution: "character-reference-invalid@npm:2.0.1" - checksum: 10c0/2ae0dec770cd8659d7e8b0ce24392d83b4c2f0eb4a3395c955dce5528edd4cc030a794cfa06600fcdd700b3f2de2f9b8e40e309c0011c4180e3be64a0b42e6a1 - languageName: node - linkType: hard - -"chokidar@npm:^4.0.3": - version: 4.0.3 - resolution: "chokidar@npm:4.0.3" + resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" dependencies: - readdirp: "npm:^4.0.1" - checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad - languageName: node - linkType: hard - -"chownr@npm:^3.0.0": - version: 3.0.0 - resolution: "chownr@npm:3.0.0" - checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 - languageName: node - linkType: hard - -"ci-info@npm:^4.2.0": - version: 4.2.0 - resolution: "ci-info@npm:4.2.0" - checksum: 10c0/37a2f4b6a213a5cf835890eb0241f0d5b022f6cfefde58a69e9af8e3a0e71e06d6ad7754b0d4efb9cd2613e58a7a33996d71b56b0d04242722e86666f3f3d058 - languageName: node - linkType: hard - -"cli-boxes@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-boxes@npm:3.0.0" - checksum: 10c0/4db3e8fbfaf1aac4fb3a6cbe5a2d3fa048bee741a45371b906439b9ffc821c6e626b0f108bdcd3ddf126a4a319409aedcf39a0730573ff050fdd7b6731e99fb9 - languageName: node - linkType: hard - -"clone@npm:^2.1.2": - version: 2.1.2 - resolution: "clone@npm:2.1.2" - checksum: 10c0/ed0601cd0b1606bc7d82ee7175b97e68d1dd9b91fd1250a3617b38d34a095f8ee0431d40a1a611122dcccb4f93295b4fdb94942aa763392b5fe44effa50c2d5e + devlop: "npm:^1.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-classify-character: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/ef4f248b865bdda71303b494671b7487808a340b25552b11ca6814dff3fcfaab9be8d294643060bbdb50f79313e4a686ab18b99cbe4d3ee8a4170fcd134234fb languageName: node linkType: hard -"clsx@npm:^2.1.1": +"micromark-extension-gfm-table@npm:^2.0.0": version: 2.1.1 - resolution: "clsx@npm:2.1.1" - checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 - languageName: node - linkType: hard - -"collapse-white-space@npm:^2.0.0": - version: 2.1.0 - resolution: "collapse-white-space@npm:2.1.0" - checksum: 10c0/b2e2800f4ab261e62eb27a1fbe853378296e3a726d6695117ed033e82d61fb6abeae4ffc1465d5454499e237005de9cfc52c9562dc7ca4ac759b9a222ef14453 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"color-string@npm:^1.9.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" + resolution: "micromark-extension-gfm-table@npm:2.1.1" dependencies: - color-name: "npm:^1.0.0" - simple-swizzle: "npm:^0.2.2" - checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404 + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/04bc00e19b435fa0add62cd029d8b7eb6137522f77832186b1d5ef34544a9bd030c9cf85e92ddfcc5c31f6f0a58a43d4b96dba4fc21316037c734630ee12c912 languageName: node linkType: hard -"color@npm:^4.2.3": - version: 4.2.3 - resolution: "color@npm:4.2.3" +"micromark-extension-gfm-tagfilter@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" dependencies: - color-convert: "npm:^2.0.1" - color-string: "npm:^1.9.0" - checksum: 10c0/7fbe7cfb811054c808349de19fb380252e5e34e61d7d168ec3353e9e9aacb1802674bddc657682e4e9730c2786592a4de6f8283e7e0d3870b829bb0b7b2f6118 - languageName: node - linkType: hard - -"comma-separated-tokens@npm:^2.0.0": - version: 2.0.3 - resolution: "comma-separated-tokens@npm:2.0.3" - checksum: 10c0/91f90f1aae320f1755d6957ef0b864fe4f54737f3313bd95e0802686ee2ca38bff1dd381964d00ae5db42912dd1f4ae5c2709644e82706ffc6f6842a813cdd67 - languageName: node - linkType: hard - -"common-ancestor-path@npm:^1.0.1": - version: 1.0.1 - resolution: "common-ancestor-path@npm:1.0.1" - checksum: 10c0/390c08d2a67a7a106d39499c002d827d2874966d938012453fd7ca34cd306881e2b9d604f657fa7a8e6e4896d67f39ebc09bf1bfd8da8ff318e0fb7a8752c534 - languageName: node - linkType: hard - -"cookie-es@npm:^1.2.2": - version: 1.2.2 - resolution: "cookie-es@npm:1.2.2" - checksum: 10c0/210eb67cd40a53986fda99d6f47118cfc45a69c4abc03490d15ab1b83ac978d5518356aecdd7a7a4969292445e3063c2302deda4c73706a67edc008127608638 - languageName: node - linkType: hard - -"cookie@npm:^1.0.2": - version: 1.0.2 - resolution: "cookie@npm:1.0.2" - checksum: 10c0/fd25fe79e8fbcfcaf6aa61cd081c55d144eeeba755206c058682257cb38c4bd6795c6620de3f064c740695bb65b7949ebb1db7a95e4636efb8357a335ad3f54b + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d languageName: node linkType: hard -"cross-fetch@npm:^3.0.4": - version: 3.2.0 - resolution: "cross-fetch@npm:3.2.0" +"micromark-extension-gfm-task-list-item@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" dependencies: - node-fetch: "npm:^2.7.0" - checksum: 10c0/d8596adf0269130098a676f6739a0922f3cc7b71cc89729925411ebe851a87026171c82ea89154c4811c9867c01c44793205a52e618ce2684650218c7fbeeb9f + devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f languageName: node linkType: hard -"cross-spawn@npm:^7.0.6": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" +"micromark-extension-gfm@npm:^3.0.0": + version: 3.0.0 + resolution: "micromark-extension-gfm@npm:3.0.0" dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + micromark-extension-gfm-autolink-literal: "npm:^2.0.0" + micromark-extension-gfm-footnote: "npm:^2.0.0" + micromark-extension-gfm-strikethrough: "npm:^2.0.0" + micromark-extension-gfm-table: "npm:^2.0.0" + micromark-extension-gfm-tagfilter: "npm:^2.0.0" + micromark-extension-gfm-task-list-item: "npm:^2.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9 languageName: node linkType: hard -"crossws@npm:^0.3.4": - version: 0.3.5 - resolution: "crossws@npm:0.3.5" +"micromark-factory-destination@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" dependencies: - uncrypto: "npm:^0.1.3" - checksum: 10c0/9e873546f0806606c4f775219f6811768fc3b3b0765ca8230722e849058ad098318af006e1faa39a8008c03009c37c519f6bccad41b0d78586237585c75fb38b - languageName: node - linkType: hard - -"css-selector-parser@npm:^3.0.0": - version: 3.1.2 - resolution: "css-selector-parser@npm:3.1.2" - checksum: 10c0/4164e68a3684a834feda10665bc85b107c7fd64625c055dca1eab403169bf531cde3425ac4b869633fe536677a90debb5bc85511ff8f464e3acb8f5cb57c3169 + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c languageName: node linkType: hard -"css-tree@npm:^3.0.0": - version: 3.1.0 - resolution: "css-tree@npm:3.1.0" +"micromark-factory-label@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" dependencies: - mdn-data: "npm:2.12.2" - source-map-js: "npm:^1.0.1" - checksum: 10c0/b5715852c2f397c715ca00d56ec53fc83ea596295ae112eb1ba6a1bda3b31086380e596b1d8c4b980fe6da09e7d0fc99c64d5bb7313030dd0fba9c1415f30979 - languageName: node - linkType: hard - -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + devlop: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8 languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.3.4, debug@npm:^4.4.0": - version: 4.4.1 - resolution: "debug@npm:4.4.1" +"micromark-factory-space@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 + micromark-util-character: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb languageName: node linkType: hard -"decode-named-character-reference@npm:^1.0.0": - version: 1.1.0 - resolution: "decode-named-character-reference@npm:1.1.0" +"micromark-factory-title@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" dependencies: - character-entities: "npm:^2.0.0" - checksum: 10c0/359c76305b47e67660ec096c5cd3f65972ed75b8a53a40435a7a967cfab3e9516e64b443cbe0c7edcf5ab77f65a6924f12fb1872b1e09e2f044f28f4fd10996a - languageName: node - linkType: hard - -"defu@npm:^6.1.4": - version: 6.1.4 - resolution: "defu@npm:6.1.4" - checksum: 10c0/2d6cc366262dc0cb8096e429368e44052fdf43ed48e53ad84cc7c9407f890301aa5fcb80d0995abaaf842b3949f154d060be4160f7a46cb2bc2f7726c81526f5 - languageName: node - linkType: hard - -"dequal@npm:^2.0.0": - version: 2.0.3 - resolution: "dequal@npm:2.0.3" - checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 - languageName: node - linkType: hard - -"destr@npm:^2.0.3, destr@npm:^2.0.5": - version: 2.0.5 - resolution: "destr@npm:2.0.5" - checksum: 10c0/efabffe7312a45ad90d79975376be958c50069f1156b94c181199763a7f971e113bd92227c26b94a169c71ca7dbc13583b7e96e5164743969fc79e1ff153e646 - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.3": - version: 2.0.4 - resolution: "detect-libc@npm:2.0.4" - checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6 languageName: node linkType: hard -"deterministic-object-hash@npm:^2.0.2": - version: 2.0.2 - resolution: "deterministic-object-hash@npm:2.0.2" +"micromark-factory-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" dependencies: - base-64: "npm:^1.0.0" - checksum: 10c0/072010ec12981ba8d6018a6bc540aa66aceb35f922fd5c394d021b76f4489ffc447579dd29ce0f01186c3acb26d0655f3b8c81e302fccae8f2c47f393c7a4294 - languageName: node - linkType: hard - -"devalue@npm:^5.1.1": - version: 5.1.1 - resolution: "devalue@npm:5.1.1" - checksum: 10c0/f6717a856fd54216959abd341cb189e47a9b37d72d8419e055ae77567ff4ed0fb683b1ffb6a71067f645adae5991bffabe6468a3e2385937bff49273e71c1f51 + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224 languageName: node linkType: hard -"devlop@npm:^1.0.0, devlop@npm:^1.1.0": - version: 1.1.0 - resolution: "devlop@npm:1.1.0" +"micromark-util-character@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" dependencies: - dequal: "npm:^2.0.0" - checksum: 10c0/e0928ab8f94c59417a2b8389c45c55ce0a02d9ac7fd74ef62d01ba48060129e1d594501b77de01f3eeafc7cb00773819b0df74d96251cf20b31c5b3071f45c0e - languageName: node - linkType: hard - -"dfa@npm:^1.2.0": - version: 1.2.0 - resolution: "dfa@npm:1.2.0" - checksum: 10c0/ad12f0bc73b530876672e0a9dfbaa350eeff0c876580042734a004e462eca86d7749b9dedf6b067ba54f346137ab23d16615826bbfa424a3e01ab0e2786fad3c - languageName: node - linkType: hard - -"diff@npm:^5.2.0": - version: 5.2.0 - resolution: "diff@npm:5.2.0" - checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4 + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/d3fe7a5e2c4060fc2a076f9ce699c82a2e87190a3946e1e5eea77f563869b504961f5668d9c9c014724db28ac32fa909070ea8b30c3a39bd0483cc6c04cc76a1 languageName: node linkType: hard -"direction@npm:^2.0.0": +"micromark-util-chunked@npm:^2.0.0": version: 2.0.1 - resolution: "direction@npm:2.0.1" - bin: - direction: cli.js - checksum: 10c0/dce809431cad978e0778769a3818ea797ebe0bd542c85032ad9ad98971e2021a146be62feb259d7ffe4b76739e07b23e861b29c3f184ac8d38cc6ba956d5c586 - languageName: node - linkType: hard - -"dlv@npm:^1.1.3": - version: 1.1.3 - resolution: "dlv@npm:1.1.3" - checksum: 10c0/03eb4e769f19a027fd5b43b59e8a05e3fd2100ac239ebb0bf9a745de35d449e2f25cfaf3aa3934664551d72856f4ae8b7822016ce5c42c2d27c18ae79429ec42 - languageName: node - linkType: hard - -"dset@npm:^3.1.4": - version: 3.1.4 - resolution: "dset@npm:3.1.4" - checksum: 10c0/b67bbd28dd8a539e90c15ffb61100eb64ef995c5270a124d4f99bbb53f4d82f55a051b731ba81f3215dd9dce2b4c8d69927dc20b3be1c5fc88bab159467aa438 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"emoji-regex@npm:^10.3.0": - version: 10.4.0 - resolution: "emoji-regex@npm:10.4.0" - checksum: 10c0/a3fcedfc58bfcce21a05a5f36a529d81e88d602100145fcca3dc6f795e3c8acc4fc18fe773fbf9b6d6e9371205edb3afa2668ec3473fa2aa7fd47d2a9d46482d - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" + resolution: "micromark-util-chunked@npm:2.0.1" dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"entities@npm:^6.0.0": - version: 6.0.1 - resolution: "entities@npm:6.0.1" - checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56 languageName: node linkType: hard -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.6.0": - version: 1.7.0 - resolution: "es-module-lexer@npm:1.7.0" - checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b - languageName: node - linkType: hard - -"esast-util-from-estree@npm:^2.0.0": - version: 2.0.0 - resolution: "esast-util-from-estree@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - devlop: "npm:^1.0.0" - estree-util-visit: "npm:^2.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - checksum: 10c0/6c619bc6963314f8f64b32e3b101b321bf121f659e62b11e70f425619c2db6f1d25f4c594a57fd00908da96c67d9bfbf876eb5172abf9e13f47a71796f6630ff - languageName: node - linkType: hard - -"esast-util-from-js@npm:^2.0.0": - version: 2.0.1 - resolution: "esast-util-from-js@npm:2.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - acorn: "npm:^8.0.0" - esast-util-from-estree: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/3a446fb0b0d7bcd7e0157aa44b3b692802a08c93edbea81cc0f7fe4437bfdfb4b72e4563fe63b4e36d390086b71185dba4ac921f4180cc6349985c263cc74421 - languageName: node - linkType: hard - -"esbuild@npm:^0.25.0": - version: 0.25.5 - resolution: "esbuild@npm:0.25.5" - dependencies: - "@esbuild/aix-ppc64": "npm:0.25.5" - "@esbuild/android-arm": "npm:0.25.5" - "@esbuild/android-arm64": "npm:0.25.5" - "@esbuild/android-x64": "npm:0.25.5" - "@esbuild/darwin-arm64": "npm:0.25.5" - "@esbuild/darwin-x64": "npm:0.25.5" - "@esbuild/freebsd-arm64": "npm:0.25.5" - "@esbuild/freebsd-x64": "npm:0.25.5" - "@esbuild/linux-arm": "npm:0.25.5" - "@esbuild/linux-arm64": "npm:0.25.5" - "@esbuild/linux-ia32": "npm:0.25.5" - "@esbuild/linux-loong64": "npm:0.25.5" - "@esbuild/linux-mips64el": "npm:0.25.5" - "@esbuild/linux-ppc64": "npm:0.25.5" - "@esbuild/linux-riscv64": "npm:0.25.5" - "@esbuild/linux-s390x": "npm:0.25.5" - "@esbuild/linux-x64": "npm:0.25.5" - "@esbuild/netbsd-arm64": "npm:0.25.5" - "@esbuild/netbsd-x64": "npm:0.25.5" - "@esbuild/openbsd-arm64": "npm:0.25.5" - "@esbuild/openbsd-x64": "npm:0.25.5" - "@esbuild/sunos-x64": "npm:0.25.5" - "@esbuild/win32-arm64": "npm:0.25.5" - "@esbuild/win32-ia32": "npm:0.25.5" - "@esbuild/win32-x64": "npm:0.25.5" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/aba8cbc11927fa77562722ed5e95541ce2853f67ad7bdc40382b558abc2e0ec57d92ffb820f082ba2047b4ef9f3bc3da068cdebe30dfd3850cfa3827a78d604e - languageName: node - linkType: hard - -"escape-string-regexp@npm:^5.0.0": - version: 5.0.0 - resolution: "escape-string-regexp@npm:5.0.0" - checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 - languageName: node - linkType: hard - -"estree-util-attach-comments@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-attach-comments@npm:3.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/ee69bb5c45e2ad074725b90ed181c1c934b29d81bce4b0c7761431e83c4c6ab1b223a6a3d6a4fbeb92128bc5d5ee201d5dd36cf1770aa5e16a40b0cf36e8a1f1 - languageName: node - linkType: hard - -"estree-util-build-jsx@npm:^3.0.0": - version: 3.0.1 - resolution: "estree-util-build-jsx@npm:3.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - estree-walker: "npm:^3.0.0" - checksum: 10c0/274c119817b8e7caa14a9778f1e497fea56cdd2b01df1a1ed037f843178992d3afe85e0d364d485e1e2e239255763553d1b647b15e4a7ba50851bcb43dc6bf80 - languageName: node - linkType: hard - -"estree-util-is-identifier-name@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-is-identifier-name@npm:3.0.0" - checksum: 10c0/d1881c6ed14bd588ebd508fc90bf2a541811dbb9ca04dec2f39d27dcaa635f85b5ed9bbbe7fc6fb1ddfca68744a5f7c70456b4b7108b6c4c52780631cc787c5b - languageName: node - linkType: hard - -"estree-util-scope@npm:^1.0.0": - version: 1.0.0 - resolution: "estree-util-scope@npm:1.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - checksum: 10c0/ef8a573cc899277c613623a1722f630e2163abbc6e9e2f49e758c59b81b484e248b585df6df09a38c00fbfb6390117997cc80c1347b7a86bc1525d9e462b60d5 - languageName: node - linkType: hard - -"estree-util-to-js@npm:^2.0.0": - version: 2.0.0 - resolution: "estree-util-to-js@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - astring: "npm:^1.8.0" - source-map: "npm:^0.7.0" - checksum: 10c0/ac88cb831401ef99e365f92f4af903755d56ae1ce0e0f0fb8ff66e678141f3d529194f0fb15f6c78cd7554c16fda36854df851d58f9e05cfab15bddf7a97cea0 - languageName: node - linkType: hard - -"estree-util-visit@npm:^2.0.0": - version: 2.0.0 - resolution: "estree-util-visit@npm:2.0.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/unist": "npm:^3.0.0" - checksum: 10c0/acda8b03cc8f890d79c7c7361f6c95331ba84b7ccc0c32b49f447fc30206b20002b37ffdfc97b6ad16e6fe065c63ecbae1622492e2b6b4775c15966606217f39 - languageName: node - linkType: hard - -"estree-walker@npm:^2.0.2": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af - languageName: node - linkType: hard - -"estree-walker@npm:^3.0.0, estree-walker@npm:^3.0.3": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d - languageName: node - linkType: hard - -"eventemitter3@npm:^5.0.1": - version: 5.0.1 - resolution: "eventemitter3@npm:5.0.1" - checksum: 10c0/4ba5c00c506e6c786b4d6262cfbce90ddc14c10d4667e5c83ae993c9de88aa856033994dd2b35b83e8dc1170e224e66a319fa80adc4c32adcd2379bbc75da814 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.2 - resolution: "exponential-backoff@npm:3.1.2" - checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 - languageName: node - linkType: hard - -"expressive-code@npm:^0.41.2": - version: 0.41.2 - resolution: "expressive-code@npm:0.41.2" - dependencies: - "@expressive-code/core": "npm:^0.41.2" - "@expressive-code/plugin-frames": "npm:^0.41.2" - "@expressive-code/plugin-shiki": "npm:^0.41.2" - "@expressive-code/plugin-text-markers": "npm:^0.41.2" - checksum: 10c0/15d8fd5291eb6c20ebcc6af8d2b570f9acfb4b176ddd9076679af2d74cbff4e9d6ee1a38956eedacc8c63692d615d8486160a42f57e609c6a40f80316efc5cc7 - languageName: node - linkType: hard - -"extend@npm:^3.0.0": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fdir@npm:^6.4.4": - version: 6.4.6 - resolution: "fdir@npm:6.4.6" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9 - languageName: node - linkType: hard - -"flattie@npm:^1.1.1": - version: 1.1.1 - resolution: "flattie@npm:1.1.1" - checksum: 10c0/a8f8242c7af126cb2f1aa4a067af338fce609fc4c4df183c626fcc70a46c1878ce4aa88cd0dc8ef8f583ad4e7088a3b11ebeb6a62c9c97d75c0b1b0f08182ee3 - languageName: node - linkType: hard - -"fontace@npm:~0.3.0": - version: 0.3.0 - resolution: "fontace@npm:0.3.0" - dependencies: - "@types/fontkit": "npm:^2.0.8" - fontkit: "npm:^2.0.4" - checksum: 10c0/a81bef4f20c4bb6bb2cb7777d6fa267edb341b1b4c549b0918473d399c2314bf482f098d8ba0ae839bdfc8b63daa78815b647fd781157cb2d8bfc78c56a9745a - languageName: node - linkType: hard - -"fontkit@npm:^2.0.2, fontkit@npm:^2.0.4": - version: 2.0.4 - resolution: "fontkit@npm:2.0.4" - dependencies: - "@swc/helpers": "npm:^0.5.12" - brotli: "npm:^1.3.2" - clone: "npm:^2.1.2" - dfa: "npm:^1.2.0" - fast-deep-equal: "npm:^3.1.3" - restructure: "npm:^3.0.0" - tiny-inflate: "npm:^1.0.3" - unicode-properties: "npm:^1.4.0" - unicode-trie: "npm:^2.0.0" - checksum: 10c0/e68940a0801daa53a4bd160fc49814eeea5eab4dc67225b43064548d35939be9f14de17213bc1a88064adf81b6dfbdb53bda7189df1d07a3ad044482e7fd55e4 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.1": - version: 3.3.1 - resolution: "foreground-child@npm:3.3.1" - dependencies: - cross-spawn: "npm:^7.0.6" - signal-exit: "npm:^4.0.1" - checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"get-east-asian-width@npm:^1.0.0": - version: 1.3.0 - resolution: "get-east-asian-width@npm:1.3.0" - checksum: 10c0/1a049ba697e0f9a4d5514c4623781c5246982bdb61082da6b5ae6c33d838e52ce6726407df285cdbb27ec1908b333cf2820989bd3e986e37bb20979437fdf34b - languageName: node - linkType: hard - -"github-slugger@npm:^2.0.0": - version: 2.0.0 - resolution: "github-slugger@npm:2.0.0" - checksum: 10c0/21b912b6b1e48f1e5a50b2292b48df0ff6abeeb0691b161b3d93d84f4ae6b1acd6ae23702e914af7ea5d441c096453cf0f621b72d57893946618d21dd1a1c486 - languageName: node - linkType: hard - -"glob@npm:^10.2.2": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e - languageName: node - linkType: hard - -"glob@npm:^11.0.3": - version: 11.0.3 - resolution: "glob@npm:11.0.3" - dependencies: - foreground-child: "npm:^3.3.1" - jackspeak: "npm:^4.1.1" - minimatch: "npm:^10.0.3" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^2.0.0" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/7d24457549ec2903920dfa3d8e76850e7c02aa709122f0164b240c712f5455c0b457e6f2a1eee39344c6148e39895be8094ae8cfef7ccc3296ed30bce250c661 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"h3@npm:^1.15.2": - version: 1.15.3 - resolution: "h3@npm:1.15.3" - dependencies: - cookie-es: "npm:^1.2.2" - crossws: "npm:^0.3.4" - defu: "npm:^6.1.4" - destr: "npm:^2.0.5" - iron-webcrypto: "npm:^1.2.1" - node-mock-http: "npm:^1.0.0" - radix3: "npm:^1.1.2" - ufo: "npm:^1.6.1" - uncrypto: "npm:^0.1.3" - checksum: 10c0/4b83daceda6f39cd508d56382dc3a83ef14453d0119ada290c7fda3c69d907ccaf2547fd233f3e001a9ffae2cde4e2543e4361d714c29fb6ec664f604d5b84a3 - languageName: node - linkType: hard - -"hast-util-embedded@npm:^3.0.0": - version: 3.0.0 - resolution: "hast-util-embedded@npm:3.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-is-element: "npm:^3.0.0" - checksum: 10c0/054c3d3b96fcd5c1d1c6f8d38ce1f7f33022ba6362129a022673d0b539f876acdcababbb9df29812fb927294f98ef7a2f44519a80d637fe3eea1819c9e69eeac - languageName: node - linkType: hard - -"hast-util-format@npm:^1.0.0": - version: 1.1.0 - resolution: "hast-util-format@npm:1.1.0" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-embedded: "npm:^3.0.0" - hast-util-minify-whitespace: "npm:^1.0.0" - hast-util-phrasing: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - html-whitespace-sensitive-tag-names: "npm:^3.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 10c0/6ab223cffe8a524ef4f2564d0385cab174a52551513b318496b3776e6882594eab4810b0f8d90f20e8291fa4e87fa068e03cba316d83c0836dab12dd140e98df - languageName: node - linkType: hard - -"hast-util-from-html@npm:^2.0.0, hast-util-from-html@npm:^2.0.1, hast-util-from-html@npm:^2.0.3": - version: 2.0.3 - resolution: "hast-util-from-html@npm:2.0.3" - dependencies: - "@types/hast": "npm:^3.0.0" - devlop: "npm:^1.1.0" - hast-util-from-parse5: "npm:^8.0.0" - parse5: "npm:^7.0.0" - vfile: "npm:^6.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/993ef707c1a12474c8d4094fc9706a72826c660a7e308ea54c50ad893353d32e139b7cbc67510c2e82feac572b320e3b05aeb13d0f9c6302d61261f337b46764 - languageName: node - linkType: hard - -"hast-util-from-parse5@npm:^8.0.0": - version: 8.0.3 - resolution: "hast-util-from-parse5@npm:8.0.3" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - hastscript: "npm:^9.0.0" - property-information: "npm:^7.0.0" - vfile: "npm:^6.0.0" - vfile-location: "npm:^5.0.0" - web-namespaces: "npm:^2.0.0" - checksum: 10c0/40ace6c0ad43c26f721c7499fe408e639cde917b2350c9299635e6326559855896dae3c3ebf7440df54766b96c4276a7823e8f376a2b6a28b37b591f03412545 - languageName: node - linkType: hard - -"hast-util-has-property@npm:^3.0.0": - version: 3.0.0 - resolution: "hast-util-has-property@npm:3.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/6e2c0e22ca893c6ebb60f8390e184c4deb041c36d09796756f02cd121c1789c0f5c862ed06caea8f1a80ea8c0ef6a7854dd57946c2eebb76488727bd4a1c952e - languageName: node - linkType: hard - -"hast-util-is-body-ok-link@npm:^3.0.0": - version: 3.0.1 - resolution: "hast-util-is-body-ok-link@npm:3.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/c320cbd9a9a834b007a6f2f8c271e98b8331c0193adf06e0a7c5ea0acae664e97ce28eb4436e0658bc5cdb8f47390ec1c6cba7c4fe1ded10951fcdd1432f60bf - languageName: node - linkType: hard - -"hast-util-is-element@npm:^3.0.0": - version: 3.0.0 - resolution: "hast-util-is-element@npm:3.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/f5361e4c9859c587ca8eb0d8343492f3077ccaa0f58a44cd09f35d5038f94d65152288dcd0c19336ef2c9491ec4d4e45fde2176b05293437021570aa0bc3613b - languageName: node - linkType: hard - -"hast-util-minify-whitespace@npm:^1.0.0": - version: 1.0.1 - resolution: "hast-util-minify-whitespace@npm:1.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-embedded: "npm:^3.0.0" - hast-util-is-element: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 10c0/20a7d64947e080463084f444ad09c7f28c40e7648ca2d9c6c036e42a67f8e945d352560ff599304c988257c1e477abcf6a1f508c0900211fa58ec1ba21b36533 - languageName: node - linkType: hard - -"hast-util-parse-selector@npm:^4.0.0": - version: 4.0.0 - resolution: "hast-util-parse-selector@npm:4.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f - languageName: node - linkType: hard - -"hast-util-phrasing@npm:^3.0.0": - version: 3.0.1 - resolution: "hast-util-phrasing@npm:3.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-embedded: "npm:^3.0.0" - hast-util-has-property: "npm:^3.0.0" - hast-util-is-body-ok-link: "npm:^3.0.0" - hast-util-is-element: "npm:^3.0.0" - checksum: 10c0/d77e186ea3d7d62f6db9c4a55c3e6d9f1f6affd5f40250e8de9d73f167ae19fcc02fafe1601dfbe36e90f76ed5013ac004f0b6b398aee3a04a7a81de12788600 - languageName: node - linkType: hard - -"hast-util-raw@npm:^9.0.0": - version: 9.1.0 - resolution: "hast-util-raw@npm:9.1.0" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - hast-util-from-parse5: "npm:^8.0.0" - hast-util-to-parse5: "npm:^8.0.0" - html-void-elements: "npm:^3.0.0" - mdast-util-to-hast: "npm:^13.0.0" - parse5: "npm:^7.0.0" - unist-util-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc - languageName: node - linkType: hard - -"hast-util-select@npm:^6.0.2": - version: 6.0.4 - resolution: "hast-util-select@npm:6.0.4" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - bcp-47-match: "npm:^2.0.0" - comma-separated-tokens: "npm:^2.0.0" - css-selector-parser: "npm:^3.0.0" - devlop: "npm:^1.0.0" - direction: "npm:^2.0.0" - hast-util-has-property: "npm:^3.0.0" - hast-util-to-string: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - nth-check: "npm:^2.0.0" - property-information: "npm:^7.0.0" - space-separated-tokens: "npm:^2.0.0" - unist-util-visit: "npm:^5.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/d6829953f829c24ffe465c2b156f6a7cd352f7d9b4d601e0e6ca38b85cc4a720bb9f027d34881c3b2a05f4b55c9375e256dbf43ca88604230da784e1c9c7d03f - languageName: node - linkType: hard - -"hast-util-to-estree@npm:^3.0.0": - version: 3.1.3 - resolution: "hast-util-to-estree@npm:3.1.3" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-attach-comments: "npm:^3.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^7.0.0" - space-separated-tokens: "npm:^2.0.0" - style-to-js: "npm:^1.0.0" - unist-util-position: "npm:^5.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/8e86c075319082c8a6304c5bcdf24ec02466074571e993f58bfa2cfd70850ef46d33b5c402208597a87fe0f02f1e620bda5958217efb1b7396c81c486373b75f - languageName: node - linkType: hard - -"hast-util-to-html@npm:^9.0.0, hast-util-to-html@npm:^9.0.1, hast-util-to-html@npm:^9.0.5": - version: 9.0.5 - resolution: "hast-util-to-html@npm:9.0.5" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - ccount: "npm:^2.0.0" - comma-separated-tokens: "npm:^2.0.0" - hast-util-whitespace: "npm:^3.0.0" - html-void-elements: "npm:^3.0.0" - mdast-util-to-hast: "npm:^13.0.0" - property-information: "npm:^7.0.0" - space-separated-tokens: "npm:^2.0.0" - stringify-entities: "npm:^4.0.0" - zwitch: "npm:^2.0.4" - checksum: 10c0/b7a08c30bab4371fc9b4a620965c40b270e5ae7a8e94cf885f43b21705179e28c8e43b39c72885d1647965fb3738654e6962eb8b58b0c2a84271655b4d748836 - languageName: node - linkType: hard - -"hast-util-to-jsx-runtime@npm:^2.0.0": - version: 2.3.6 - resolution: "hast-util-to-jsx-runtime@npm:2.3.6" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^7.0.0" - space-separated-tokens: "npm:^2.0.0" - style-to-js: "npm:^1.0.0" - unist-util-position: "npm:^5.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/27297e02848fe37ef219be04a26ce708d17278a175a807689e94a821dcffc88aa506d62c3a85beed1f9a8544f7211bdcbcde0528b7b456a57c2e342c3fd11056 - languageName: node - linkType: hard - -"hast-util-to-parse5@npm:^8.0.0": - version: 8.0.0 - resolution: "hast-util-to-parse5@npm:8.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd - languageName: node - linkType: hard - -"hast-util-to-string@npm:^3.0.0": - version: 3.0.1 - resolution: "hast-util-to-string@npm:3.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/b5fa1912a6ba6131affae52a0f4394406c4c0d23c2b0307f1d69988f1030c7bb830289303e67c5ad8f674f5f23a454c1dcd492c39e45a22c1f46d3c9bce5bd0c - languageName: node - linkType: hard - -"hast-util-to-text@npm:^4.0.1, hast-util-to-text@npm:^4.0.2": - version: 4.0.2 - resolution: "hast-util-to-text@npm:4.0.2" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - hast-util-is-element: "npm:^3.0.0" - unist-util-find-after: "npm:^5.0.0" - checksum: 10c0/93ecc10e68fe5391c6e634140eb330942e71dea2724c8e0c647c73ed74a8ec930a4b77043b5081284808c96f73f2bee64ee416038ece75a63a467e8d14f09946 - languageName: node - linkType: hard - -"hast-util-whitespace@npm:^3.0.0": - version: 3.0.0 - resolution: "hast-util-whitespace@npm:3.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/b898bc9fe27884b272580d15260b6bbdabe239973a147e97fa98c45fa0ffec967a481aaa42291ec34fb56530dc2d484d473d7e2bae79f39c83f3762307edfea8 - languageName: node - linkType: hard - -"hastscript@npm:^9.0.0": - version: 9.0.1 - resolution: "hastscript@npm:9.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - hast-util-parse-selector: "npm:^4.0.0" - property-information: "npm:^7.0.0" - space-separated-tokens: "npm:^2.0.0" - checksum: 10c0/18dc8064e5c3a7a2ae862978e626b97a254e1c8a67ee9d0c9f06d373bba155ed805fc5b5ce21b990fb7bc174624889e5e1ce1cade264f1b1d58b48f994bc85ce - languageName: node - linkType: hard - -"html-escaper@npm:3.0.3": - version: 3.0.3 - resolution: "html-escaper@npm:3.0.3" - checksum: 10c0/a042fa4139127ff7546513e90ea39cc9161a1938ce90122dbc4260d4b7252c9aa8452f4509c0c2889901b8ae9a8699179150f1f99d3f80bcf7317573c5f08f4e - languageName: node - linkType: hard - -"html-void-elements@npm:^3.0.0": - version: 3.0.0 - resolution: "html-void-elements@npm:3.0.0" - checksum: 10c0/a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2 - languageName: node - linkType: hard - -"html-whitespace-sensitive-tag-names@npm:^3.0.0": - version: 3.0.1 - resolution: "html-whitespace-sensitive-tag-names@npm:3.0.1" - checksum: 10c0/da06cad111f6a432edd85c6cd09f6b5abbb385872fba79f23f939bdd4626920ac2e62507f604ef94eb8449902033bda292774624e3283b4dea4ed1620a2be3b2 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.2.0 - resolution: "http-cache-semantics@npm:4.2.0" - checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - -"i18next@npm:^23.11.5": - version: 23.16.8 - resolution: "i18next@npm:23.16.8" - dependencies: - "@babel/runtime": "npm:^7.23.2" - checksum: 10c0/57d249191e8a39bbbbe190cfa2e2bb651d0198e14444fe80453d3df8d02927de3c147c77724e9ae6c72fa241898cd761e3fdcd55d053db373471f1ac084bf345 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"import-meta-resolve@npm:^4.1.0": - version: 4.1.0 - resolution: "import-meta-resolve@npm:4.1.0" - checksum: 10c0/42f3284b0460635ddf105c4ad99c6716099c3ce76702602290ad5cbbcd295700cbc04e4bdf47bacf9e3f1a4cec2e1ff887dabc20458bef398f9de22ddff45ef5 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"inline-style-parser@npm:0.2.4": - version: 0.2.4 - resolution: "inline-style-parser@npm:0.2.4" - checksum: 10c0/ddc0b210eaa03e0f98d677b9836242c583c7c6051e84ce0e704ae4626e7871c5b78f8e30853480218b446355745775df318d4f82d33087ff7e393245efa9a881 - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - -"iron-webcrypto@npm:^1.2.1": - version: 1.2.1 - resolution: "iron-webcrypto@npm:1.2.1" - checksum: 10c0/5cf27c6e2bd3ef3b4970e486235fd82491ab8229e2ed0ac23307c28d6c80d721772a86ed4e9fe2a5cabadd710c2f024b706843b40561fb83f15afee58f809f66 - languageName: node - linkType: hard - -"is-alphabetical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphabetical@npm:2.0.1" - checksum: 10c0/932367456f17237533fd1fc9fe179df77957271020b83ea31da50e5cc472d35ef6b5fb8147453274ffd251134472ce24eb6f8d8398d96dee98237cdb81a6c9a7 - languageName: node - linkType: hard - -"is-alphanumerical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphanumerical@npm:2.0.1" - dependencies: - is-alphabetical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - checksum: 10c0/4b35c42b18e40d41378293f82a3ecd9de77049b476f748db5697c297f686e1e05b072a6aaae2d16f54d2a57f85b00cbbe755c75f6d583d1c77d6657bd0feb5a2 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 - languageName: node - linkType: hard - -"is-decimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-decimal@npm:2.0.1" - checksum: 10c0/8085dd66f7d82f9de818fba48b9e9c0429cb4291824e6c5f2622e96b9680b54a07a624cfc663b24148b8e853c62a1c987cfe8b0b5a13f5156991afaf6736e334 - languageName: node - linkType: hard - -"is-docker@npm:^3.0.0": - version: 3.0.0 - resolution: "is-docker@npm:3.0.0" - bin: - is-docker: cli.js - checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-hexadecimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-hexadecimal@npm:2.0.1" - checksum: 10c0/3eb60fe2f1e2bbc760b927dcad4d51eaa0c60138cf7fc671803f66353ad90c301605b502c7ea4c6bb0548e1c7e79dfd37b73b632652e3b76030bba603a7e9626 - languageName: node - linkType: hard - -"is-inside-container@npm:^1.0.0": - version: 1.0.0 - resolution: "is-inside-container@npm:1.0.0" - dependencies: - is-docker: "npm:^3.0.0" - bin: - is-inside-container: cli.js - checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd - languageName: node - linkType: hard - -"is-plain-obj@npm:^4.0.0": - version: 4.1.0 - resolution: "is-plain-obj@npm:4.1.0" - checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e - languageName: node - linkType: hard - -"is-wsl@npm:^3.1.0": - version: 3.1.0 - resolution: "is-wsl@npm:3.1.0" - dependencies: - is-inside-container: "npm:^1.0.0" - checksum: 10c0/d3317c11995690a32c362100225e22ba793678fe8732660c6de511ae71a0ff05b06980cf21f98a6bf40d7be0e9e9506f859abe00a1118287d63e53d0a3d06947 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 - languageName: node - linkType: hard - -"jackspeak@npm:^4.1.1": - version: 4.1.1 - resolution: "jackspeak@npm:4.1.1" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - checksum: 10c0/84ec4f8e21d6514db24737d9caf65361511f75e5e424980eebca4199f400874f45e562ac20fa8aeb1dd20ca2f3f81f0788b6e9c3e64d216a5794fd6f30e0e042 - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b - languageName: node - linkType: hard - -"kleur@npm:^4.1.5": - version: 4.1.5 - resolution: "kleur@npm:4.1.5" - checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a - languageName: node - linkType: hard - -"klona@npm:^2.0.6": - version: 2.0.6 - resolution: "klona@npm:2.0.6" - checksum: 10c0/94eed2c6c2ce99f409df9186a96340558897b3e62a85afdc1ee39103954d2ebe1c1c4e9fe2b0952771771fa96d70055ede8b27962a7021406374fdb695fd4d01 - languageName: node - linkType: hard - -"longest-streak@npm:^3.0.0": - version: 3.1.0 - resolution: "longest-streak@npm:3.1.0" - checksum: 10c0/7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb - languageName: node - linkType: hard - -"lru-cache@npm:^11.0.0": - version: 11.1.0 - resolution: "lru-cache@npm:11.1.0" - checksum: 10c0/85c312f7113f65fae6a62de7985348649937eb34fb3d212811acbf6704dc322a421788aca253b62838f1f07049a84cc513d88f494e373d3756514ad263670a64 - languageName: node - linkType: hard - -"magic-string@npm:^0.30.17": - version: 0.30.17 - resolution: "magic-string@npm:0.30.17" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 - languageName: node - linkType: hard - -"magicast@npm:^0.3.5": - version: 0.3.5 - resolution: "magicast@npm:0.3.5" - dependencies: - "@babel/parser": "npm:^7.25.4" - "@babel/types": "npm:^7.25.4" - source-map-js: "npm:^1.2.0" - checksum: 10c0/a6cacc0a848af84f03e3f5bda7b0de75e4d0aa9ddce5517fd23ed0f31b5ddd51b2d0ff0b7e09b51f7de0f4053c7a1107117edda6b0732dca3e9e39e6c5a68c64 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" - dependencies: - "@npmcli/agent": "npm:^3.0.0" - cacache: "npm:^19.0.1" - http-cache-semantics: "npm:^4.1.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^4.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^1.0.0" - proc-log: "npm:^5.0.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^12.0.0" - checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 - languageName: node - linkType: hard - -"markdown-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "markdown-extensions@npm:2.0.0" - checksum: 10c0/406139da2aa0d5ebad86195c8e8c02412f873c452b4c087ae7bc767af37956141be449998223bb379eea179b5fd38dfa610602b6f29c22ddab5d51e627a7e41d - languageName: node - linkType: hard - -"markdown-table@npm:^3.0.0": - version: 3.0.4 - resolution: "markdown-table@npm:3.0.4" - checksum: 10c0/1257b31827629a54c24a5030a3dac952256c559174c95ce3ef89bebd6bff0cb1444b1fd667b1a1bb53307f83278111505b3e26f0c4e7b731e0060d435d2d930b - languageName: node - linkType: hard - -"mdast-util-definitions@npm:^6.0.0": - version: 6.0.0 - resolution: "mdast-util-definitions@npm:6.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - unist-util-visit: "npm:^5.0.0" - checksum: 10c0/a2e0e51122a3eff4f35379de2c50ee3d8a89bea58488a390b1b40ada95727eb769f87d4bc885e5935d61820d19e0567bc047876db302a2139f3a29668b612b80 - languageName: node - linkType: hard - -"mdast-util-directive@npm:^3.0.0": - version: 3.1.0 - resolution: "mdast-util-directive@npm:3.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - stringify-entities: "npm:^4.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 10c0/596b093b940197cf43af4d0de12e82a1d2b1eb5add73dd16077aa80e0d0e1f208ea642c420726e59ccd352c193d6ecd5c106d6fab769f252617c75333f91a314 - languageName: node - linkType: hard - -"mdast-util-find-and-replace@npm:^3.0.0": - version: 3.0.2 - resolution: "mdast-util-find-and-replace@npm:3.0.2" - dependencies: - "@types/mdast": "npm:^4.0.0" - escape-string-regexp: "npm:^5.0.0" - unist-util-is: "npm:^6.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 10c0/c8417a35605d567772ff5c1aa08363ff3010b0d60c8ea68c53cba09bf25492e3dd261560425c1756535f3b7107f62e7ff3857cdd8fb1e62d1b2cc2ea6e074ca2 - languageName: node - linkType: hard - -"mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.2 - resolution: "mdast-util-from-markdown@npm:2.0.2" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - mdast-util-to-string: "npm:^4.0.0" - micromark: "npm:^4.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-decode-string: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-stringify-position: "npm:^4.0.0" - checksum: 10c0/76eb2bd2c6f7a0318087c73376b8af6d7561c1e16654e7667e640f391341096c56142618fd0ff62f6d39e5ab4895898b9789c84cd7cec2874359a437a0e1ff15 - languageName: node - linkType: hard - -"mdast-util-gfm-autolink-literal@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.0.0" - mdast-util-find-and-replace: "npm:^3.0.0" - micromark-util-character: "npm:^2.0.0" - checksum: 10c0/963cd22bd42aebdec7bdd0a527c9494d024d1ad0739c43dc040fee35bdfb5e29c22564330a7418a72b5eab51d47a6eff32bc0255ef3ccb5cebfe8970e91b81b6 - languageName: node - linkType: hard - -"mdast-util-gfm-footnote@npm:^2.0.0": - version: 2.1.0 - resolution: "mdast-util-gfm-footnote@npm:2.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.1.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - checksum: 10c0/8ab965ee6be3670d76ec0e95b2ba3101fc7444eec47564943ab483d96ac17d29da2a4e6146a2a288be30c21b48c4f3938a1e54b9a46fbdd321d49a5bc0077ed0 - languageName: node - linkType: hard - -"mdast-util-gfm-strikethrough@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056 - languageName: node - linkType: hard - -"mdast-util-gfm-table@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-table@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - markdown-table: "npm:^3.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e - languageName: node - linkType: hard - -"mdast-util-gfm-task-list-item@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834 - languageName: node - linkType: hard - -"mdast-util-gfm@npm:^3.0.0": - version: 3.1.0 - resolution: "mdast-util-gfm@npm:3.1.0" - dependencies: - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-gfm-autolink-literal: "npm:^2.0.0" - mdast-util-gfm-footnote: "npm:^2.0.0" - mdast-util-gfm-strikethrough: "npm:^2.0.0" - mdast-util-gfm-table: "npm:^2.0.0" - mdast-util-gfm-task-list-item: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/4bedcfb6a20e39901c8772f0d2bb2d7a64ae87a54c13cbd92eec062cf470fbb68c2ad754e149af5b30794e2de61c978ab1de1ace03c0c40f443ca9b9b8044f81 - languageName: node - linkType: hard - -"mdast-util-mdx-expression@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-mdx-expression@npm:2.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/9a1e57940f66431f10312fa239096efa7627f375e7933b5d3162c0b5c1712a72ac87447aff2b6838d2bbd5c1311b188718cc90b33b67dc67a88550e0a6ef6183 - languageName: node - linkType: hard - -"mdast-util-mdx-jsx@npm:^3.0.0": - version: 3.2.0 - resolution: "mdast-util-mdx-jsx@npm:3.2.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.1.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - stringify-entities: "npm:^4.0.0" - unist-util-stringify-position: "npm:^4.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/3acadaf3b962254f7ad2990fed4729961dc0217ca31fde9917986e880843f3ecf3392b1f22d569235cacd180d50894ad266db7af598aedca69d330d33c7ac613 - languageName: node - linkType: hard - -"mdast-util-mdx@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-mdx@npm:3.0.0" - dependencies: - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/4faea13f77d6bc9aa64ee41a5e4779110b73444a17fda363df6ebe880ecfa58b321155b71f8801c3faa6d70d6222a32a00cbd6dbf5fad8db417f4688bc9c74e1 - languageName: node - linkType: hard - -"mdast-util-mdxjs-esm@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-mdxjs-esm@npm:2.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/5bda92fc154141705af2b804a534d891f28dac6273186edf1a4c5e3f045d5b01dbcac7400d27aaf91b7e76e8dce007c7b2fdf136c11ea78206ad00bdf9db46bc - languageName: node - linkType: hard - -"mdast-util-phrasing@npm:^4.0.0": - version: 4.1.0 - resolution: "mdast-util-phrasing@npm:4.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 10c0/bf6c31d51349aa3d74603d5e5a312f59f3f65662ed16c58017169a5fb0f84ca98578f626c5ee9e4aa3e0a81c996db8717096705521bddb4a0185f98c12c9b42f - languageName: node - linkType: hard - -"mdast-util-to-hast@npm:^13.0.0": - version: 13.2.0 - resolution: "mdast-util-to-hast@npm:13.2.0" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - trim-lines: "npm:^3.0.0" - unist-util-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/9ee58def9287df8350cbb6f83ced90f9c088d72d4153780ad37854f87144cadc6f27b20347073b285173b1649b0723ddf0b9c78158608a804dcacb6bda6e1816 - languageName: node - linkType: hard - -"mdast-util-to-markdown@npm:^2.0.0, mdast-util-to-markdown@npm:^2.1.0": - version: 2.1.2 - resolution: "mdast-util-to-markdown@npm:2.1.2" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - longest-streak: "npm:^3.0.0" - mdast-util-phrasing: "npm:^4.0.0" - mdast-util-to-string: "npm:^4.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-decode-string: "npm:^2.0.0" - unist-util-visit: "npm:^5.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/4649722a6099f12e797bd8d6469b2b43b44e526b5182862d9c7766a3431caad2c0112929c538a972f214e63c015395e5d3f54bd81d9ac1b16e6d8baaf582f749 - languageName: node - linkType: hard - -"mdast-util-to-string@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-util-to-string@npm:4.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - checksum: 10c0/2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7 - languageName: node - linkType: hard - -"mdn-data@npm:2.12.2": - version: 2.12.2 - resolution: "mdn-data@npm:2.12.2" - checksum: 10c0/b22443b71d70f72ccc3c6ba1608035431a8fc18c3c8fc53523f06d20e05c2ac10f9b53092759a2ca85cf02f0d37036f310b581ce03e7b99ac74d388ef8152ade - languageName: node - linkType: hard - -"micromark-core-commonmark@npm:^2.0.0": - version: 2.0.3 - resolution: "micromark-core-commonmark@npm:2.0.3" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-factory-destination: "npm:^2.0.0" - micromark-factory-label: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-factory-title: "npm:^2.0.0" - micromark-factory-whitespace: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-html-tag-name: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-subtokenize: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bd4a794fdc9e88dbdf59eaf1c507ddf26e5f7ddf4e52566c72239c0f1b66adbcd219ba2cd42350debbe24471434d5f5e50099d2b3f4e5762ca222ba8e5b549ee - languageName: node - linkType: hard - -"micromark-extension-directive@npm:^3.0.0": - version: 3.0.2 - resolution: "micromark-extension-directive@npm:3.0.2" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-factory-whitespace: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - checksum: 10c0/74137485375f02c1b640c2120dd6b9f6aa1e39ca5cd2463df7974ef1cc80203f5ef90448ce009973355a49ba169ef1441eabe57a36877c7b86373788612773da - languageName: node - linkType: hard - -"micromark-extension-gfm-autolink-literal@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/84e6fbb84ea7c161dfa179665dc90d51116de4c28f3e958260c0423e5a745372b7dcbc87d3cde98213b532e6812f847eef5ae561c9397d7f7da1e59872ef3efe - languageName: node - linkType: hard - -"micromark-extension-gfm-footnote@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-footnote@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc - languageName: node - linkType: hard - -"micromark-extension-gfm-strikethrough@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/ef4f248b865bdda71303b494671b7487808a340b25552b11ca6814dff3fcfaab9be8d294643060bbdb50f79313e4a686ab18b99cbe4d3ee8a4170fcd134234fb - languageName: node - linkType: hard - -"micromark-extension-gfm-table@npm:^2.0.0": - version: 2.1.1 - resolution: "micromark-extension-gfm-table@npm:2.1.1" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/04bc00e19b435fa0add62cd029d8b7eb6137522f77832186b1d5ef34544a9bd030c9cf85e92ddfcc5c31f6f0a58a43d4b96dba4fc21316037c734630ee12c912 - languageName: node - linkType: hard - -"micromark-extension-gfm-tagfilter@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d - languageName: node - linkType: hard - -"micromark-extension-gfm-task-list-item@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f - languageName: node - linkType: hard - -"micromark-extension-gfm@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-gfm@npm:3.0.0" - dependencies: - micromark-extension-gfm-autolink-literal: "npm:^2.0.0" - micromark-extension-gfm-footnote: "npm:^2.0.0" - micromark-extension-gfm-strikethrough: "npm:^2.0.0" - micromark-extension-gfm-table: "npm:^2.0.0" - micromark-extension-gfm-tagfilter: "npm:^2.0.0" - micromark-extension-gfm-task-list-item: "npm:^2.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9 - languageName: node - linkType: hard - -"micromark-extension-mdx-expression@npm:^3.0.0": - version: 3.0.1 - resolution: "micromark-extension-mdx-expression@npm:3.0.1" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-factory-mdx-expression: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/4d8cc5353b083b06bd51c98389de9c198261a5b2b440b75e85000a18d10511f21ba77538d6dfde0e0589df9de3fba9a1d14c2448d30c92d6b461c26d86e397f4 - languageName: node - linkType: hard - -"micromark-extension-mdx-jsx@npm:^3.0.0": - version: 3.0.2 - resolution: "micromark-extension-mdx-jsx@npm:3.0.2" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - micromark-factory-mdx-expression: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/5693b2e51934ac29a6aab521eaa2151f891d1fe092550bbd4ce24e4dd7567c1421a54f5e585a57dfa1769a79570f6df57ddd7a98bf0889dd11d495847a266dd7 - languageName: node - linkType: hard - -"micromark-extension-mdx-md@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-mdx-md@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bae91c61273de0e5ba80a980c03470e6cd9d7924aa936f46fbda15d780704d9386e945b99eda200e087b96254fbb4271a9545d5ce02676cd6ae67886a8bf82df - languageName: node - linkType: hard - -"micromark-extension-mdxjs-esm@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdxjs-esm@npm:3.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/13e3f726495a960650cdedcba39198ace5bdc953ccb12c14d71fc9ed9bb88e40cc3ba9231e973f6984da3b3573e7ddb23ce409f7c16f52a8d57b608bf46c748d - languageName: node - linkType: hard - -"micromark-extension-mdxjs@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdxjs@npm:3.0.0" - dependencies: - acorn: "npm:^8.0.0" - acorn-jsx: "npm:^5.0.0" - micromark-extension-mdx-expression: "npm:^3.0.0" - micromark-extension-mdx-jsx: "npm:^3.0.0" - micromark-extension-mdx-md: "npm:^2.0.0" - micromark-extension-mdxjs-esm: "npm:^3.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/fd84f036ddad0aabbc12e7f1b3e9dcfe31573bbc413c5ae903779ef0366d7a4c08193547e7ba75718c9f45654e45f52e575cfc2f23a5f89205a8a70d9a506aea - languageName: node - linkType: hard - -"micromark-factory-destination@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-destination@npm:2.0.1" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c - languageName: node - linkType: hard - -"micromark-factory-label@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-label@npm:2.0.1" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8 - languageName: node - linkType: hard - -"micromark-factory-mdx-expression@npm:^2.0.0": - version: 2.0.3 - resolution: "micromark-factory-mdx-expression@npm:2.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-events-to-acorn: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-position-from-estree: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/a6004ef6272dd01a5d718f2affd7bfb5e08f0849340f5fd96ac823fbc5e9d3b3343acedda50805873ccda5e3b8af4d5fbb302abc874544044ac90c217345cf97 - languageName: node - linkType: hard - -"micromark-factory-space@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-space@npm:2.0.1" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb - languageName: node - linkType: hard - -"micromark-factory-title@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-title@npm:2.0.1" - dependencies: - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6 - languageName: node - linkType: hard - -"micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-whitespace@npm:2.0.1" - dependencies: - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224 - languageName: node - linkType: hard - -"micromark-util-character@npm:^2.0.0": - version: 2.1.1 - resolution: "micromark-util-character@npm:2.1.1" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/d3fe7a5e2c4060fc2a076f9ce699c82a2e87190a3946e1e5eea77f563869b504961f5668d9c9c014724db28ac32fa909070ea8b30c3a39bd0483cc6c04cc76a1 - languageName: node - linkType: hard - -"micromark-util-chunked@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-chunked@npm:2.0.1" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56 - languageName: node - linkType: hard - -"micromark-util-classify-character@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-classify-character@npm:2.0.1" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08 - languageName: node - linkType: hard - -"micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-combine-extensions@npm:2.0.1" - dependencies: - micromark-util-chunked: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7 - languageName: node - linkType: hard - -"micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.2 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df - languageName: node - linkType: hard - -"micromark-util-decode-string@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-string@npm:2.0.1" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb - languageName: node - linkType: hard - -"micromark-util-encode@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-encode@npm:2.0.1" - checksum: 10c0/b2b29f901093845da8a1bf997ea8b7f5e061ffdba85070dfe14b0197c48fda64ffcf82bfe53c90cf9dc185e69eef8c5d41cae3ba918b96bc279326921b59008a - languageName: node - linkType: hard - -"micromark-util-events-to-acorn@npm:^2.0.0": - version: 2.0.3 - resolution: "micromark-util-events-to-acorn@npm:2.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - estree-util-visit: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/a4e0716e943ffdd16a918edf51d4f8291ec2692f5c4d04693dbef3358716fba891f288197afd102c14f4d98dac09d52351046ab7aad1d50b74677bdd5fa683c0 - languageName: node - linkType: hard - -"micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-html-tag-name@npm:2.0.1" - checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9 - languageName: node - linkType: hard - -"micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-normalize-identifier@npm:2.0.1" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd - languageName: node - linkType: hard - -"micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-resolve-all@npm:2.0.1" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a - languageName: node - linkType: hard - -"micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-sanitize-uri@npm:2.0.1" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/60e92166e1870fd4f1961468c2651013ff760617342918e0e0c3c4e872433aa2e60c1e5a672bfe5d89dc98f742d6b33897585cf86ae002cda23e905a3c02527c - languageName: node - linkType: hard - -"micromark-util-subtokenize@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-subtokenize@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bee69eece4393308e657c293ba80d92ebcb637e5f55e21dcf9c3fa732b91a8eda8ac248d76ff375e675175bfadeae4712e5158ef97eef1111789da1ce7ab5067 - languageName: node - linkType: hard - -"micromark-util-symbol@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-symbol@npm:2.0.1" - checksum: 10c0/f2d1b207771e573232436618e78c5e46cd4b5c560dd4a6d63863d58018abbf49cb96ec69f7007471e51434c60de3c9268ef2bf46852f26ff4aacd10f9da16fe9 - languageName: node - linkType: hard - -"micromark-util-types@npm:^2.0.0": - version: 2.0.2 - resolution: "micromark-util-types@npm:2.0.2" - checksum: 10c0/c8c15b96c858db781c4393f55feec10004bf7df95487636c9a9f7209e51002a5cca6a047c5d2a5dc669ff92da20e57aaa881e81a268d9ccadb647f9dce305298 - languageName: node - linkType: hard - -"micromark@npm:^4.0.0": - version: 4.0.2 - resolution: "micromark@npm:4.0.2" - dependencies: - "@types/debug": "npm:^4.0.0" - debug: "npm:^4.0.0" - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-subtokenize: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/07462287254219d6eda6eac8a3cebaff2994e0575499e7088027b825105e096e4f51e466b14b2a81b71933a3b6c48ee069049d87bc2c2127eee50d9cc69e8af6 - languageName: node - linkType: hard - -"minimatch@npm:^10.0.3": - version: 10.0.3 - resolution: "minimatch@npm:10.0.3" - dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10c0/e43e4a905c5d70ac4cec8530ceaeccb9c544b1ba8ac45238e2a78121a01c17ff0c373346472d221872563204eabe929ad02669bb575cb1f0cc30facab369f70f - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^4.0.0": - version: 4.0.1 - resolution: "minipass-fetch@npm:4.0.1" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^3.0.1" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minizlib@npm:^3.0.1": - version: 3.0.2 - resolution: "minizlib@npm:3.0.2" - dependencies: - minipass: "npm:^7.1.2" - checksum: 10c0/9f3bd35e41d40d02469cb30470c55ccc21cae0db40e08d1d0b1dff01cc8cc89a6f78e9c5d2b7c844e485ec0a8abc2238111213fdc5b2038e6d1012eacf316f78 - languageName: node - linkType: hard - -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d - languageName: node - linkType: hard - -"mrmime@npm:^2.0.1": - version: 2.0.1 - resolution: "mrmime@npm:2.0.1" - checksum: 10c0/af05afd95af202fdd620422f976ad67dc18e6ee29beb03dd1ce950ea6ef664de378e44197246df4c7cdd73d47f2e7143a6e26e473084b9e4aa2095c0ad1e1761 - languageName: node - linkType: hard - -"ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.11": - version: 3.3.11 - resolution: "nanoid@npm:3.3.11" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b - languageName: node - linkType: hard - -"negotiator@npm:^1.0.0": - version: 1.0.0 - resolution: "negotiator@npm:1.0.0" - checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b - languageName: node - linkType: hard - -"neotraverse@npm:^0.6.18": - version: 0.6.18 - resolution: "neotraverse@npm:0.6.18" - checksum: 10c0/46f4c53cbbdc53671150916b544a9f46e27781f8003985237507542190173bec131168d89b846535f9c34c0a2a7debb1ab3a4f7a93d08218e2c194a363708ffa - languageName: node - linkType: hard - -"nlcst-to-string@npm:^4.0.0": - version: 4.0.0 - resolution: "nlcst-to-string@npm:4.0.0" - dependencies: - "@types/nlcst": "npm:^2.0.0" - checksum: 10c0/a192c8b3365a7c076812004e72ae5b4a1734e582be2a6f3c062f3beecf18868a9fe2d1bad870bfead320fb39830f2c4f3752e5ae6574c4e59157126fd1ddba70 - languageName: node - linkType: hard - -"node-fetch-native@npm:^1.6.4, node-fetch-native@npm:^1.6.6": - version: 1.6.6 - resolution: "node-fetch-native@npm:1.6.6" - checksum: 10c0/8c12dab0e640d8bc126a03d604af9cf3fc1b87f2cda5af0c71601079d5ed835c1dc149c7042b61c83f252a382e1cf1e541788f4c9e8e6c089af77497190f5dc3 - languageName: node - linkType: hard - -"node-fetch@npm:^2.7.0": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: "npm:^5.0.0" - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 11.2.0 - resolution: "node-gyp@npm:11.2.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^14.0.3" - nopt: "npm:^8.0.0" - proc-log: "npm:^5.0.0" - semver: "npm:^7.3.5" - tar: "npm:^7.4.3" - tinyglobby: "npm:^0.2.12" - which: "npm:^5.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/bd8d8c76b06be761239b0c8680f655f6a6e90b48e44d43415b11c16f7e8c15be346fba0cbf71588c7cdfb52c419d928a7d3db353afc1d952d19756237d8f10b9 - languageName: node - linkType: hard - -"node-mock-http@npm:^1.0.0": - version: 1.0.0 - resolution: "node-mock-http@npm:1.0.0" - checksum: 10c0/cb3fd7c17e7043b87a8d7a9ef1dcd4e2cde312cd224716c5fb3a4b56b48607c257a2e7356e73262db60ebf9e17e23b7a9c5230785f630c6a437090bfd26dd242 - languageName: node - linkType: hard - -"nopt@npm:^8.0.0": - version: 8.1.0 - resolution: "nopt@npm:8.1.0" - dependencies: - abbrev: "npm:^3.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 - languageName: node - linkType: hard - -"nth-check@npm:^2.0.0": - version: 2.1.1 - resolution: "nth-check@npm:2.1.1" - dependencies: - boolbase: "npm:^1.0.0" - checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 - languageName: node - linkType: hard - -"ofetch@npm:^1.4.1": - version: 1.4.1 - resolution: "ofetch@npm:1.4.1" - dependencies: - destr: "npm:^2.0.3" - node-fetch-native: "npm:^1.6.4" - ufo: "npm:^1.5.4" - checksum: 10c0/fd712e84058ad5058a5880fe805e9bb1c2084fb7f9c54afa99a2c7e84065589b4312fa6e2dcca4432865e44ad1ec13fcd055c1bf7977ced838577a45689a04fa - languageName: node - linkType: hard - -"ohash@npm:^2.0.0": - version: 2.0.11 - resolution: "ohash@npm:2.0.11" - checksum: 10c0/d07c8d79cc26da082c1a7c8d5b56c399dd4ed3b2bd069fcae6bae78c99a9bcc3ad813b1e1f49ca2f335292846d689c6141a762cf078727d2302a33d414e69c79 - languageName: node - linkType: hard - -"oniguruma-parser@npm:^0.12.1": - version: 0.12.1 - resolution: "oniguruma-parser@npm:0.12.1" - checksum: 10c0/b843ea54cda833efb19f856314afcbd43e903ece3de489ab78c527ddec84859208052557daa9fad4bdba89ebdd15b0cc250de86b3daf8c7cbe37bac5a6a185d3 - languageName: node - linkType: hard - -"oniguruma-to-es@npm:^4.3.3": - version: 4.3.3 - resolution: "oniguruma-to-es@npm:4.3.3" - dependencies: - oniguruma-parser: "npm:^0.12.1" - regex: "npm:^6.0.1" - regex-recursion: "npm:^6.0.2" - checksum: 10c0/bc034e84dfee4dbc061cf6364023e66e1667fb8dc3afcad3b7d6a2c77e2d4a4809396ee2fb8c1fd3d6f00f76f7ca14b773586bf862c5f0c0074c059e2a219252 - languageName: node - linkType: hard - -"p-limit@npm:^6.2.0": - version: 6.2.0 - resolution: "p-limit@npm:6.2.0" - dependencies: - yocto-queue: "npm:^1.1.1" - checksum: 10c0/448bf55a1776ca1444594d53b3c731e68cdca00d44a6c8df06a2f6e506d5bbd540ebb57b05280f8c8bff992a630ed782a69612473f769a7473495d19e2270166 - languageName: node - linkType: hard - -"p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c - languageName: node - linkType: hard - -"p-queue@npm:^8.1.0": - version: 8.1.0 - resolution: "p-queue@npm:8.1.0" - dependencies: - eventemitter3: "npm:^5.0.1" - p-timeout: "npm:^6.1.2" - checksum: 10c0/6bdea170840546769c29682fed212745c951933476761ed3a981967fab624c7c0120dff79bd99a1ac8b650b420719a245813e944af4b8ee77d4dd78adbf5fe75 - languageName: node - linkType: hard - -"p-timeout@npm:^6.1.2": - version: 6.1.4 - resolution: "p-timeout@npm:6.1.4" - checksum: 10c0/019edad1c649ab07552aa456e40ce7575c4b8ae863191477f02ac8d283ac8c66cedef0ca93422735130477a051dfe952ba717641673fd3599befdd13f63bcc33 - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.1 - resolution: "package-json-from-dist@npm:1.0.1" - checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b - languageName: node - linkType: hard - -"package-manager-detector@npm:^1.1.0": - version: 1.3.0 - resolution: "package-manager-detector@npm:1.3.0" - checksum: 10c0/b4b54a81a3230edd66564a59ff6a2233086961e36ba91a28a0f6d6932a8dec36618ace50e8efec9c4d8c6aa9828e98814557a39fb6b106c161434ccb44a80e1c - languageName: node - linkType: hard - -"pagefind@npm:^1.3.0": - version: 1.3.0 - resolution: "pagefind@npm:1.3.0" - dependencies: - "@pagefind/darwin-arm64": "npm:1.3.0" - "@pagefind/darwin-x64": "npm:1.3.0" - "@pagefind/linux-arm64": "npm:1.3.0" - "@pagefind/linux-x64": "npm:1.3.0" - "@pagefind/windows-x64": "npm:1.3.0" - dependenciesMeta: - "@pagefind/darwin-arm64": - optional: true - "@pagefind/darwin-x64": - optional: true - "@pagefind/linux-arm64": - optional: true - "@pagefind/linux-x64": - optional: true - "@pagefind/windows-x64": - optional: true - bin: - pagefind: lib/runner/bin.cjs - checksum: 10c0/cf8ab69284946842d9aac1cd9ea6625e727b2f4d9b845818ea2b446c48db8bec4469f4a620f9a3be391c1e63d8fc2a9c08e3f1446a7697a5bdaace6e315b7932 - languageName: node - linkType: hard - -"pako@npm:^0.2.5": - version: 0.2.9 - resolution: "pako@npm:0.2.9" - checksum: 10c0/79c1806ebcf325b60ae599e4d7227c2e346d7b829dc20f5cf24cef07c934079dc3a61c5b3c8278a2f7a190c4a613e343ea11e5302dbe252efd11712df4b6b041 - languageName: node - linkType: hard - -"parse-entities@npm:^4.0.0": - version: 4.0.2 - resolution: "parse-entities@npm:4.0.2" - dependencies: - "@types/unist": "npm:^2.0.0" - character-entities-legacy: "npm:^3.0.0" - character-reference-invalid: "npm:^2.0.0" - decode-named-character-reference: "npm:^1.0.0" - is-alphanumerical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - is-hexadecimal: "npm:^2.0.0" - checksum: 10c0/a13906b1151750b78ed83d386294066daf5fb559e08c5af9591b2d98cc209123103016a01df776f65f8219ad26652d6d6b210d0974d452049cddfc53a8916c34 - languageName: node - linkType: hard - -"parse-latin@npm:^7.0.0": - version: 7.0.0 - resolution: "parse-latin@npm:7.0.0" - dependencies: - "@types/nlcst": "npm:^2.0.0" - "@types/unist": "npm:^3.0.0" - nlcst-to-string: "npm:^4.0.0" - unist-util-modify-children: "npm:^4.0.0" - unist-util-visit-children: "npm:^3.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/4232a464f98c41c6680575c54bc2c9b21ac4b82a1f796a871bfef5efa6eddaab9bccf734b08cde6b0a5504ef46a0a14041ddd0bc5d9cc70f73a507f93f610596 - languageName: node - linkType: hard - -"parse5@npm:^7.0.0": - version: 7.3.0 - resolution: "parse5@npm:7.3.0" - dependencies: - entities: "npm:^6.0.0" - checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"path-scurry@npm:^2.0.0": - version: 2.0.0 - resolution: "path-scurry@npm:2.0.0" - dependencies: - lru-cache: "npm:^11.0.0" - minipass: "npm:^7.1.2" - checksum: 10c0/3da4adedaa8e7ef8d6dc4f35a0ff8f05a9b4d8365f2b28047752b62d4c1ad73eec21e37b1579ef2d075920157856a3b52ae8309c480a6f1a8bbe06ff8e52b33c - languageName: node - linkType: hard - -"picocolors@npm:^1.1.1": - version: 1.1.1 - resolution: "picocolors@npm:1.1.1" - checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be - languageName: node - linkType: hard - -"picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc - languageName: node - linkType: hard - -"postcss-nested@npm:^6.0.1": - version: 6.2.0 - resolution: "postcss-nested@npm:6.2.0" - dependencies: - postcss-selector-parser: "npm:^6.1.1" - peerDependencies: - postcss: ^8.2.14 - checksum: 10c0/7f9c3f2d764191a39364cbdcec350f26a312431a569c9ef17408021424726b0d67995ff5288405e3724bb7152a4c92f73c027e580ec91e798800ed3c52e2bc6e - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^6.1.1": - version: 6.1.2 - resolution: "postcss-selector-parser@npm:6.1.2" - dependencies: - cssesc: "npm:^3.0.0" - util-deprecate: "npm:^1.0.2" - checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e - languageName: node - linkType: hard - -"postcss@npm:^8.4.38, postcss@npm:^8.5.3": - version: 8.5.5 - resolution: "postcss@npm:8.5.5" - dependencies: - nanoid: "npm:^3.3.11" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/6415873fab84de05c2d8fd18f72ea6654bca437bb4b9f02ca819c438501e4b3a450023e575e17587c6eaa5bedddaaa4dad3af210f5cf166e30cec09cac58baf8 - languageName: node - linkType: hard - -"prismjs@npm:^1.30.0": - version: 1.30.0 - resolution: "prismjs@npm:1.30.0" - checksum: 10c0/f56205bfd58ef71ccfcbcb691fd0eb84adc96c6ff21b0b69fc6fdcf02be42d6ef972ba4aed60466310de3d67733f6a746f89f2fb79c00bf217406d465b3e8f23 - languageName: node - linkType: hard - -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"prompts@npm:^2.4.2": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: "npm:^3.0.3" - sisteransi: "npm:^1.0.5" - checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 - languageName: node - linkType: hard - -"property-information@npm:^6.0.0": - version: 6.5.0 - resolution: "property-information@npm:6.5.0" - checksum: 10c0/981e0f9cc2e5acdb414a6fd48a99dd0fd3a4079e7a91ab41cf97a8534cf43e0e0bc1ffada6602a1b3d047a33db8b5fc2ef46d863507eda712d5ceedac443f0ef - languageName: node - linkType: hard - -"property-information@npm:^7.0.0": - version: 7.1.0 - resolution: "property-information@npm:7.1.0" - checksum: 10c0/e0fe22cff26103260ad0e82959229106563fa115a54c4d6c183f49d88054e489cc9f23452d3ad584179dc13a8b7b37411a5df873746b5e4086c865874bfa968e - languageName: node - linkType: hard - -"radix3@npm:^1.1.2": - version: 1.1.2 - resolution: "radix3@npm:1.1.2" - checksum: 10c0/d4a295547f71af079868d2c2ed3814a9296ee026c5488212d58c106e6b4797c6eaec1259b46c9728913622f2240c9a944bfc8e2b3b5f6e4a5045338b1609f1e4 - languageName: node - linkType: hard - -"readdirp@npm:^4.0.1": - version: 4.1.2 - resolution: "readdirp@npm:4.1.2" - checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 - languageName: node - linkType: hard - -"recma-build-jsx@npm:^1.0.0": - version: 1.0.0 - resolution: "recma-build-jsx@npm:1.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-util-build-jsx: "npm:^3.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/ca30f5163887b44c74682355da2625f7b49f33267699d22247913e513e043650cbdd6a7497cf13c60f09ad9e7bc2bd35bd20853672773c19188569814b56bb04 - languageName: node - linkType: hard - -"recma-jsx@npm:^1.0.0": - version: 1.0.0 - resolution: "recma-jsx@npm:1.0.0" - dependencies: - acorn-jsx: "npm:^5.0.0" - estree-util-to-js: "npm:^2.0.0" - recma-parse: "npm:^1.0.0" - recma-stringify: "npm:^1.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/26c2af6dd69336c810468b778be1e4cbac5702cf9382454f17c29cf9b03a4fde47d10385bb26a7ccb34f36fe01af34c24cab9fb0deeed066ea53294be0081f07 - languageName: node - linkType: hard - -"recma-parse@npm:^1.0.0": - version: 1.0.0 - resolution: "recma-parse@npm:1.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - esast-util-from-js: "npm:^2.0.0" - unified: "npm:^11.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/37c0990859a562d082e02d475ca5f4c8ef0840d285270f6699fe888cbb06260f97eb098585eda4aae416182c207fd19cf05e4f0b2dcf55cbf81dde4406d95545 - languageName: node - linkType: hard - -"recma-stringify@npm:^1.0.0": - version: 1.0.0 - resolution: "recma-stringify@npm:1.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-util-to-js: "npm:^2.0.0" - unified: "npm:^11.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/c2ed4c0e8cf8a09aedcd47c5d016d47f6e1ff6c2d4b220e2abaf1b77713bf404756af2ea3ea7999aec5862e8825aff035edceb370c7fd8603a7e9da03bd6987e - languageName: node - linkType: hard - -"regex-recursion@npm:^6.0.2": - version: 6.0.2 - resolution: "regex-recursion@npm:6.0.2" - dependencies: - regex-utilities: "npm:^2.3.0" - checksum: 10c0/68e8b6889680e904b75d7f26edaf70a1a4dc1087406bff53face4c2929d918fd77c72223843fe816ac8ed9964f96b4160650e8d5909e26a998c6e9de324dadb1 - languageName: node - linkType: hard - -"regex-utilities@npm:^2.3.0": - version: 2.3.0 - resolution: "regex-utilities@npm:2.3.0" - checksum: 10c0/78c550a80a0af75223244fff006743922591bd8f61d91fef7c86b9b56cf9bbf8ee5d7adb6d8991b5e304c57c90103fc4818cf1e357b11c6c669b782839bd7893 - languageName: node - linkType: hard - -"regex@npm:^6.0.1": - version: 6.0.1 - resolution: "regex@npm:6.0.1" - dependencies: - regex-utilities: "npm:^2.3.0" - checksum: 10c0/687b3e063d4ca19b0de7c55c24353f868a0fb9ba21512692470d2fb412e3a410894dd5924c91ea49d8cb8fa865e36ec956e52436ae0a256bdc095ff136c30aba - languageName: node - linkType: hard - -"regor-doc-site@workspace:.": - version: 0.0.0-use.local - resolution: "regor-doc-site@workspace:." - dependencies: - "@astrojs/starlight": "npm:^0.34.3" - astro: "npm:^5.9.2" - glob: "npm:^11.0.3" - languageName: unknown - linkType: soft - -"rehype-expressive-code@npm:^0.41.2": - version: 0.41.2 - resolution: "rehype-expressive-code@npm:0.41.2" - dependencies: - expressive-code: "npm:^0.41.2" - checksum: 10c0/041fbe9edfc5fcc3656190bc999f9e33f9b082852f023f9adee4c3d78caf5d37e95fc7687fba19d8772774d7af8ac14d6f029b25de801873c5fd9f1c553f64a6 - languageName: node - linkType: hard - -"rehype-format@npm:^5.0.0": - version: 5.0.1 - resolution: "rehype-format@npm:5.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-format: "npm:^1.0.0" - checksum: 10c0/e87aac3e318ef96688785e108315b23762681f1a834ae52ac449b9787ff63e8435aceb70354fb629d2d733daca4f65889ddcdf0cd44b684ea4f481e8fac750e3 - languageName: node - linkType: hard - -"rehype-parse@npm:^9.0.0": - version: 9.0.1 - resolution: "rehype-parse@npm:9.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-from-html: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/efa9ca17673fe70e2d322a1d262796bbed5f6a89382f8f8393352bbd6f6bbf1d4d1d050984b86ff9cb6c0fa2535175ab0829e53c94b1e38fc3c158e6c0ad90bc - languageName: node - linkType: hard - -"rehype-raw@npm:^7.0.0": - version: 7.0.0 - resolution: "rehype-raw@npm:7.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-raw: "npm:^9.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52 - languageName: node - linkType: hard - -"rehype-recma@npm:^1.0.0": - version: 1.0.0 - resolution: "rehype-recma@npm:1.0.0" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - hast-util-to-estree: "npm:^3.0.0" - checksum: 10c0/be60d7433a7f788a14f41da3e93ba9d9272c908ddef47757026cc4bbcc912f6301d56810349adf876d294a8d048626a0dbf6988aaa574afbfc29eac1ddc1eb74 - languageName: node - linkType: hard - -"rehype-stringify@npm:^10.0.0, rehype-stringify@npm:^10.0.1": - version: 10.0.1 - resolution: "rehype-stringify@npm:10.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-to-html: "npm:^9.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/c643ae3a4862465033e0f1e9f664433767279b4ee9296570746970a79940417ec1fb1997a513659aab97063cf971c5d97e0af8129f590719f01628c8aa480765 - languageName: node - linkType: hard - -"rehype@npm:^13.0.1, rehype@npm:^13.0.2": - version: 13.0.2 - resolution: "rehype@npm:13.0.2" - dependencies: - "@types/hast": "npm:^3.0.0" - rehype-parse: "npm:^9.0.0" - rehype-stringify: "npm:^10.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/13d82086b673b3ce1fddb54cc8d30be16bde83fb62f1507f0af06070c94b85d07c3780fa994357bad2c9d51b84e4108ff661677b71d187e4f2167cab22d84363 - languageName: node - linkType: hard - -"remark-directive@npm:^3.0.0": - version: 3.0.1 - resolution: "remark-directive@npm:3.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-directive: "npm:^3.0.0" - micromark-extension-directive: "npm:^3.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/ac0e60bdfd97063e2b4e18a96842567ae2ffea75f2545fcd7e4fe54806fb31629d60cef55b565333bda172eddee36766fe2535ca0b59208394bde676cd98094c - languageName: node - linkType: hard - -"remark-gfm@npm:^4.0.1": - version: 4.0.1 - resolution: "remark-gfm@npm:4.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-gfm: "npm:^3.0.0" - micromark-extension-gfm: "npm:^3.0.0" - remark-parse: "npm:^11.0.0" - remark-stringify: "npm:^11.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/427ecc6af3e76222662061a5f670a3e4e33ec5fffe2cabf04034da6a3f9a1bda1fc023e838a636385ba314e66e2bebbf017ca61ebea357eb0f5200fe0625a4b7 - languageName: node - linkType: hard - -"remark-mdx@npm:^3.0.0": - version: 3.1.0 - resolution: "remark-mdx@npm:3.1.0" +"micromark-util-classify-character@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" dependencies: - mdast-util-mdx: "npm:^3.0.0" - micromark-extension-mdxjs: "npm:^3.0.0" - checksum: 10c0/247800fa8561624bdca5776457c5965d99e5e60080e80262c600fe12ddd573862e029e39349e1e36e4c3bf79c8e571ecf4d3d2d8c13485b758391fb500e24a1a + micromark-util-character: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08 languageName: node linkType: hard -"remark-parse@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-parse@npm:11.0.0" +"micromark-util-combine-extensions@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-from-markdown: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38 + checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7 languageName: node linkType: hard -"remark-rehype@npm:^11.0.0, remark-rehype@npm:^11.1.2": - version: 11.1.2 - resolution: "remark-rehype@npm:11.1.2" +"micromark-util-decode-numeric-character-reference@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - mdast-util-to-hast: "npm:^13.0.0" - unified: "npm:^11.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/f9eccacfb596d9605581dc05bfad28635d6ded5dd0a18e88af5fd4df0d3fcf9612e1501d4513bc2164d833cfe9636dab20400080b09e53f155c6e1442a1231fb + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df languageName: node linkType: hard -"remark-smartypants@npm:^3.0.2": - version: 3.0.2 - resolution: "remark-smartypants@npm:3.0.2" +"micromark-util-decode-string@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" dependencies: - retext: "npm:^9.0.0" - retext-smartypants: "npm:^6.0.0" - unified: "npm:^11.0.4" - unist-util-visit: "npm:^5.0.0" - checksum: 10c0/661129f6258feb4531c896d0d7013d0cd7835599f7d9c46947ff0cda19c717e2d5a7da28fc72a9d454dd5a5b6308403f0d7a7ec58338865a28c9242a77739b40 + decode-named-character-reference: "npm:^1.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb languageName: node linkType: hard -"remark-stringify@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-stringify@npm:11.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f +"micromark-util-encode@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: 10c0/b2b29f901093845da8a1bf997ea8b7f5e061ffdba85070dfe14b0197c48fda64ffcf82bfe53c90cf9dc185e69eef8c5d41cae3ba918b96bc279326921b59008a languageName: node linkType: hard -"restructure@npm:^3.0.0": - version: 3.0.2 - resolution: "restructure@npm:3.0.2" - checksum: 10c0/f13536c094ba40a9af704e6a9fc030afd48d6112e9a3bec5f9cf5bad50416a22a7cf9aaece542bbac8c82204ad4901bf455e6204613abedbc075bc221ea6bdef +"micromark-util-html-tag-name@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9 languageName: node linkType: hard -"retext-latin@npm:^4.0.0": - version: 4.0.0 - resolution: "retext-latin@npm:4.0.0" +"micromark-util-normalize-identifier@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" dependencies: - "@types/nlcst": "npm:^2.0.0" - parse-latin: "npm:^7.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/51530be66db9ef6ab8e9cda5dd0598377ff4321481d6a941bf70dac16fa6e9123ff7d8ff093a05c30a3e00e282e37094b845b6130a8005a3cb7186a961ab99cb + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd languageName: node linkType: hard -"retext-smartypants@npm:^6.0.0": - version: 6.2.0 - resolution: "retext-smartypants@npm:6.2.0" +"micromark-util-resolve-all@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" dependencies: - "@types/nlcst": "npm:^2.0.0" - nlcst-to-string: "npm:^4.0.0" - unist-util-visit: "npm:^5.0.0" - checksum: 10c0/36f925353dd7f31df642bca2493524a8daee15f9b0e0dfe7fb8982462d23ccb12a99864989db22f0bacb6d7fea1f696ba96e031d3fbac4f013e1c95ef3fed881 + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a languageName: node linkType: hard -"retext-stringify@npm:^4.0.0": - version: 4.0.0 - resolution: "retext-stringify@npm:4.0.0" +"micromark-util-sanitize-uri@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" dependencies: - "@types/nlcst": "npm:^2.0.0" - nlcst-to-string: "npm:^4.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/eb2930356c85999a8978092a5d6ba3695fea859c71f221dcdc485704552922641bc17e50fea2ae0599d665192eaad002e98bb4236ecac94a570b73581b99004d + micromark-util-character: "npm:^2.0.0" + micromark-util-encode: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + checksum: 10c0/60e92166e1870fd4f1961468c2651013ff760617342918e0e0c3c4e872433aa2e60c1e5a672bfe5d89dc98f742d6b33897585cf86ae002cda23e905a3c02527c languageName: node linkType: hard -"retext@npm:^9.0.0": - version: 9.0.0 - resolution: "retext@npm:9.0.0" +"micromark-util-subtokenize@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-util-subtokenize@npm:2.1.0" dependencies: - "@types/nlcst": "npm:^2.0.0" - retext-latin: "npm:^4.0.0" - retext-stringify: "npm:^4.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/eee9f66ff6fae5670a5eeccc0b5e2639112f868475273ce307d3079cfe7deb9d1b0f2b8fa28b4ab30abaf8538345185a44908f461a27bbf43c4f94feda90ecac + devlop: "npm:^1.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/bee69eece4393308e657c293ba80d92ebcb637e5f55e21dcf9c3fa732b91a8eda8ac248d76ff375e675175bfadeae4712e5158ef97eef1111789da1ce7ab5067 + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: 10c0/f2d1b207771e573232436618e78c5e46cd4b5c560dd4a6d63863d58018abbf49cb96ec69f7007471e51434c60de3c9268ef2bf46852f26ff4aacd10f9da16fe9 languageName: node linkType: hard -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe +"micromark-util-types@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-types@npm:2.0.2" + checksum: 10c0/c8c15b96c858db781c4393f55feec10004bf7df95487636c9a9f7209e51002a5cca6a047c5d2a5dc669ff92da20e57aaa881e81a268d9ccadb647f9dce305298 languageName: node linkType: hard -"rollup@npm:^4.34.9": - version: 4.43.0 - resolution: "rollup@npm:4.43.0" +"micromark@npm:^4.0.0": + version: 4.0.2 + resolution: "micromark@npm:4.0.2" dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.43.0" - "@rollup/rollup-android-arm64": "npm:4.43.0" - "@rollup/rollup-darwin-arm64": "npm:4.43.0" - "@rollup/rollup-darwin-x64": "npm:4.43.0" - "@rollup/rollup-freebsd-arm64": "npm:4.43.0" - "@rollup/rollup-freebsd-x64": "npm:4.43.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.43.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.43.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.43.0" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.43.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-riscv64-musl": "npm:4.43.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.43.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-x64-musl": "npm:4.43.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.43.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.43.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.43.0" - "@types/estree": "npm:1.0.7" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-loongarch64-gnu": - optional: true - "@rollup/rollup-linux-powerpc64le-gnu": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-riscv64-musl": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/a14a16ee5433f9eddfe803ed1a3f4528e3e96f746e55bf88c5482f9a60a4ad61f507b59f46d5d9c8dc98bb7983483e0c94b760ae37c02157eba9da5665c1641b + "@types/debug": "npm:^4.0.0" + debug: "npm:^4.0.0" + decode-named-character-reference: "npm:^1.0.0" + devlop: "npm:^1.0.0" + micromark-core-commonmark: "npm:^2.0.0" + micromark-factory-space: "npm:^2.0.0" + micromark-util-character: "npm:^2.0.0" + micromark-util-chunked: "npm:^2.0.0" + micromark-util-combine-extensions: "npm:^2.0.0" + micromark-util-decode-numeric-character-reference: "npm:^2.0.0" + micromark-util-encode: "npm:^2.0.0" + micromark-util-normalize-identifier: "npm:^2.0.0" + micromark-util-resolve-all: "npm:^2.0.0" + micromark-util-sanitize-uri: "npm:^2.0.0" + micromark-util-subtokenize: "npm:^2.0.0" + micromark-util-symbol: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + checksum: 10c0/07462287254219d6eda6eac8a3cebaff2994e0575499e7088027b825105e096e4f51e466b14b2a81b71933a3b6c48ee069049d87bc2c2127eee50d9cc69e8af6 languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 languageName: node linkType: hard -"sax@npm:^1.2.4": - version: 1.4.1 - resolution: "sax@npm:1.4.1" - checksum: 10c0/6bf86318a254c5d898ede6bd3ded15daf68ae08a5495a2739564eb265cd13bcc64a07ab466fb204f67ce472bb534eb8612dac587435515169593f4fffa11de7c +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: "npm:^2.0.2" + tslib: "npm:^2.0.3" + checksum: 10c0/8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.6.3, semver@npm:^7.7.1": - version: 7.7.2 - resolution: "semver@npm:7.7.2" - bin: - semver: bin/semver.js - checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea +"oniguruma-parser@npm:^0.12.2": + version: 0.12.2 + resolution: "oniguruma-parser@npm:0.12.2" + checksum: 10c0/fe5255d2cd5a6b845d5a0abe1725898ef40cea5522290dba6ccc08cc388891e9e8007af4baa5059942b786ad44b2b677ef25948039c9ba3f057bd35d2c52076a languageName: node linkType: hard -"sharp@npm:^0.33.3": - version: 0.33.5 - resolution: "sharp@npm:0.33.5" +"oniguruma-to-es@npm:^4.3.4": + version: 4.3.6 + resolution: "oniguruma-to-es@npm:4.3.6" dependencies: - "@img/sharp-darwin-arm64": "npm:0.33.5" - "@img/sharp-darwin-x64": "npm:0.33.5" - "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" - "@img/sharp-libvips-darwin-x64": "npm:1.0.4" - "@img/sharp-libvips-linux-arm": "npm:1.0.5" - "@img/sharp-libvips-linux-arm64": "npm:1.0.4" - "@img/sharp-libvips-linux-s390x": "npm:1.0.4" - "@img/sharp-libvips-linux-x64": "npm:1.0.4" - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" - "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" - "@img/sharp-linux-arm": "npm:0.33.5" - "@img/sharp-linux-arm64": "npm:0.33.5" - "@img/sharp-linux-s390x": "npm:0.33.5" - "@img/sharp-linux-x64": "npm:0.33.5" - "@img/sharp-linuxmusl-arm64": "npm:0.33.5" - "@img/sharp-linuxmusl-x64": "npm:0.33.5" - "@img/sharp-wasm32": "npm:0.33.5" - "@img/sharp-win32-ia32": "npm:0.33.5" - "@img/sharp-win32-x64": "npm:0.33.5" - color: "npm:^4.2.3" - detect-libc: "npm:^2.0.3" - semver: "npm:^7.6.3" + oniguruma-parser: "npm:^0.12.2" + regex: "npm:^6.1.0" + regex-recursion: "npm:^6.0.2" + checksum: 10c0/044e08b98e706987c2882ccf228de2a671de4aff33e3bd370da137ba599c0d520549625ad26ecc8898502445c991e19f106f584e94382262ba2af02c908ca3cf + languageName: node + linkType: hard + +"pagefind@npm:^1.4.0": + version: 1.5.2 + resolution: "pagefind@npm:1.5.2" + dependencies: + "@pagefind/darwin-arm64": "npm:1.5.2" + "@pagefind/darwin-x64": "npm:1.5.2" + "@pagefind/freebsd-x64": "npm:1.5.2" + "@pagefind/linux-arm64": "npm:1.5.2" + "@pagefind/linux-x64": "npm:1.5.2" + "@pagefind/windows-arm64": "npm:1.5.2" + "@pagefind/windows-x64": "npm:1.5.2" dependenciesMeta: - "@img/sharp-darwin-arm64": - optional: true - "@img/sharp-darwin-x64": - optional: true - "@img/sharp-libvips-darwin-arm64": - optional: true - "@img/sharp-libvips-darwin-x64": - optional: true - "@img/sharp-libvips-linux-arm": - optional: true - "@img/sharp-libvips-linux-arm64": - optional: true - "@img/sharp-libvips-linux-s390x": - optional: true - "@img/sharp-libvips-linux-x64": - optional: true - "@img/sharp-libvips-linuxmusl-arm64": - optional: true - "@img/sharp-libvips-linuxmusl-x64": - optional: true - "@img/sharp-linux-arm": - optional: true - "@img/sharp-linux-arm64": - optional: true - "@img/sharp-linux-s390x": + "@pagefind/darwin-arm64": optional: true - "@img/sharp-linux-x64": + "@pagefind/darwin-x64": optional: true - "@img/sharp-linuxmusl-arm64": + "@pagefind/freebsd-x64": optional: true - "@img/sharp-linuxmusl-x64": + "@pagefind/linux-arm64": optional: true - "@img/sharp-wasm32": + "@pagefind/linux-x64": optional: true - "@img/sharp-win32-ia32": + "@pagefind/windows-arm64": optional: true - "@img/sharp-win32-x64": + "@pagefind/windows-x64": optional: true - checksum: 10c0/6b81421ddfe6ee524d8d77e325c5e147fef22884e1c7b1656dfd89a88d7025894115da02d5f984261bf2e6daa16f98cadd1721c4ba408b4212b1d2a60f233484 + bin: + pagefind: lib/runner/bin.cjs + checksum: 10c0/bcc4f34f473bfeb09dc4cb464a3547bf958e11ee4dee4144ec7a364bd74b9f7c21f85be71e388b66d30923a9a453dcaed2f6b425f3e67631cadc9650ba741aab languageName: node linkType: hard -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 languageName: node linkType: hard -"shiki@npm:^3.2.1, shiki@npm:^3.2.2": - version: 3.6.0 - resolution: "shiki@npm:3.6.0" +"parse5@npm:^7.0.0": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" dependencies: - "@shikijs/core": "npm:3.6.0" - "@shikijs/engine-javascript": "npm:3.6.0" - "@shikijs/engine-oniguruma": "npm:3.6.0" - "@shikijs/langs": "npm:3.6.0" - "@shikijs/themes": "npm:3.6.0" - "@shikijs/types": "npm:3.6.0" - "@shikijs/vscode-textmate": "npm:^10.0.2" - "@types/hast": "npm:^3.0.4" - checksum: 10c0/a643ce72a2b9dacb7f7238999d4d062d2ea81c39da96b182d7ffe69f0c5a902e00095dfec526a831e67897d709853d95c5d76d3502c3b4a11b8644e8013b67be - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + entities: "npm:^6.0.0" + checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5 languageName: node linkType: hard -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" dependencies: - is-arrayish: "npm:^0.3.1" - checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 languageName: node linkType: hard -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 +"path-case@npm:^3.0.4": + version: 3.0.4 + resolution: "path-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/b6b14637228a558793f603aaeb2fcd981e738b8b9319421b713532fba96d75aa94024b9f6b9ae5aa33d86755144a5b36697d28db62ae45527dbd672fcc2cf0b7 languageName: node linkType: hard -"sitemap@npm:^8.0.0": - version: 8.0.0 - resolution: "sitemap@npm:8.0.0" - dependencies: - "@types/node": "npm:^17.0.5" - "@types/sax": "npm:^1.2.1" - arg: "npm:^5.0.0" - sax: "npm:^1.2.4" +"prettier@npm:^3.8.1": + version: 3.9.9 + resolution: "prettier@npm:3.9.9" bin: - sitemap: dist/cli.js - checksum: 10c0/adaabfb1f27e3c76ba25f9a16dcb02ff17dd2ecbd1b2dbe2608a6770eff37bd71f7d21c10df6824917453bc4da2c2790fd85ee6424d75699bd053e3422d2ef5c + prettier: bin/prettier.cjs + checksum: 10c0/d50ea2537b2ff7dbd5088a214f4d936484e55c665cea2185b477a55b0770be55f3b156a71f63a9a639def6b334667bb327139dc85f2a1041c0a34752cdc74647 languageName: node linkType: hard -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 +"property-information@npm:^6.0.0": + version: 6.5.0 + resolution: "property-information@npm:6.5.0" + checksum: 10c0/981e0f9cc2e5acdb414a6fd48a99dd0fd3a4079e7a91ab41cf97a8534cf43e0e0bc1ffada6602a1b3d047a33db8b5fc2ef46d863507eda712d5ceedac443f0ef languageName: node linkType: hard -"smol-toml@npm:^1.3.1": - version: 1.3.4 - resolution: "smol-toml@npm:1.3.4" - checksum: 10c0/801435476f52d6b05dfcb2bd2ed1956c6fc2b4c20e84b5e609eb27fa0c27b51a47528d91cabd1a93e8659bd2b8edb685e73ce2b686678739e67d7939fa25a92b +"property-information@npm:^7.0.0": + version: 7.1.0 + resolution: "property-information@npm:7.1.0" + checksum: 10c0/e0fe22cff26103260ad0e82959229106563fa115a54c4d6c183f49d88054e489cc9f23452d3ad584179dc13a8b7b37411a5df873746b5e4086c865874bfa968e languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.5 - resolution: "socks-proxy-agent@npm:8.0.5" +"purestack@npm:1.1.7": + version: 1.1.7 + resolution: "purestack@npm:1.1.7" dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + "@purestack/ts-ssg": "npm:^1.1.7" + bin: + purestack: dist/cli.mjs + checksum: 10c0/b87e75e6917bcedeea91745b2fd59d0dab0d62fbc2a8386d281c9266942f5a76f94276292455c06d45da84a021a1981e2316844727891484c8c2fc20bac3b521 languageName: node linkType: hard -"socks@npm:^2.8.3": - version: 2.8.5 - resolution: "socks@npm:2.8.5" +"regex-recursion@npm:^6.0.2": + version: 6.0.2 + resolution: "regex-recursion@npm:6.0.2" dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/e427d0eb0451cfd04e20b9156ea8c0e9b5e38a8d70f21e55c30fbe4214eda37cfc25d782c63f9adc5fbdad6d062a0f127ef2cefc9a44b6fee2b9ea5d1ed10827 + regex-utilities: "npm:^2.3.0" + checksum: 10c0/68e8b6889680e904b75d7f26edaf70a1a4dc1087406bff53face4c2929d918fd77c72223843fe816ac8ed9964f96b4160650e8d5909e26a998c6e9de324dadb1 languageName: node linkType: hard -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": - version: 1.2.1 - resolution: "source-map-js@npm:1.2.1" - checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf +"regex-utilities@npm:^2.3.0": + version: 2.3.0 + resolution: "regex-utilities@npm:2.3.0" + checksum: 10c0/78c550a80a0af75223244fff006743922591bd8f61d91fef7c86b9b56cf9bbf8ee5d7adb6d8991b5e304c57c90103fc4818cf1e357b11c6c669b782839bd7893 languageName: node linkType: hard -"source-map@npm:^0.7.0, source-map@npm:^0.7.4": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc +"regex@npm:^6.1.0": + version: 6.1.0 + resolution: "regex@npm:6.1.0" + dependencies: + regex-utilities: "npm:^2.3.0" + checksum: 10c0/6e0ee2a1c17d5a66dc1120dfc51899dedf6677857e83a0df4d5a822ebb8645a54a079772efc1ade382b67aad35e4e22b5bd2d33c05ed28b0e000f8f57eb0aec1 languageName: node linkType: hard -"space-separated-tokens@npm:^2.0.0": - version: 2.0.2 - resolution: "space-separated-tokens@npm:2.0.2" - checksum: 10c0/6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8 +"regor-doc-site@workspace:.": + version: 0.0.0-use.local + resolution: "regor-doc-site@workspace:." + dependencies: + purestack: "npm:1.1.7" + languageName: unknown + linkType: soft + +"regor@npm:^1.7.3": + version: 1.7.3 + resolution: "regor@npm:1.7.3" + checksum: 10c0/c6079f93905f042df5682b42a293ea1c6442c59e0b50819b0f6bb9727c40cb9411b3d755809a06ac5592cf37c1b3049d4fb883a73de3acf23d9cd848d645cc76 languageName: node linkType: hard -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec +"rehype-raw@npm:^7.0.0": + version: 7.0.0 + resolution: "rehype-raw@npm:7.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-raw: "npm:^9.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52 languageName: node linkType: hard -"ssri@npm:^12.0.0": - version: 12.0.0 - resolution: "ssri@npm:12.0.0" +"rehype-stringify@npm:^10.0.1": + version: 10.0.1 + resolution: "rehype-stringify@npm:10.0.1" dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + "@types/hast": "npm:^3.0.0" + hast-util-to-html: "npm:^9.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/c643ae3a4862465033e0f1e9f664433767279b4ee9296570746970a79940417ec1fb1997a513659aab97063cf971c5d97e0af8129f590719f01628c8aa480765 languageName: node linkType: hard -"stream-replace-string@npm:^2.0.0": - version: 2.0.0 - resolution: "stream-replace-string@npm:2.0.0" - checksum: 10c0/6cdf6108c57a869c1282dece0728bd7a8e314855bee71992436460192cdf46b3c976451e1e114716af209b2bfefa0e7e4581ca0eebc330d9dfcde341a72d50af +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 10c0/c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" +"remark-gfm@npm:^4.0.1": + version: 4.0.1 + resolution: "remark-gfm@npm:4.0.1" dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + "@types/mdast": "npm:^4.0.0" + mdast-util-gfm: "npm:^3.0.0" + micromark-extension-gfm: "npm:^3.0.0" + remark-parse: "npm:^11.0.0" + remark-stringify: "npm:^11.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/427ecc6af3e76222662061a5f670a3e4e33ec5fffe2cabf04034da6a3f9a1bda1fc023e838a636385ba314e66e2bebbf017ca61ebea357eb0f5200fe0625a4b7 languageName: node linkType: hard -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" +"remark-parse@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-parse@npm:11.0.0" dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + "@types/mdast": "npm:^4.0.0" + mdast-util-from-markdown: "npm:^2.0.0" + micromark-util-types: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38 languageName: node linkType: hard -"string-width@npm:^7.0.0, string-width@npm:^7.2.0": - version: 7.2.0 - resolution: "string-width@npm:7.2.0" +"remark-rehype@npm:^11.1.2": + version: 11.1.2 + resolution: "remark-rehype@npm:11.1.2" dependencies: - emoji-regex: "npm:^10.3.0" - get-east-asian-width: "npm:^1.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + mdast-util-to-hast: "npm:^13.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/f9eccacfb596d9605581dc05bfad28635d6ded5dd0a18e88af5fd4df0d3fcf9612e1501d4513bc2164d833cfe9636dab20400080b09e53f155c6e1442a1231fb languageName: node linkType: hard -"stringify-entities@npm:^4.0.0": - version: 4.0.4 - resolution: "stringify-entities@npm:4.0.4" +"remark-stringify@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-stringify@npm:11.0.0" dependencies: - character-entities-html4: "npm:^2.0.0" - character-entities-legacy: "npm:^3.0.0" - checksum: 10c0/537c7e656354192406bdd08157d759cd615724e9d0873602d2c9b2f6a5c0a8d0b1d73a0a08677848105c5eebac6db037b57c0b3a4ec86331117fa7319ed50448 + "@types/mdast": "npm:^4.0.0" + mdast-util-to-markdown: "npm:^2.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f languageName: node linkType: hard -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" +"section-matter@npm:^1.0.0": + version: 1.0.0 + resolution: "section-matter@npm:1.0.0" dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + extend-shallow: "npm:^2.0.1" + kind-of: "npm:^6.0.0" + checksum: 10c0/8007f91780adc5aaa781a848eaae50b0f680bbf4043b90cf8a96778195b8fab690c87fe7a989e02394ce69890e330811ec8dab22397d384673ce59f7d750641d languageName: node linkType: hard -"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" +"sentence-case@npm:^3.0.4": + version: 3.0.4 + resolution: "sentence-case@npm:3.0.4" dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case-first: "npm:^2.0.2" + checksum: 10c0/9a90527a51300cf5faea7fae0c037728f9ddcff23ac083883774c74d180c0a03c31aab43d5c3347512e8c1b31a0d4712512ec82beb71aa79b85149f9abeb5467 languageName: node linkType: hard -"style-to-js@npm:^1.0.0": - version: 1.1.16 - resolution: "style-to-js@npm:1.1.16" +"shiki@npm:^3.22.0": + version: 3.23.0 + resolution: "shiki@npm:3.23.0" dependencies: - style-to-object: "npm:1.0.8" - checksum: 10c0/578a4dff804539ec7e64d3cc8d327540befb9ad30e3cd0b6b0392f93f793f3a028f90084a9aaff088bffb87818fa2c6c153f0df576f61f9ab0b0938b582bcac7 + "@shikijs/core": "npm:3.23.0" + "@shikijs/engine-javascript": "npm:3.23.0" + "@shikijs/engine-oniguruma": "npm:3.23.0" + "@shikijs/langs": "npm:3.23.0" + "@shikijs/themes": "npm:3.23.0" + "@shikijs/types": "npm:3.23.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/b06a3eddac4bd0a838f9bd79bea70b0a01195570cb11d70fd2ff7ab0a42c33a8c4980ee52174173aae0476cc152b4c1a68c081a82d94ee340cb3ef9d772ae4ba languageName: node linkType: hard -"style-to-object@npm:1.0.8": - version: 1.0.8 - resolution: "style-to-object@npm:1.0.8" +"snake-case@npm:^3.0.4": + version: 3.0.4 + resolution: "snake-case@npm:3.0.4" dependencies: - inline-style-parser: "npm:0.2.4" - checksum: 10c0/daa6646b1ff18258c0ca33ed281fbe73485c8391192db1b56ce89d40c93ea64507a41e8701d0dadfe771bc2f540c46c9b295135f71584c8e5cb23d6a19be9430 + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ab19a913969f58f4474fe9f6e8a026c8a2142a01f40b52b79368068343177f818cdfef0b0c6b9558f298782441d5ca8ed5932eb57822439fad791d866e62cecd languageName: node linkType: hard -"tar@npm:^7.4.3": - version: 7.4.3 - resolution: "tar@npm:7.4.3" +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" dependencies: - "@isaacs/fs-minipass": "npm:^4.0.0" - chownr: "npm:^3.0.0" - minipass: "npm:^7.1.2" - minizlib: "npm:^3.0.1" - mkdirp: "npm:^3.0.1" - yallist: "npm:^5.0.0" - checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d languageName: node linkType: hard -"tiny-inflate@npm:^1.0.0, tiny-inflate@npm:^1.0.3": - version: 1.0.3 - resolution: "tiny-inflate@npm:1.0.3" - checksum: 10c0/fab687537254f6ec44c9a2e880048fe70da3542aba28f73cda3e74c95cabf342a339372f2a6c032e322324f01accc03ca26c04ba2bad9b3eb8cf3ee99bba7f9b +"source-map@npm:^0.6.0": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard -"tinyexec@npm:^0.3.2": - version: 0.3.2 - resolution: "tinyexec@npm:0.3.2" - checksum: 10c0/3efbf791a911be0bf0821eab37a3445c2ba07acc1522b1fa84ae1e55f10425076f1290f680286345ed919549ad67527d07281f1c19d584df3b74326909eb1f90 +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 10c0/6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8 languageName: node linkType: hard -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13": - version: 0.2.14 - resolution: "tinyglobby@npm:0.2.14" +"stringify-entities@npm:^4.0.0": + version: 4.0.4 + resolution: "stringify-entities@npm:4.0.4" dependencies: - fdir: "npm:^6.4.4" - picomatch: "npm:^4.0.2" - checksum: 10c0/f789ed6c924287a9b7d3612056ed0cda67306cd2c80c249fd280cf1504742b12583a2089b61f4abbd24605f390809017240e250241f09938054c9b363e51c0a6 + character-entities-html4: "npm:^2.0.0" + character-entities-legacy: "npm:^3.0.0" + checksum: 10c0/537c7e656354192406bdd08157d759cd615724e9d0873602d2c9b2f6a5c0a8d0b1d73a0a08677848105c5eebac6db037b57c0b3a4ec86331117fa7319ed50448 languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 +"terser@npm:^5.46.0": + version: 5.51.2 + resolution: "terser@npm:5.51.2" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.15.0" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/e6dd3d9152ad51b5a990e55bf0647701278970193d2ce2359a401623e65827a27a1803f5d58593a1f0b5e10ff3fa316a8d014d4f88a28d98ea94fb69359aeae5 languageName: node linkType: hard @@ -4840,83 +2112,14 @@ __metadata: languageName: node linkType: hard -"tsconfck@npm:^3.1.5": - version: 3.1.6 - resolution: "tsconfck@npm:3.1.6" - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - bin: - tsconfck: bin/tsconfck.js - checksum: 10c0/269c3c513540be44844117bb9b9258fe6f8aeab026d32aeebf458d5299125f330711429dbb556dbf125a0bc25f4a81e6c24ac96de2740badd295c3fb400f66c4 - languageName: node - linkType: hard - -"tslib@npm:^2.4.0, tslib@npm:^2.8.0": +"tslib@npm:^2.0.3": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 languageName: node linkType: hard -"type-fest@npm:^4.21.0": - version: 4.41.0 - resolution: "type-fest@npm:4.41.0" - checksum: 10c0/f5ca697797ed5e88d33ac8f1fec21921839871f808dc59345c9cf67345bfb958ce41bd821165dbf3ae591cedec2bf6fe8882098dfdd8dc54320b859711a2c1e4 - languageName: node - linkType: hard - -"ufo@npm:^1.5.4, ufo@npm:^1.6.1": - version: 1.6.1 - resolution: "ufo@npm:1.6.1" - checksum: 10c0/5a9f041e5945fba7c189d5410508cbcbefef80b253ed29aa2e1f8a2b86f4bd51af44ee18d4485e6d3468c92be9bf4a42e3a2b72dcaf27ce39ce947ec994f1e6b - languageName: node - linkType: hard - -"ultrahtml@npm:^1.6.0": - version: 1.6.0 - resolution: "ultrahtml@npm:1.6.0" - checksum: 10c0/1140be819fdde198d83ad61b0186cb1fdb9d3a5d77ff416a752ae735089851a182d2100a1654f6b70dbb4f67881fcac1afba9323e261c8a95846a63f668b4c2a - languageName: node - linkType: hard - -"uncrypto@npm:^0.1.3": - version: 0.1.3 - resolution: "uncrypto@npm:0.1.3" - checksum: 10c0/74a29afefd76d5b77bedc983559ceb33f5bbc8dada84ff33755d1e3355da55a4e03a10e7ce717918c436b4dfafde1782e799ebaf2aadd775612b49f7b5b2998e - languageName: node - linkType: hard - -"undici-types@npm:~7.8.0": - version: 7.8.0 - resolution: "undici-types@npm:7.8.0" - checksum: 10c0/9d9d246d1dc32f318d46116efe3cfca5a72d4f16828febc1918d94e58f6ffcf39c158aa28bf5b4fc52f410446bc7858f35151367bd7a49f21746cab6497b709b - languageName: node - linkType: hard - -"unicode-properties@npm:^1.4.0": - version: 1.4.1 - resolution: "unicode-properties@npm:1.4.1" - dependencies: - base64-js: "npm:^1.3.0" - unicode-trie: "npm:^2.0.0" - checksum: 10c0/1d140b7945664fb0ef53de955170821e077b949eef377c6e4905902f07e339039271bfa2a005e4f4c6074b080d3420b486c52dc905e11f924949a04d1fb47ffd - languageName: node - linkType: hard - -"unicode-trie@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-trie@npm:2.0.0" - dependencies: - pako: "npm:^0.2.5" - tiny-inflate: "npm:^1.0.0" - checksum: 10c0/2422368645249f315640a1c9e9506046aa7738fc9c5d59e15c207cdd6ec66101c35b0b9f75dc3ac28fe7be19aaf1efc898bbea074fa1e8e295ef736aeb7904bb - languageName: node - linkType: hard - -"unified@npm:^11.0.0, unified@npm:^11.0.4, unified@npm:^11.0.5": +"unified@npm:^11.0.0, unified@npm:^11.0.5": version: 11.0.5 resolution: "unified@npm:11.0.5" dependencies: @@ -4931,44 +2134,6 @@ __metadata: languageName: node linkType: hard -"unifont@npm:~0.5.0": - version: 0.5.0 - resolution: "unifont@npm:0.5.0" - dependencies: - css-tree: "npm:^3.0.0" - ohash: "npm:^2.0.0" - checksum: 10c0/4395af8a95722d88389ae100686577a80d9ff7a3e129dadf836e7beb1dbbd448d7bb12b9d8988084c186748fbb4763ce19457c7a119b8343a0fb5c81767896a2 - languageName: node - linkType: hard - -"unique-filename@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-filename@npm:4.0.0" - dependencies: - unique-slug: "npm:^5.0.0" - checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc - languageName: node - linkType: hard - -"unique-slug@npm:^5.0.0": - version: 5.0.0 - resolution: "unique-slug@npm:5.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 - languageName: node - linkType: hard - -"unist-util-find-after@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-find-after@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 10c0/a7cea473c4384df8de867c456b797ff1221b20f822e1af673ff5812ed505358b36f47f3b084ac14c3622cb879ed833b71b288e8aa71025352a2aab4c2925a6eb - languageName: node - linkType: hard - "unist-util-is@npm:^6.0.0": version: 6.0.0 resolution: "unist-util-is@npm:6.0.0" @@ -4978,25 +2143,6 @@ __metadata: languageName: node linkType: hard -"unist-util-modify-children@npm:^4.0.0": - version: 4.0.0 - resolution: "unist-util-modify-children@npm:4.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - array-iterate: "npm:^2.0.0" - checksum: 10c0/63d44b09a2e4c674c72816d4328d668972e68cc965ea719fef1c642b66a3ebe3b102e284a3213b4920ebccff05e0f689b4eaae8a0e5c3dafcad117d1577496da - languageName: node - linkType: hard - -"unist-util-position-from-estree@npm:^2.0.0": - version: 2.0.0 - resolution: "unist-util-position-from-estree@npm:2.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/39127bf5f0594e0a76d9241dec4f7aa26323517120ce1edd5ed91c8c1b9df7d6fb18af556e4b6250f1c7368825720ed892e2b6923be5cdc08a9bb16536dc37b3 - languageName: node - linkType: hard - "unist-util-position@npm:^5.0.0": version: 5.0.0 resolution: "unist-util-position@npm:5.0.0" @@ -5006,16 +2152,6 @@ __metadata: languageName: node linkType: hard -"unist-util-remove-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-remove-position@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-visit: "npm:^5.0.0" - checksum: 10c0/e8c76da4399446b3da2d1c84a97c607b37d03d1d92561e14838cbe4fdcb485bfc06c06cfadbb808ccb72105a80643976d0660d1fe222ca372203075be9d71105 - languageName: node - linkType: hard - "unist-util-stringify-position@npm:^4.0.0": version: 4.0.0 resolution: "unist-util-stringify-position@npm:4.0.0" @@ -5025,16 +2161,7 @@ __metadata: languageName: node linkType: hard -"unist-util-visit-children@npm:^3.0.0": - version: 3.0.0 - resolution: "unist-util-visit-children@npm:3.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/51e95f54fbf11d414952c011c761c3960864948ad3fd2abe3989eb18b18d96b8f48e7ea5ab6f23264d1a3f4f5a1ff76312dd8f2196c78b762098403505c3abb9 - languageName: node - linkType: hard - -"unist-util-visit-parents@npm:^6.0.0, unist-util-visit-parents@npm:^6.0.1": +"unist-util-visit-parents@npm:^6.0.0": version: 6.0.1 resolution: "unist-util-visit-parents@npm:6.0.1" dependencies: @@ -5055,82 +2182,21 @@ __metadata: languageName: node linkType: hard -"unstorage@npm:^1.15.0": - version: 1.16.0 - resolution: "unstorage@npm:1.16.0" +"upper-case-first@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case-first@npm:2.0.2" dependencies: - anymatch: "npm:^3.1.3" - chokidar: "npm:^4.0.3" - destr: "npm:^2.0.5" - h3: "npm:^1.15.2" - lru-cache: "npm:^10.4.3" - node-fetch-native: "npm:^1.6.6" - ofetch: "npm:^1.4.1" - ufo: "npm:^1.6.1" - peerDependencies: - "@azure/app-configuration": ^1.8.0 - "@azure/cosmos": ^4.2.0 - "@azure/data-tables": ^13.3.0 - "@azure/identity": ^4.6.0 - "@azure/keyvault-secrets": ^4.9.0 - "@azure/storage-blob": ^12.26.0 - "@capacitor/preferences": ^6.0.3 || ^7.0.0 - "@deno/kv": ">=0.9.0" - "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 - "@planetscale/database": ^1.19.0 - "@upstash/redis": ^1.34.3 - "@vercel/blob": ">=0.27.1" - "@vercel/kv": ^1.0.1 - aws4fetch: ^1.0.20 - db0: ">=0.2.1" - idb-keyval: ^6.2.1 - ioredis: ^5.4.2 - uploadthing: ^7.4.4 - peerDependenciesMeta: - "@azure/app-configuration": - optional: true - "@azure/cosmos": - optional: true - "@azure/data-tables": - optional: true - "@azure/identity": - optional: true - "@azure/keyvault-secrets": - optional: true - "@azure/storage-blob": - optional: true - "@capacitor/preferences": - optional: true - "@deno/kv": - optional: true - "@netlify/blobs": - optional: true - "@planetscale/database": - optional: true - "@upstash/redis": - optional: true - "@vercel/blob": - optional: true - "@vercel/kv": - optional: true - aws4fetch: - optional: true - db0: - optional: true - idb-keyval: - optional: true - ioredis: - optional: true - uploadthing: - optional: true - checksum: 10c0/f719a6483fd71d0a6d4f2e98ec29721c352618c4f3641f96d0c703866dc13cda071e8afda5a68bac4e7d3880c8eece0edb2057e96ce0ac4fb649998611430a09 + tslib: "npm:^2.0.3" + checksum: 10c0/ccad6a0b143310ebfba2b5841f30bef71246297385f1329c022c902b2b5fc5aee009faf1ac9da5ab3ba7f615b88f5dc1cd80461b18a8f38cb1d4c3eb92538ea9 languageName: node linkType: hard -"util-deprecate@npm:^1.0.2": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 +"upper-case@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/5ac176c9d3757abb71400df167f9abb46d63152d5797c630d1a9f083fbabd89711fb4b3dc6de06ff0138fe8946fa5b8518b4fcdae9ca8a3e341417075beae069 languageName: node linkType: hard @@ -5154,7 +2220,7 @@ __metadata: languageName: node linkType: hard -"vfile@npm:^6.0.0, vfile@npm:^6.0.2, vfile@npm:^6.0.3": +"vfile@npm:^6.0.0": version: 6.0.3 resolution: "vfile@npm:6.0.3" dependencies: @@ -5164,73 +2230,6 @@ __metadata: languageName: node linkType: hard -"vite@npm:^6.3.4": - version: 6.3.5 - resolution: "vite@npm:6.3.5" - dependencies: - esbuild: "npm:^0.25.0" - fdir: "npm:^6.4.4" - fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.2" - postcss: "npm:^8.5.3" - rollup: "npm:^4.34.9" - tinyglobby: "npm:^0.2.13" - peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: ">=1.21.0" - less: "*" - lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/df70201659085133abffc6b88dcdb8a57ef35f742a01311fc56a4cfcda6a404202860729cc65a2c401a724f6e25f9ab40ce4339ed4946f550541531ced6fe41c - languageName: node - linkType: hard - -"vitefu@npm:^1.0.6": - version: 1.0.6 - resolution: "vitefu@npm:1.0.6" - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - peerDependenciesMeta: - vite: - optional: true - checksum: 10c0/d153966fbcc9375bb858a5f5a096466900b42b25d2a3b255e10d050672300a978cccbe249c1f2beb2e09caaa0c800261e9305c62df4f2b75aa32b32bb936799c - languageName: node - linkType: hard - "web-namespaces@npm:^2.0.0": version: 2.0.1 resolution: "web-namespaces@npm:2.0.1" @@ -5238,171 +2237,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db - languageName: node - linkType: hard - -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: "npm:~0.0.3" - webidl-conversions: "npm:^3.0.0" - checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 - languageName: node - linkType: hard - -"which-pm-runs@npm:^1.1.0": - version: 1.1.0 - resolution: "which-pm-runs@npm:1.1.0" - checksum: 10c0/b8f2f230aa49babe21cb93f169f5da13937f940b8cc7a47d2078d9d200950c0dba5ac5659bc01bdbe401e6db3adec6a97b6115215a4ca8e87fd714aebd0cabc6 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b - languageName: node - linkType: hard - -"widest-line@npm:^5.0.0": - version: 5.0.0 - resolution: "widest-line@npm:5.0.0" - dependencies: - string-width: "npm:^7.0.0" - checksum: 10c0/6bd6cca8cda502ef50e05353fd25de0df8c704ffc43ada7e0a9cf9a5d4f4e12520485d80e0b77cec8a21f6c3909042fcf732aa9281e5dbb98cc9384a138b2578 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrap-ansi@npm:^9.0.0": - version: 9.0.0 - resolution: "wrap-ansi@npm:9.0.0" - dependencies: - ansi-styles: "npm:^6.2.1" - string-width: "npm:^7.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/a139b818da9573677548dd463bd626a5a5286271211eb6e4e82f34a4f643191d74e6d4a9bb0a3c26ec90e6f904f679e0569674ac099ea12378a8b98e20706066 - languageName: node - linkType: hard - -"xxhash-wasm@npm:^1.1.0": - version: 1.1.0 - resolution: "xxhash-wasm@npm:1.1.0" - checksum: 10c0/35aa152fc7d775ae13364fe4fb20ebd89c6ac1f56cdb6060a6d2f1ed68d15180694467e63a4adb3d11936a4798ccd75a540979070e70d9b911e9981bbdd9cea6 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yallist@npm:^5.0.0": - version: 5.0.0 - resolution: "yallist@npm:5.0.0" - checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 - languageName: node - linkType: hard - -"yocto-queue@npm:^1.1.1": - version: 1.2.1 - resolution: "yocto-queue@npm:1.2.1" - checksum: 10c0/5762caa3d0b421f4bdb7a1926b2ae2189fc6e4a14469258f183600028eb16db3e9e0306f46e8ebf5a52ff4b81a881f22637afefbef5399d6ad440824e9b27f9f - languageName: node - linkType: hard - -"yocto-spinner@npm:^0.2.1": - version: 0.2.3 - resolution: "yocto-spinner@npm:0.2.3" - dependencies: - yoctocolors: "npm:^2.1.1" - checksum: 10c0/4c4527f68161334291355eae0ab9a8e1b988bd854eebd93697d9a88b008362d71ad9f24334a79e48aca6ba1c085e365cd2981ba5ddc0ea54cc3efd96f2d08714 - languageName: node - linkType: hard - -"yoctocolors@npm:^2.1.1": - version: 2.1.1 - resolution: "yoctocolors@npm:2.1.1" - checksum: 10c0/85903f7fa96f1c70badee94789fade709f9d83dab2ec92753d612d84fcea6d34c772337a9f8914c6bed2f5fc03a428ac5d893e76fab636da5f1236ab725486d0 - languageName: node - linkType: hard - -"zod-to-json-schema@npm:^3.24.5": - version: 3.24.5 - resolution: "zod-to-json-schema@npm:3.24.5" - peerDependencies: - zod: ^3.24.1 - checksum: 10c0/0745b94ba53e652d39f262641cdeb2f75d24339fb6076a38ce55bcf53d82dfaea63adf524ebc5f658681005401687f8e9551c4feca7c4c882e123e66091dfb90 - languageName: node - linkType: hard - -"zod-to-ts@npm:^1.2.0": - version: 1.2.0 - resolution: "zod-to-ts@npm:1.2.0" - peerDependencies: - typescript: ^4.9.4 || ^5.0.2 - zod: ^3 - checksum: 10c0/69375a29b04ac93fcfb7df286984a287c06219b51a0a70f15088baa662378d2078f4f96730f0090713df9172f02fe84ba9767cd2e1fbbc55f7d48b2190d9b0d9 - languageName: node - linkType: hard - -"zod@npm:^3.24.2": - version: 3.25.62 - resolution: "zod@npm:3.25.62" - checksum: 10c0/a98e53eddd689913a1d476ccfd3fd3ffbdf56c8e8606449445e4a36f31064551760c930c62381420605394e71b00d3397ea456637bacc7d2afe7c4946bf9c6b0 - languageName: node - linkType: hard - "zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": version: 2.0.4 resolution: "zwitch@npm:2.0.4" diff --git a/docs/index.md b/docs/index.md index a27e87d..28de238 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,9 +2,7 @@ title: Regor Documentation --- -The documentation has moved to [docs-site/src/content/docs/index.md](../docs-site/src/content/docs/index.md). +The documentation lives at [regor.purestack.studio](https://regor.purestack.studio/). Its PureStack source is in [docs-site/content/index.mdx](../docs-site/content/index.mdx). Please update your bookmarks. -You can also read it online at [https://tenray.io//regor](https://tenray.io//regor). - [Back to GitHub Repository](https://github.com/koculu/Regor) From 4f543fca930d615dd03f718927d2e75f136d7668 Mon Sep 17 00:00:00 2001 From: Ahmed Yasin Koculu Date: Thu, 8 Oct 2026 05:00:22 +0200 Subject: [PATCH 2/6] Add new regor home and customize the skin. --- docs-site/README.md | 75 +- docs-site/content/_nav.json | 3 + docs-site/content/assets/favicon.svg | 125 ---- docs-site/content/assets/social-preview.png | Bin 0 -> 208324 bytes docs-site/content/examples/chart-model.ts | 196 ++++++ docs-site/content/examples/chart-view.ts | 208 ++++++ docs-site/content/examples/signal-chart.ts | 65 ++ docs-site/content/footer.mdx | 14 + docs-site/content/header.mdx | 9 +- docs-site/content/home.ts | 54 ++ docs-site/content/index.mdx | 155 +++-- docs-site/content/purestack.config.ts | 4 + docs-site/content/siteConfig.json | 91 ++- docs-site/design/assets/social-preview.svg | 18 + docs-site/design/chartStyles.ts | 334 +++++++++ docs-site/design/components.ts | 55 ++ docs-site/design/plugin.ts | 88 +++ docs-site/design/skin.ts | 205 ++++++ docs-site/design/styles.ts | 727 ++++++++++++++++++++ docs-site/package.json | 10 +- docs-site/tsconfig.json | 13 + docs-site/yarn.lock | 32 +- 22 files changed, 2285 insertions(+), 196 deletions(-) create mode 100644 docs-site/content/_nav.json delete mode 100644 docs-site/content/assets/favicon.svg create mode 100644 docs-site/content/assets/social-preview.png create mode 100644 docs-site/content/examples/chart-model.ts create mode 100644 docs-site/content/examples/chart-view.ts create mode 100644 docs-site/content/examples/signal-chart.ts create mode 100644 docs-site/content/footer.mdx create mode 100644 docs-site/content/home.ts create mode 100644 docs-site/content/purestack.config.ts create mode 100644 docs-site/design/assets/social-preview.svg create mode 100644 docs-site/design/chartStyles.ts create mode 100644 docs-site/design/components.ts create mode 100644 docs-site/design/plugin.ts create mode 100644 docs-site/design/skin.ts create mode 100644 docs-site/design/styles.ts create mode 100644 docs-site/tsconfig.json diff --git a/docs-site/README.md b/docs-site/README.md index 12de8f6..7df7db4 100644 --- a/docs-site/README.md +++ b/docs-site/README.md @@ -6,18 +6,18 @@ Use Node.js 22 or newer and Yarn 4.9.2. From this directory: ```sh yarn install --immutable -yarn dev +yarn serve ``` Open . PureStack watches `content/` and reloads changes. ```sh -yarn build # Clean development build in docs-dist/ -yarn release # Minified deployment artifact in docs-publish/ +yarn build # Clean development build in dist/web-dev/ +yarn release # Minified deployment artifact in dist/web/ ``` `release` prepares static files; it does not upload them. Serve the contents of -`docs-publish/` at the root of `regor.purestack.studio`, with directory-index +`dist/web/` at the root of `regor.purestack.studio`, with directory-index support (`/guide/` serves `/guide/index.html`). No `/regor` base path is needed. DNS and the host's TLS certificate must be configured for that domain separately. @@ -30,5 +30,70 @@ files in `content/`; they are copied into the output at the same relative path. table of contents, Pagefind search, syntax highlighting, sitemap, and robots.txt. The sitemap uses `https://regor.purestack.studio` as its public URL. -The docs CI workflow builds a release and uploads `docs-publish/` as an artifact. +Navigation uses PureStack's hybrid mode. `content/_nav.json` enables Previous +and Next page links throughout the docs, following the sidebar's page order +within the guide, directives, and API sections. + +The site config explicitly sets stylesheet paths, output minification, script +cache busting, authentication policy, navigation, sidebar offsets, search, +and crawler settings. Consent uses PureStack's native component on the homepage +and docs, with its settings control in the footer and the privacy policy linked +directly to PureStack Studio. + +The social preview is `content/assets/social-preview.png` (1200 × 630). Its +editable source is `design/assets/social-preview.svg`, using the library's +orbit icon and the site's chartreuse/graphite palette. + Regor's npm package is built and published independently from this site. + +## Site design + +`content/purestack.config.ts` registers the site plugin in `design/plugin.ts`. +It adds a custom homepage template, reusable Regor components, and a document +heading while retaining PureStack's documentation layout, search, navigation, +and table of contents. + +`design/skin.ts` defines a vivid chartreuse identity on warm cream and graphite, +with a restrained orchid companion for PureStack. The palette feeds +the framework's semantic tones, so buttons, search, navigation, and panels +share the same colors. `design/styles.ts` registers typed, responsive styles +in PureStack's generated stylesheets; there is no separate CSS asset. + +The live workbench and ecosystem section use PureStack's `theme--dark` regions +in both modes. Headline highlights and the closing section carry the bright +signal color; documentation links use a darker green in light mode for contrast. + +The logo and generated favicon use `lucide:orbit` from PureStack's +`ts-svg-icons` library, with the same mark in the ecosystem diagram and footer. + +Edit the homepage in `content/index.mdx`, the shared header/footer in their +MDX files, and the live counter/clipboard behavior in `content/home.ts`. +PureStack bundles the browser entry through `PageScript`. The source tabs use +the built-in `Tabs` and `TabPane` components. + +## Live SVG example + +The homepage's Signal Studio demonstrates three simulated event streams with +animated SVG paths, workload presets, intensity controls, series toggles, +computed summary metrics, and pointer or keyboard sample inspection. + +- `content/examples/chart-model.ts`: refs, derived data, and smooth SVG paths. +- `content/examples/chart-view.ts`: the shared Regor template, including keyed + SVG lists, attribute bindings, and two-way form controls. +- `content/examples/signal-chart.ts`: browser mounting, resize handling, and + animation lifecycle. `home.ts` imports this entry, so the homepage uses one + bundle for its counter and chart. + +The build renders a static preview with the same model and template. The +browser mounts the interactive version, respects reduced-motion preferences, +and stops the frame clock when the chart is offscreen, the tab is hidden, or +the app is unmounted. The chart uses synthetic data and no chart library. + +The expandable source panel uses `` for all three files, so +the displayed examples stay identical to the implementation. + +Type-check site extensions from the repository root: + +```sh +yarn tsc -p docs-site/tsconfig.json --noEmit +``` diff --git a/docs-site/content/_nav.json b/docs-site/content/_nav.json new file mode 100644 index 0000000..569b79b --- /dev/null +++ b/docs-site/content/_nav.json @@ -0,0 +1,3 @@ +{ + "pageLinks": true +} diff --git a/docs-site/content/assets/favicon.svg b/docs-site/content/assets/favicon.svg deleted file mode 100644 index 7f303e0..0000000 --- a/docs-site/content/assets/favicon.svg +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs-site/content/assets/social-preview.png b/docs-site/content/assets/social-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..b23c1aeb83eb1806fe23b02eb4433a1daeb5a138 GIT binary patch literal 208324 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∾?Sz(Ewn3+hQ>bT;51)^ObjUwx8X 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.map((s) => s.id)) + const selected = ref(null) + const width = ref(980) + const plot = computed(() => ({ ...vertical, left: 58, right: width() - 36 })) + const index = computed(() => selected() ?? samples - 1) + const cursorX = computed( + () => + plot().left + (index() / (samples - 1)) * (plot().right - plot().left), + ) + const signals = computed(() => + definitions.map((s) => ({ ...s, enabled: enabled().includes(s.id) })), + ) + const series = computed(() => { + const time = phase() + const scale = intensity() / 100 + const mode = workload() + const bounds = plot() + return definitions + .filter((s) => enabled().includes(s.id)) + .map((signal) => { + const values = Array.from({ length: samples }, (_, i) => { + const x = i / (samples - 1) + const wave = Math.sin(i * 0.15 + time * 0.7 + signal.offset) + const detail = Math.sin(i * 0.39 - time * 0.4 + signal.offset) * 0.22 + const surge = + mode === 'launch' + ? Math.exp( + -(((x - (0.58 + Math.sin(time * 0.3) * 0.14)) / 0.13) ** 2), + ) * 66 + : 0 + const pulse = + mode === 'waves' ? Math.sin(i * 0.28 + time * 1.3) * 22 : 0 + return Math.max( + 4, + Math.min( + bounds.ceiling - 4, + (signal.base + + (wave + detail) * signal.amplitude + + surge + + pulse) * + scale, + ), + ) + }) + const points = values.map((value, i) => ({ + x: bounds.left + (i / (samples - 1)) * (bounds.right - bounds.left), + y: + bounds.bottom - + (value / bounds.ceiling) * (bounds.bottom - bounds.top), + })) + const line = smoothPath(points) + return { + ...signal, + values, + points, + line, + area: `${line} L ${bounds.right} ${bounds.bottom} L ${bounds.left} ${bounds.bottom} Z`, + } + }) + }) + const readout = computed(() => + series().map((s) => ({ + id: s.id, + label: s.label, + value: Math.round(s.values[index()]), + x: s.points[index()].x, + y: s.points[index()].y, + })), + ) + const average = computed(() => + Math.round( + series().reduce( + (sum, s) => sum + s.values.reduce((a, b) => a + b, 0) / samples, + 0, + ), + ), + ) + const peak = computed(() => + Math.round(Math.max(0, ...series().flatMap((s) => s.values))), + ) + const status = computed(() => + !interactive ? 'Static preview' : running() ? 'Live simulation' : 'Paused', + ) + const sampleLabel = computed( + () => `Sample ${String(index() + 1).padStart(2, '0')} / ${samples}`, + ) + const description = computed( + () => + `${series().length} visible streams. Average combined rate ${average()} events per second. Peak stream rate ${peak()} events per second. ${status()}.`, + ) + + return { + interactive, + phase, + intensity, + workload, + running, + signals, + series, + readout, + average, + peak, + status, + sampleLabel, + description, + selected, + index, + cursorX, + plot, + width, + grid: [0, 60, 120, 180, 240].map((value) => ({ + value, + y: + vertical.bottom - + (value / vertical.ceiling) * (vertical.bottom - vertical.top), + })), + ticks: computed(() => + [0, 14, 29, 44, 59].map((i) => ({ + x: plot().left + (i / (samples - 1)) * (plot().right - plot().left), + label: String(i + 1).padStart(2, '0'), + })), + ), + toggle: (id: string) => { + const current = enabled() + if (current.includes(id)) { + enabled(current.filter((s) => s !== id)) + } else enabled([...current, id]) + }, + togglePlayback: () => running(!running()), + newWindow: () => phase(phase() + 12), + selectSample: (event: Event) => + selected((event.target as HTMLInputElement).valueAsNumber), + inspect: (event: PointerEvent) => { + const rect = ( + event.currentTarget as SVGSVGElement + ).getBoundingClientRect() + const x = ((event.clientX - rect.left) / rect.width) * width() + const bounds = plot() + selected( + Math.max( + 0, + Math.min( + samples - 1, + Math.round( + ((x - bounds.left) / (bounds.right - bounds.left)) * + (samples - 1), + ), + ), + ), + ) + }, + followLatest: () => selected(null), + } +} + +export type ChartModel = ReturnType diff --git a/docs-site/content/examples/chart-view.ts b/docs-site/content/examples/chart-view.ts new file mode 100644 index 0000000..0587154 --- /dev/null +++ b/docs-site/content/examples/chart-view.ts @@ -0,0 +1,208 @@ +import { html } from 'regor' + +export const chartTemplate = html`
+
+
+ SIGNAL STUDIO +

Three streams. One reactive view.

+
+
+ + + +
+
+
+ + +
+ +
+
+
+
+ Total average events/s +
+
+ Stream peak events/s +
+
+ Visible streams / 3 +
+
+
+

+ Enable a stream to bring the chart back. +

+ + + Simulated event rates across 60 samples + + + + + + + + + + + + + EVENTS / SECOND + + + + + + +
+
+ +
+ +
+ +
+
+ Synthetic data. Real reactive SVG.60 samples · 3 streams · no chart dependency +
+
` diff --git a/docs-site/content/examples/signal-chart.ts b/docs-site/content/examples/signal-chart.ts new file mode 100644 index 0000000..42137af --- /dev/null +++ b/docs-site/content/examples/signal-chart.ts @@ -0,0 +1,65 @@ +import { createApp, observe, onMounted, onUnmounted, useScope } from 'regor' +import { createChartModel } from './chart-model' +import { chartTemplate } from './chart-view' + +const root = document.getElementById('signal-chart') +if (root) { + createApp( + useScope(() => { + const model = createChartModel(true) + const reducedMotion = matchMedia('(prefers-reduced-motion: reduce)') + if (reducedMotion.matches) model.running(false) + let visible = false + let frame = 0 + let lastTime = 0 + + // Regor owns the state and SVG bindings. The browser supplies a frame clock. + const tick = (time: number) => { + if (lastTime === 0) lastTime = time + if (time - lastTime >= 32) { + model.phase(model.phase() + Math.min(time - lastTime, 80) / 1000) + lastTime = time + } + frame = requestAnimationFrame(tick) + } + const reconcile = () => { + cancelAnimationFrame(frame) + frame = 0 + lastTime = 0 + if (visible && model.running() && !document.hidden) + frame = requestAnimationFrame(tick) + } + const visibility = new IntersectionObserver( + (entries) => { + visible = entries.some((entry) => entry.isIntersecting) + reconcile() + }, + { threshold: 0.1 }, + ) + const motionChanged = () => { + if (reducedMotion.matches) model.running(false) + } + const resize = new ResizeObserver((entries) => { + const width = entries[0]?.contentRect.width + if (width > 0) model.width(width) + }) + observe(model.running, reconcile) + onMounted(() => { + visibility.observe(root) + const svg = root.querySelector('.signal-svg') + if (svg) resize.observe(svg) + document.addEventListener('visibilitychange', reconcile) + reducedMotion.addEventListener('change', motionChanged) + }) + onUnmounted(() => { + cancelAnimationFrame(frame) + visibility.disconnect() + resize.disconnect() + document.removeEventListener('visibilitychange', reconcile) + reducedMotion.removeEventListener('change', motionChanged) + }) + return model + }), + { element: root, template: chartTemplate }, + ) +} diff --git a/docs-site/content/footer.mdx b/docs-site/content/footer.mdx new file mode 100644 index 0000000..9a4a5e6 --- /dev/null +++ b/docs-site/content/footer.mdx @@ -0,0 +1,14 @@ +
diff --git a/docs-site/content/header.mdx b/docs-site/content/header.mdx index 5f33233..24546eb 100644 --- a/docs-site/content/header.mdx +++ b/docs-site/content/header.mdx @@ -1,10 +1,9 @@ - + diff --git a/docs-site/content/home.ts b/docs-site/content/home.ts new file mode 100644 index 0000000..0a6cf45 --- /dev/null +++ b/docs-site/content/home.ts @@ -0,0 +1,54 @@ +import { createApp, html, ref } from 'regor' +import './examples/signal-chart' + +const count = ref(0) +createApp( + { + count, + increment: () => count(count() + 1), + reset: () => count(0), + }, + { + selector: '#counter', + template: html`
+ 0 + count +
+
+ + +
`, + }, +) + +const status = document.getElementById('copy-status') +for (const button of document.querySelectorAll( + '[data-copy]', +)) { + button.addEventListener('click', async () => { + const source = document.getElementById(button.dataset.copy ?? '') + if (!source) return + try { + await navigator.clipboard.writeText(source.textContent?.trim() ?? '') + if (status) status.textContent = 'Install command copied.' + } catch { + const range = document.createRange() + range.selectNodeContents(source) + const selection = window.getSelection() + selection?.removeAllRanges() + selection?.addRange(range) + if (status) + status.textContent = 'Command selected. Use your browser’s Copy action.' + } + }) +} diff --git a/docs-site/content/index.mdx b/docs-site/content/index.mdx index 83b7037..6649799 100644 --- a/docs-site/content/index.mdx +++ b/docs-site/content/index.mdx @@ -1,55 +1,132 @@ --- -title: Regor -description: Direct DOM binding, precise reactivity, and TypeScript-native workflows for real applications. -template: doc +title: Reactive UI for HTML and SVG +description: A reactive UI library for TypeScript. Connect state to HTML and SVG, compose components, and update the DOM directly. +template: regor order: 1 +nav: + title: Home layout: + fullWidth: true + showNav: false showToc: false --- -# Reactive UI without framework lock-in +
+
+
+ Regor · Open source UI library +

Small signals.
Big possibilities.

+

Regor is a reactive UI library for TypeScript. Connect state to HTML and SVG, compose components, and update the DOM directly.

+ + Start building + Explore the guide + +
npm install regor
+

Start with existing markup. Add reactivity where you need it.

+
+
+
+
Two files. One reactive counter.REGOR
+
+ + -Regor gives you direct DOM binding, precise reactivity primitives, and -TypeScript-native workflows for real applications. +```ts +import { createApp, ref } from 'regor' - - Start building - Read the guide - GitHub - +const count = ref(0) -Regor is a modern reactive UI library for teams that want **power and control**. -Bind existing markup, build components in TypeScript, and adopt reactivity at -your own pace. +createApp({ + count, + increment: () => count(count() + 1), + reset: () => count(0), +}, { selector: '#counter' }) +``` - - - - - - - - - - + + -## Start here +```html +
+ 0 + + +
+``` -- [Overview](/overview/) - Core philosophy, strengths, and tradeoffs. -- [Getting started](/getting-started/) - Install and ship your first Regor app. -- [Guide](/guide/) - Reactivity, templates, components, lifecycle, and troubleshooting. -- [Directives](/directives/) - Syntax, behavior, and practical usage patterns. -- [API reference](/api/) - Complete API index by category. -- [Performance guide](/guide/performance/) - Benchmark and optimize with confidence. +
+
+
+
+
Live preview · try it
+
+
0count
+
+
+ +
+
State → DOM. Directly.No Virtual DOM.
+
+
+
-## Regor and PureStack +
+
DOM-firstEnhance the markup you already have.
+
Fine-grained reactivityRefs, computed values, and observers.
+
TypeScript-nativeTyped props, contexts, and components.
+
-This documentation is built with [PureStack](https://purestack.studio/), which -uses Regor for its components and browser behavior. Write Markdown for content -and use Regor MDX when a page needs components or interactivity. +
+
01 / Closer to the web

State to screen.
With less ceremony.

Bind a single element or compose an application. The same primitives connect your state, markup, and components.

+
+ + + +
+
-## Community and contribution +
+
+
02 / A beautiful full circle

Better together.
From UI to docs.

Regor powers PureStack's UI. It renders PureStack's components and powers its interactive browser applications.

PureStack builds Regor's docs. It turns this site's Markdown, Regor components, and typed styles into HTML, CSS, and JavaScript.

This site puts both to work: PureStack generates the pages, and Regor runs the interactive examples.

+
+ +

Built with PureStack. Interactive with Regor.

+
+
+
-- [GitHub Discussions](https://github.com/koculu/regor/discussions) -- [Contributing guide](https://github.com/koculu/regor/blob/main/.github/CONTRIBUTING.md) -- [Issue tracker](https://github.com/koculu/regor/issues) +
+
03 / Find your next step

Start here.
Keep building.

Follow the guide to your first app, then use the directive and API references as you build.

+
+ + + + +
+
+ +
+
04 / State in motion

Reactive data.
Live SVG.

Change the workload, adjust intensity, or toggle streams. The chart and its metrics update from the same state.

+
+ +
+ Explore the sourceState · SVG template · animation lifecycle +
+ + + + + +
+
+

Refs hold the state. Computed values derive the curves and metrics. Keyed SVG elements update in place. Learn about reactivity and lifecycle cleanup.

+
+ +

Make your next idea reactive.

Add Regor to your project and connect your first piece of state.

Start building
+ + diff --git a/docs-site/content/purestack.config.ts b/docs-site/content/purestack.config.ts new file mode 100644 index 0000000..727f178 --- /dev/null +++ b/docs-site/content/purestack.config.ts @@ -0,0 +1,4 @@ +import { defineConfig } from 'purestack' +import { regorPlugin } from '../design/plugin' + +export default defineConfig({ plugins: [regorPlugin] }) diff --git a/docs-site/content/siteConfig.json b/docs-site/content/siteConfig.json index 2214e61..bc1c524 100644 --- a/docs-site/content/siteConfig.json +++ b/docs-site/content/siteConfig.json @@ -1,41 +1,100 @@ { "$schema": "../node_modules/@purestack/ts-ssg/schema/siteConfig.schema.json", "siteTitle": "Regor", + "favicon": "lucide:orbit", "logo": { "brand": "Regor", - "imageSrc": "/assets/regor-logo.svg", + "icon": "lucide:orbit", + "markStyle": "solid", + "markBackground": "var(--ps-semantic-tone-accent-button-rest-background)", + "markColor": "var(--ps-semantic-tone-accent-button-rest-text)", "href": "/", - "ariaLabel": "Regor home" + "ariaLabel": "Regor home", + "suffix": "", + "size": "md" }, "style": { "themes": ["light", "dark"], "theme": { - "skin": "standard", - "presets": ["blue"] - } + "skin": "regor" + }, + "fileName": "site.css", + "href": "/assets/site.css", + "pretty": false }, "navigation": { - "mode": "auto", + "mode": "hybrid", + "navFileName": "_nav.json", "maxDepth": 3, "includeIndex": true, - "sortBy": "order" + "sortBy": "order", + "roots": ["guide", "directives", "api"], + "variant": "spotlight", + "class": "spotlight-from-bottom-right" + }, + "pageToc": { + "enabled": true + }, + "pagefind": { + "enabled": true, + "excludePaths": [] }, - "pageToc": { "enabled": true }, - "pagefind": { "enabled": true }, "sitemap": { "enabled": true, "baseUrl": "https://regor.purestack.studio", "robots": { "enabled": true, - "host": "regor.purestack.studio" - } + "host": "regor.purestack.studio", + "fileName": "robots.txt", + "userAgent": "*", + "allow": ["/"], + "disallow": [], + "crawlDelay": 2, + "additionalSitemaps": [], + "customDirectives": ["# Generated by PureStack"] + }, + "fileName": "sitemap.xml" }, "preview": { - "title": "Regor", - "description": "Direct DOM binding, precise reactivity, and TypeScript-native workflows for real applications.", - "siteName": "Regor" + "title": "Regor | Small signals. Big possibilities.", + "description": "A reactive UI library for TypeScript. Connect state to HTML and SVG, compose components, and update the DOM directly.", + "siteName": "Regor", + "image": "/assets/social-preview.png", + "imageAlt": "Regor. Small signals. Big possibilities. Reactive UI for HTML and SVG, in chartreuse on graphite.", + "imageWidth": 1200, + "imageHeight": 630, + "twitterCard": "summary_large_image" + }, + "mdx": { + "highlighter": "shiki" }, - "mdx": { "highlighter": "shiki" }, "outDir": "../dist/web-dev", - "publishDir": "../dist/web" + "publishDir": "../dist/web", + "auth": { + "enabled": false, + "signUp": false + }, + "html": { + "minify": true + }, + "scripts": { + "cacheBusting": true + }, + "consent": { + "enabled": true, + "policyVersion": "2026-10-07", + "privacyPolicyUrl": "https://purestack.studio/legal/privacy/", + "categories": [ + { + "id": "necessary", + "label": "Necessary", + "required": true + } + ], + "services": [] + }, + "docLayout": { + "sidebarTop": "5.5625rem", + "sidebarTopMobile": "4.875rem" + } } diff --git a/docs-site/design/assets/social-preview.svg b/docs-site/design/assets/social-preview.svg new file mode 100644 index 0000000..4cee33e --- /dev/null +++ b/docs-site/design/assets/social-preview.svg @@ -0,0 +1,18 @@ + + + + + +Regor. +Small signals. +Big possibilities. +Reactive UI for HTML and SVG. +Built with TypeScript. Close to your DOM. + + + + + + + +DIRECT DOM / REACTIVE STATE / OPEN SOURCEregor.purestack.studio \ No newline at end of file diff --git a/docs-site/design/chartStyles.ts b/docs-site/design/chartStyles.ts new file mode 100644 index 0000000..87562e9 --- /dev/null +++ b/docs-site/design/chartStyles.ts @@ -0,0 +1,334 @@ +import type { Style } from '@purestack/ts-css' +import type { ThemePalette } from '@purestack/ts-style' +import { regorColors } from './skin' + +const mono = "'Cascadia Code', 'SFMono-Regular', Consolas, monospace" + +export function registerChartStyles(root: Style, palette: ThemePalette) { + const t = palette.semanticTone + root.select('.signal-demo').css({ paddingTop: '0' }) + root.select('.signal-dashboard').css({ + border: `1px solid ${t.neutral.border.default}`, + borderRadius: '16px', + background: t.neutral.canvas, + color: t.neutral.text.default, + overflow: 'hidden', + boxShadow: palette.effect.softShadow, + }) + root.select('.signal-toolbar').css({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: '24px', + padding: '28px 32px', + borderBottom: `1px solid ${t.neutral.border.subtle}`, + }) + root.select('.signal-kicker').css({ + color: t.accent.text.default, + font: `11px/1.5 ${mono}`, + letterSpacing: '1.5px', + }) + root.select('.signal-toolbar h3').css({ + fontSize: '20px', + marginTop: '7px', + letterSpacing: '-0.5px', + color: t.neutral.text.default, + }) + root.select('.signal-actions').css({ + display: 'flex', + alignItems: 'center', + gap: '10px', + flexWrap: 'wrap', + }) + root.select('.signal-status').css({ + display: 'inline-flex', + alignItems: 'center', + gap: '8px', + marginRight: '10px', + color: t.neutral.text.subtle, + font: `10px/1.5 ${mono}`, + whiteSpace: 'nowrap', + }) + root.select('.signal-status i').css({ + width: '6px', + height: '6px', + background: t.neutral.text.subtle, + borderRadius: '50%', + }) + root.select('.signal-status.is-live i').css({ + background: regorColors.signal, + boxShadow: `0 0 0 4px ${regorColors.signal}16`, + }) + root.select('.signal-button').css({ + padding: '9px 12px', + border: `1px solid ${t.neutral.border.default}`, + borderRadius: '6px', + background: t.neutral.surface.rest.bgcolor, + color: t.neutral.text.default, + fontSize: '12px !important', + lineHeight: '1.4', + transition: 'border-color 160ms', + }) + root + .select('.signal-button:hover') + .css({ borderColor: t.accent.text.default }) + root + .select( + '.signal-dashboard button:disabled, .signal-dashboard input:disabled, .signal-dashboard select:disabled', + ) + .css({ cursor: 'default', opacity: '0.6' }) + root.select('.signal-controls').css({ + display: 'flex', + alignItems: 'end', + flexWrap: 'wrap', + gap: '24px', + padding: '24px 32px', + }) + root.select('.signal-field').css({ + display: 'flex', + flexWrap: 'wrap', + alignItems: 'center', + justifyContent: 'space-between', + gap: '8px', + width: '170px', + font: `10px/1.5 ${mono}`, + color: t.neutral.text.subtle, + }) + root.select('.signal-field select').css({ + width: '100%', + border: `1px solid ${t.neutral.border.default}`, + borderRadius: '6px', + background: t.neutral.surface.rest.bgcolor, + color: t.neutral.text.default, + padding: '9px', + font: '12px/1.5 inherit', + }) + root.select('.signal-dashboard input[type=range]').css({ + accentColor: regorColors.signal, + cursor: 'pointer', + minWidth: '0', + height: '18px', + margin: '0', + }) + root + .select('.signal-intensity input') + .css({ width: '100%', marginBlock: '8px !important' }) + root.select('.signal-legend').css({ + display: 'flex', + alignItems: 'center', + gap: '8px', + marginLeft: 'auto', + flexWrap: 'wrap', + paddingBottom: '3px', + }) + root.select('.signal-chip').css({ + display: 'inline-flex', + alignItems: 'center', + gap: '7px', + border: `1px solid ${t.neutral.border.default}`, + borderRadius: '6px', + padding: '8px 11px', + background: 'transparent', + color: t.neutral.text.default, + fontSize: '12px !important', + lineHeight: '1.4', + }) + root.select('.signal-chip i, .signal-readouts i').css({ + background: 'var(--signal-color)', + width: '7px', + height: '7px', + borderRadius: '50%', + flexShrink: '0', + }) + root.select('.signal-chip.is-hidden').css({ opacity: '0.45' }) + root.select('.signal-chip:hover').css({ borderColor: 'var(--signal-color)' }) + root.select('.signal--search').set('--signal-color', regorColors.signal) + root.select('.signal--events').set('--signal-color', '#efb1df') + root.select('.signal--jobs').set('--signal-color', '#f2f3ed') + root.select('.signal-metrics').css({ + display: 'grid', + gridTemplateColumns: 'repeat(3,minmax(0,1fr))', + gap: '24px', + padding: '4px 32px 24px', + }) + root.select('.signal-metrics > div > span').css({ + display: 'block', + color: t.neutral.text.subtle, + font: `10px/1.5 ${mono}`, + }) + root.select('.signal-metrics strong').css({ + display: 'block', + marginTop: '8px', + fontSize: '30px', + fontWeight: '550', + lineHeight: '1.2', + letterSpacing: '-1px', + fontVariantNumeric: 'tabular-nums', + }) + root.select('.signal-metrics small').css({ + fontSize: '11px', + color: t.neutral.text.subtle, + fontWeight: '400', + letterSpacing: '0', + }) + root + .select('.signal-plot') + .css({ position: 'relative', marginInline: '16px' }) + root.select('.signal-svg').css({ + display: 'block', + width: '100%', + height: 'auto', + overflow: 'visible', + touchAction: 'pan-y', + }) + root + .select('.signal-svg text') + .css({ font: `10px/1 ${mono}`, fill: t.neutral.text.subtle }) + root.select('.signal-grid line').css({ + stroke: t.neutral.border.subtle, + strokeDasharray: '3 6', + vectorEffect: 'non-scaling-stroke', + }) + root + .select('.signal-axis-label') + .css({ fontSize: '8px !important', letterSpacing: '1px' }) + root.select('.signal-line').css({ + fill: 'none', + stroke: 'var(--signal-color)', + strokeWidth: '2.2px', + strokeLinecap: 'round', + strokeLinejoin: 'round', + vectorEffect: 'non-scaling-stroke', + }) + root.select('.signal-stop').css({ stopColor: 'var(--signal-color)' }) + root.select('.signal-cursor').css({ + stroke: t.neutral.text.subtle, + strokeDasharray: '3 5', + strokeOpacity: '0.45', + vectorEffect: 'non-scaling-stroke', + }) + root.select('.signal-point').css({ + fill: t.neutral.canvas, + stroke: 'var(--signal-color)', + strokeWidth: '2px', + vectorEffect: 'non-scaling-stroke', + }) + root.select('.signal-empty').css({ + position: 'absolute', + top: '40%', + left: '0', + right: '0', + textAlign: 'center', + fontSize: '13px', + color: t.neutral.text.subtle, + }) + root.select('.signal-inspector').css({ + display: 'flex', + alignItems: 'center', + flexWrap: 'wrap', + gap: '20px', + padding: '18px 32px', + borderTop: `1px solid ${t.neutral.border.subtle}`, + }) + root.select('.signal-sample').css({ + color: t.neutral.text.subtle, + font: `10px/1.5 ${mono}`, + whiteSpace: 'nowrap', + }) + root.select('.signal-readouts').css({ + display: 'flex', + alignItems: 'center', + flexWrap: 'wrap', + gap: '18px', + fontSize: '12px', + }) + root.select('.signal-readouts > span').css({ + display: 'flex', + alignItems: 'center', + gap: '7px', + color: t.neutral.text.subtle, + }) + root.select('.signal-readouts strong').css({ + color: 'var(--signal-color)', + font: `12px/1.5 ${mono}`, + minWidth: '24px', + }) + root.select('.signal-scrubber').css({ + display: 'flex', + alignItems: 'center', + gap: '10px', + font: `10px/1.5 ${mono}`, + color: t.neutral.text.subtle, + marginLeft: 'auto', + }) + root.select('.signal-scrubber input').css({ width: '120px' }) + root.select('.signal-footnote').css({ + display: 'flex', + justifyContent: 'space-between', + gap: '16px', + padding: '12px 32px', + background: t.neutral.surfaceAlt.rest.bgcolor, + color: t.neutral.text.subtle, + font: `9px/1.5 ${mono}`, + }) + root.select('.signal-source').css({ + marginTop: '16px', + border: `1px solid ${t.neutral.border.subtle}`, + borderRadius: '10px', + background: t.neutral.surface.rest.bgcolor, + overflow: 'hidden', + }) + root.select('.signal-source summary').css({ + padding: '18px 24px', + cursor: 'pointer', + fontSize: '13px', + fontWeight: '600', + }) + root.select('.signal-source summary span').css({ + float: 'right', + color: t.neutral.text.subtle, + font: `10px/1.8 ${mono}`, + }) + root + .select('.signal-source .tabs__panel-body') + .css({ maxHeight: '420px', overflowY: 'auto' }) + root.select('.signal-source pre').css({ + margin: '0 !important', + fontSize: '12px', + border: '0', + borderRadius: '0', + }) + root.select('.signal-demo-note').css({ + marginTop: '18px !important', + fontSize: '12px', + color: t.neutral.text.subtle, + }) + root + .select('.signal-demo-note a') + .css({ textDecoration: 'underline !important', textUnderlineOffset: '3px' }) + const mobile = root.media('max-width: 760px') + mobile.select('.signal-toolbar').css({ + alignItems: 'start', + flexDirection: 'column', + padding: '22px', + gap: '18px', + }) + mobile.select('.signal-controls').css({ padding: '20px 22px', gap: '18px' }) + mobile.select('.signal-field').css({ width: 'calc(50% - 9px)' }) + mobile.select('.signal-legend').css({ marginLeft: '0', width: '100%' }) + mobile.select('.signal-metrics').css({ padding: '0 22px 20px', gap: '12px' }) + mobile.select('.signal-metrics strong').css({ fontSize: '24px' }) + mobile + .select('.signal-metrics small') + .css({ display: 'block', marginTop: '3px' }) + mobile.select('.signal-plot').css({ marginInline: '4px' }) + mobile.select('.signal-svg').css({ minHeight: '180px' }) + mobile.select('.signal-inspector').css({ padding: '16px 22px', gap: '12px' }) + mobile.select('.signal-readouts').css({ width: '100%', gap: '12px' }) + mobile.select('.signal-scrubber').css({ marginLeft: '0', width: '100%' }) + mobile.select('.signal-scrubber input').css({ flex: '1' }) + mobile + .select('.signal-footnote') + .css({ padding: '12px 22px', flexDirection: 'column', gap: '4px' }) + mobile.select('.signal-source summary span').css({ display: 'none' }) +} diff --git a/docs-site/design/components.ts b/docs-site/design/components.ts new file mode 100644 index 0000000..1a8a61f --- /dev/null +++ b/docs-site/design/components.ts @@ -0,0 +1,55 @@ +import { defineComponent, html } from 'regor' +import { + type ChartModel, + createChartModel, +} from '../content/examples/chart-model' +import { chartTemplate } from '../content/examples/chart-view' + +export interface RegorFeature { + number: string + title: string + summary: string + href: string + icon: string +} + +const featureTemplate = html`` + +export interface RegorResource { + number: string + title: string + summary: string + href: string +} + +const resourceTemplate = html` + {{ number }} +
+

{{ title }}

+

{{ summary }}

+
+ +
` + +export function defineRegorComponents() { + return { + SignalChart: defineComponent(chartTemplate, { + context: () => createChartModel(), + }), + RegorFeature: defineComponent(featureTemplate, { + props: ['number', 'title', 'summary', 'href', 'icon'], + }), + RegorResource: defineComponent(resourceTemplate, { + props: ['number', 'title', 'summary', 'href'], + }), + } +} diff --git a/docs-site/design/plugin.ts b/docs-site/design/plugin.ts new file mode 100644 index 0000000..176a696 --- /dev/null +++ b/docs-site/design/plugin.ts @@ -0,0 +1,88 @@ +import { h } from '@purestack/ts-html' +import { definePlugin, resolvePageTemplate } from 'purestack' +import { defineRegorComponents } from './components' +import { regorSkin } from './skin' +import { registerRegorStyles } from './styles' + +const defaultDoc = resolvePageTemplate('doc').pageTemplate + +export const regorPlugin = definePlugin({ + name: 'regor-site', + skins: { regor: regorSkin }, + components: () => defineRegorComponents(), + templates: { + doc: async (input) => { + const group = input.pageInfo.urlPath.split('/').filter(Boolean)[0] + const sections: Record = { + guide: 'Guide', + api: 'API reference', + directives: 'Directives', + } + const heading = h('header') + .class('regor-doc-heading') + .id('main') + .attr({ tabindex: '-1' }) + .push( + h('nav') + .class('regor-breadcrumb') + .attr({ 'aria-label': 'Breadcrumb' }) + .push( + h('a').attr({ href: '/' }).text('Regor'), + h('span').attr({ 'aria-hidden': 'true' }).text('/'), + ...(sections[group] + ? [ + h('a') + .attr({ href: `/${group}/` }) + .text(sections[group]), + ] + : [h('span').text('Documentation')]), + ), + h('h1').text( + input.pageInfo.frontmatter.title ?? 'Regor documentation', + ), + ...(input.pageInfo.frontmatter.description + ? [h('p').text(input.pageInfo.frontmatter.description)] + : []), + ) + input.head.push( + h('noscript').push( + h('style').raw( + 'html:not([data-theme-ready]) body{visibility:visible}', + ), + ), + ) + const page = await defaultDoc({ + ...input, + bodyHtml: heading.toHtml() + input.bodyHtml, + }) + return page.attr({ 'data-theme': 'light' }) + }, + regor: ({ head, bodyHtml, headerHtml, footerHtml }) => { + head.push( + h('noscript').push( + h('style').raw( + 'html:not([data-theme-ready]) body{visibility:visible}', + ), + ), + ) + return h('html') + .attr({ lang: 'en', 'data-theme': 'light' }) + .push( + head, + h('body') + .class('regor-home tone--neutral') + .push( + h('a') + .class('regor-skip') + .attr({ href: '#main' }) + .text('Skip to content'), + h('').raw(headerHtml ?? ''), + h('main').id('main').attr({ tabindex: '-1' }).raw(bodyHtml), + h('consent'), + h('').raw(footerHtml ?? ''), + ), + ) + }, + }, + hooks: { onConfigResolved: () => registerRegorStyles() }, +}) diff --git a/docs-site/design/skin.ts b/docs-site/design/skin.ts new file mode 100644 index 0000000..18fc5a7 --- /dev/null +++ b/docs-site/design/skin.ts @@ -0,0 +1,205 @@ +import { + type ThemePalette, + type ThemeSkin, + themeSkins, +} from '@purestack/ts-style' +import { merge } from '@purestack/ts-util' + +type Tone = ThemePalette['semanticTone']['neutral'] + +// One vivid signal against quiet, warm neutrals. Never blue or navy. +export const regorColors = { + signal: '#d2fa56', + signalHover: '#e1ff86', + signalActive: '#bfe840', + onSignal: '#18200e', + light: { + canvas: '#f6f5ee', + surface: '#fffef8', + surfaceAlt: '#eeeee4', + hover: '#e9ecdf', + active: '#e0e5d3', + ink: '#20251c', + muted: '#606957', + border: '#d1d7c7', + subtle: '#e0e4d8', + accentInk: '#44601c', + accentSurface: '#f0f6dd', + accentBorder: '#c0d497', + }, + dark: { + canvas: '#101211', + surface: '#1c1f1d', + surfaceAlt: '#151816', + hover: '#272c28', + active: '#30362f', + ink: '#f2f3ed', + muted: '#aeb3a9', + border: '#3c423a', + subtle: '#2d322c', + accentInk: '#d2fa56', + accentSurface: '#242f15', + accentBorder: '#465d26', + }, +} as const + +function state(background: string, border: string, text: string) { + return { background, bgcolor: background, border, text } +} + +function createNeutral(dark: boolean): Tone { + const c = dark ? regorColors.dark : regorColors.light + const text = { default: c.ink, subtle: c.muted } + const border = { default: c.border, subtle: c.subtle, focus: c.accentInk } + const disabled = state(c.surfaceAlt, c.subtle, c.muted) + const surface = { + rest: state(c.surface, c.subtle, c.ink), + hover: state(c.hover, c.border, c.ink), + active: state(c.active, c.border, c.ink), + disabled, + focusRing: c.accentInk, + } + return { + tone: c.ink, + canvas: c.canvas, + canvascolor: c.canvas, + spotlight: { field: c.canvas, light: `${regorColors.signal}12` }, + overlay: dark ? '#080b06cc' : '#20251c44', + text, + border, + root: { text, border }, + surface, + surfaceAlt: { ...surface, rest: state(c.surfaceAlt, c.subtle, c.ink) }, + button: { + ...surface, + rest: state(c.surfaceAlt, c.border, c.ink), + }, + } +} + +function createAccent(dark: boolean, neutral: Tone): Tone { + const c = dark ? regorColors.dark : regorColors.light + const text = { default: c.accentInk, subtle: c.muted } + const border = { + default: c.accentBorder, + subtle: c.subtle, + focus: c.accentInk, + } + const surface = { + rest: state(c.accentSurface, c.accentBorder, c.ink), + hover: state(dark ? '#303e1c' : '#e6efcc', c.accentInk, c.ink), + active: state(dark ? '#394c20' : '#dcebb9', c.accentInk, c.ink), + disabled: neutral.surface.disabled, + focusRing: c.accentInk, + } + return { + tone: regorColors.signal, + canvas: c.accentSurface, + canvascolor: c.accentSurface, + spotlight: { field: c.accentSurface, light: `${regorColors.signal}20` }, + overlay: neutral.overlay, + text, + border, + root: { text, border }, + surface, + surfaceAlt: surface, + button: { + rest: state(regorColors.signal, regorColors.signal, regorColors.onSignal), + hover: state( + regorColors.signalHover, + regorColors.signalHover, + regorColors.onSignal, + ), + active: state( + regorColors.signalActive, + regorColors.signalActive, + regorColors.onSignal, + ), + disabled: neutral.button.disabled, + focusRing: c.accentInk, + }, + } +} + +function createCompanion(dark: boolean, neutral: Tone): Tone { + const ink = dark ? '#efb1df' : '#8c286f' + const fill = dark ? '#efb1df' : '#a43483' + const field = dark ? '#30212c' : '#f9eef5' + const edge = dark ? '#604050' : '#e3c6d9' + const text = { default: ink, subtle: neutral.text.subtle } + const border = { default: edge, subtle: edge, focus: ink } + const surface = { + rest: state(field, edge, ink), + hover: state(field, ink, ink), + active: state(field, ink, ink), + disabled: neutral.surface.disabled, + focusRing: ink, + } + return { + tone: fill, + canvas: field, + canvascolor: field, + spotlight: { field, light: `${fill}20` }, + overlay: neutral.overlay, + text, + border, + root: { text, border }, + surface, + surfaceAlt: surface, + button: { + rest: state(fill, fill, dark ? '#281722' : '#ffffff'), + hover: state( + dark ? '#f7c5e9' : '#8c286f', + fill, + dark ? '#281722' : '#ffffff', + ), + active: state(fill, fill, dark ? '#281722' : '#ffffff'), + disabled: neutral.button.disabled, + focusRing: ink, + }, + } +} + +function createPalette(dark: boolean): ThemePalette { + const standard = themeSkins.standard.create() + const neutral = createNeutral(dark) + const accent = createAccent(dark, neutral) + const companion = createCompanion(dark, neutral) + const invisible = state('transparent', 'transparent', neutral.text.default) + const ghost = { + ...neutral, + canvas: 'transparent', + canvascolor: 'transparent', + surface: { ...neutral.surface, rest: invisible }, + button: { ...neutral.button, rest: invisible }, + } + return merge(dark ? standard.dark : standard.light, { + accent: regorColors.signal, + font: { + family: { + base: "'Segoe UI', -apple-system, BlinkMacSystemFont, sans-serif", + }, + }, + radii: { sm: '6px', md: '10px', lg: '16px' }, + semanticTone: { + neutral, + accent, + ghost, + secondary: companion, + feature: companion, + }, + effect: { + panelShadow: 'none', + softShadow: dark ? '0 8px 28px #00000022' : '0 8px 28px #28321b08', + floatingShadow: dark ? '0 28px 80px #00000055' : '0 28px 80px #28321b14', + glowPrimary: `0 0 48px ${regorColors.signal}18`, + glowSecondary: `0 0 32px ${companion.tone}12`, + accentShadow: `0 8px 24px ${regorColors.signal}18`, + focusGlow: `0 0 0 3px ${regorColors.signal}44`, + }, + }) +} + +export const regorSkin: ThemeSkin = { + create: () => ({ light: createPalette(false), dark: createPalette(true) }), +} diff --git a/docs-site/design/styles.ts b/docs-site/design/styles.ts new file mode 100644 index 0000000..a62345b --- /dev/null +++ b/docs-site/design/styles.ts @@ -0,0 +1,727 @@ +import { styleBuilder, themes } from '@purestack/ts-style' +import { regorColors } from './skin' +import { registerChartStyles } from './chartStyles' + +const mono = "'Cascadia Code', 'SFMono-Regular', Consolas, monospace" + +export function registerRegorStyles() { + themes.forEach((theme, palette) => { + const root = styleBuilder.get(theme) + registerChartStyles(root, palette) + const t = palette.semanticTone + const ink = t.neutral.text.default + const muted = t.neutral.text.subtle + const edge = t.neutral.border.subtle + const accent = t.accent.text.default + const surface = t.neutral.surface.rest.bgcolor + root.select(':scope').css({ + scrollPaddingTop: '100px', + colorScheme: theme === 'dark' ? 'dark' : 'light', + }) + root + .select('body') + .css({ background: t.neutral.canvas, webkitFontSmoothing: 'antialiased' }) + root.select('.regor-home').css({ + margin: '0', + color: ink, + fontFamily: palette.font.family.base, + fontSize: '16px', + lineHeight: '1.65', + }) + root + .select( + '.regor-home *, .regor-home *::before, .regor-home *::after, .regor-footer *', + ) + .css({ boxSizing: 'border-box' }) + root.select('.regor-home :is(h1,h2,h3,p,pre)').css({ margin: '0' }) + root + .select('.regor-home :is(h1,h2,h3)') + .css({ color: ink, fontWeight: '650' }) + root + .select('.regor-home a:not(.btn), .regor-footer a') + .css({ color: 'inherit', textDecoration: 'none' }) + root + .select( + '.regor-home :is(a,button,summary):focus-visible, .regor-footer a:focus-visible', + ) + .css({ outline: `2px solid ${accent}`, outlineOffset: '5px' }) + root + .select('.regor-home button') + .css({ font: 'inherit', cursor: 'pointer' }) + root.select('.regor-home [hidden]').css({ display: 'none !important' }) + root + .select('.regor-container') + .css({ width: 'min(1160px, calc(100% - 80px))', marginInline: 'auto' }) + root.select('.regor-skip').css({ + position: 'fixed', + top: '12px', + left: '16px', + zIndex: '100', + transform: 'translateY(-200%)', + padding: '10px 18px', + background: surface, + border: `1px solid ${accent}`, + borderRadius: '8px', + }) + root.select('.regor-skip:focus').css({ transform: 'translateY(0)' }) + root.select('.regor-topbar').css({ + borderBottom: `1px solid ${edge}`, + background: `color-mix(in srgb, ${t.neutral.canvas} 92%, transparent)`, + backdropFilter: 'blur(16px)', + }) + root + .select('.regor-topbar .site-logo') + .css({ fontWeight: '750', letterSpacing: '-1px' }) + root.select('.regor-topbar .site-logo__name').css({ lineHeight: '1.4' }) + root.select('.regor-topbar .topbar__actions').css({ gap: '18px' }) + root.select('.regor-topbar :is(.header-guide,.header-api)').css({ + color: muted, + fontSize: '13px', + textDecoration: 'none', + fontWeight: '600', + }) + root + .select('.regor-topbar :is(.header-guide,.header-api):hover') + .css({ color: accent }) + root + .select('.template-doc .doc-content') + .css({ fontSize: '16px', lineHeight: '1.85' }) + root + .select('.template-doc .doc-main') + .css({ paddingTop: '42px', paddingBottom: '60px' }) + root + .select('.template-doc .doc-content > :is(h2,h3)') + .css({ letterSpacing: '-0.5px', marginTop: '40px', lineHeight: '1.3' }) + root.select('.template-doc .doc-content > h2').css({ fontSize: '26px' }) + root.select('.template-doc .doc-content > h3').css({ fontSize: '20px' }) + root.select('.template-doc .doc-content pre').css({ + fontSize: '13px', + lineHeight: '1.8', + padding: '22px', + borderRadius: '10px', + }) + root + .select('.template-doc .doc-sidebar, .template-doc .doc-toc') + .css({ fontSize: '13px' }) + root.select('.regor-doc-heading').css({ + paddingBottom: '28px', + marginBottom: '28px', + borderBottom: `1px solid ${edge}`, + }) + root.select('.regor-breadcrumb').css({ + display: 'flex', + alignItems: 'center', + gap: '10px', + color: muted, + font: `11px/1.5 ${mono}`, + marginBottom: '20px', + }) + root + .select('.regor-breadcrumb a') + .css({ color: muted, textDecoration: 'none' }) + root.select('.regor-breadcrumb a:hover').css({ color: accent }) + root.select('.regor-doc-heading h1').css({ + fontSize: 'clamp(32px, 4vw, 44px)', + fontWeight: '700', + letterSpacing: '-1.5px', + lineHeight: '1.15', + margin: '0', + }) + root + .select('.regor-doc-heading > p') + .css({ color: muted, marginTop: '16px', fontSize: '17px' }) + root.select('.regor-home .topbar__toggle').css({ display: 'none' }) + root.select('.regor-hero').css({ + position: 'relative', + isolation: 'isolate', + paddingBlock: '100px 76px', + }) + root.select('.regor-hero::before').css({ + content: '""', + position: 'absolute', + zIndex: '-1', + inset: '0', + background: `radial-gradient(ellipse at 84% 40%, ${t.accent.tone}22, transparent 54%)`, + pointerEvents: 'none', + }) + root.select('.hero-layout').css({ + display: 'grid', + gridTemplateColumns: '1fr 1.03fr', + gap: '64px', + alignItems: 'center', + }) + root.select('.eyebrow').css({ + display: 'inline-flex', + alignItems: 'center', + gap: '10px', + color: accent, + font: `600 11px/1.5 ${mono}`, + letterSpacing: '1.5px', + textTransform: 'uppercase', + }) + root.select('.release-dot').css({ + width: '7px', + height: '7px', + borderRadius: '50%', + background: accent, + boxShadow: `0 0 0 4px ${t.accent.tone}14`, + }) + root.select('.regor-hero h1').css({ + marginTop: '24px', + fontSize: 'clamp(54px, 6vw, 80px)', + letterSpacing: '-4px', + lineHeight: '1.02', + fontWeight: '700', + }) + root.select('.regor-hero h1 span').css({ + color: theme === 'light' ? regorColors.onSignal : regorColors.signal, + background: + theme === 'light' + ? `linear-gradient(transparent 12%, ${regorColors.signal} 12%, ${regorColors.signal} 96%, transparent 96%)` + : 'none', + }) + root.select('.hero-copy').css({ + marginTop: '28px !important', + color: muted, + fontSize: '18px', + maxWidth: '450px', + lineHeight: '1.75', + }) + root + .select('.hero-actions') + .css({ gap: '12px', marginTop: '30px', flexWrap: 'wrap' }) + root + .select('.regor-home .hero-actions .btn, .regor-home .closing .btn') + .css({ + minHeight: '48px', + padding: '12px 20px', + fontSize: '14px', + fontWeight: '650', + borderRadius: '8px', + }) + root.select('.install-line').css({ + display: 'inline-flex', + alignItems: 'center', + gap: '24px', + marginTop: '25px', + padding: '9px 12px 9px 16px', + background: surface, + border: `1px solid ${edge}`, + borderRadius: '8px', + color: muted, + }) + root + .select('.install-line code') + .css({ font: `12px/1.5 ${mono}`, color: ink }) + root + .select('.install-line code > span:first-child') + .css({ color: accent, marginRight: '10px' }) + root.select('.install-copy').css({ + border: '0', + background: 'transparent', + color: muted, + fontSize: '11px !important', + padding: '5px', + borderRadius: '4px', + }) + root.select('.install-copy:hover').css({ color: accent }) + root.select('.hero-footnote').css({ + marginTop: '16px !important', + font: `10px/1.5 ${mono}`, + color: muted, + }) + root.select('.workbench').css({ + minWidth: '0', + background: surface, + border: `1px solid ${edge}`, + borderRadius: '16px', + overflow: 'hidden', + boxShadow: palette.effect.floatingShadow, + transform: 'rotate(1deg)', + }) + root.select('.workbench-bar').css({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: '12px', + padding: '16px 20px', + borderBottom: `1px solid ${edge}`, + font: `10px/1.4 ${mono}`, + color: muted, + }) + root.select('.window-dots').css({ display: 'flex', gap: '5px' }) + root.select('.window-dots i').css({ + width: '7px', + height: '7px', + borderRadius: '50%', + background: t.neutral.border.default, + }) + root.select('.window-dots i:first-child').css({ background: t.accent.tone }) + root + .select('.workbench .code-block') + .css({ margin: '0', border: '0', borderRadius: '0', boxShadow: 'none' }) + root.select('.workbench pre').css({ + padding: '24px', + fontSize: '12px', + lineHeight: '1.85', + borderRadius: '0', + minHeight: '235px', + overflowX: 'auto', + }) + root.select('.workbench .tabs__content').css({ padding: '0' }) + root.select('.live-preview').css({ + padding: '26px', + borderTop: `1px solid ${edge}`, + background: t.neutral.surfaceAlt.rest.bgcolor, + }) + root.select('.preview-label').css({ + display: 'flex', + alignItems: 'center', + gap: '8px', + color: muted, + font: `10px/1.5 ${mono}`, + letterSpacing: '1px', + textTransform: 'uppercase', + }) + root.select('.preview-label .release-dot').css({ + background: t.secondary.text.default, + boxShadow: 'none', + width: '5px', + height: '5px', + }) + root.select('.counter-row').css({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: '16px', + marginTop: '18px', + }) + root + .select('.counter-readout') + .css({ display: 'flex', alignItems: 'baseline', gap: '12px' }) + root.select('.counter-value').css({ + fontSize: '52px', + fontWeight: '600', + lineHeight: '1', + letterSpacing: '-3px', + color: accent, + fontVariantNumeric: 'tabular-nums', + }) + root.select('.counter-caption').css({ fontSize: '12px', color: muted }) + root + .select('.counter-buttons') + .css({ display: 'flex', alignItems: 'center', gap: '8px' }) + root.select('.counter-increment').css({ + background: t.accent.button.rest.bgcolor, + color: t.accent.button.rest.text, + border: `1px solid ${t.accent.button.rest.border}`, + borderRadius: '8px', + padding: '10px 16px', + fontSize: '13px !important', + fontWeight: '650 !important', + }) + root + .select('.counter-increment:hover') + .css({ background: t.accent.button.hover.bgcolor }) + root.select('.counter-reset').css({ + border: `1px solid ${edge}`, + background: surface, + color: ink, + padding: '10px 12px', + borderRadius: '8px', + fontSize: '12px !important', + }) + root.select('.workbench-caption').css({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + padding: '11px 20px', + borderTop: `1px solid ${edge}`, + font: `10px/1.5 ${mono}`, + color: muted, + }) + root.select('.proof-strip').css({ + display: 'grid', + gridTemplateColumns: 'repeat(3,1fr)', + paddingBlock: '28px', + borderBlock: `1px solid ${edge}`, + gap: '24px', + }) + root + .select('.proof-strip > div') + .css({ display: 'flex', alignItems: 'center', gap: '14px' }) + root + .select('.proof-strip .icon') + .css({ color: accent, width: '22px', height: '22px' }) + root + .select('.proof-strip strong') + .css({ display: 'block', fontSize: '13px', fontWeight: '650' }) + root.select('.proof-strip small').css({ + display: 'block', + color: muted, + fontSize: '11px', + marginTop: '2px', + }) + root.select('.regor-section').css({ paddingBlock: '96px' }) + root.select('.section-heading').css({ + display: 'flex', + alignItems: 'end', + justifyContent: 'space-between', + gap: '32px', + marginBottom: '36px', + }) + root.select('.regor-home h2').css({ + marginTop: '16px', + fontSize: 'clamp(32px, 3.6vw, 46px)', + letterSpacing: '-1.8px', + lineHeight: '1.13', + }) + root + .select('.section-heading > p') + .css({ maxWidth: '310px', color: muted, fontSize: '14px' }) + root.select('.feature-grid').css({ + display: 'grid', + gridTemplateColumns: 'repeat(3,minmax(0,1fr))', + border: `1px solid ${edge}`, + borderRadius: '14px', + overflow: 'hidden', + background: surface, + }) + root.select('.regor-feature').css({ padding: '30px', minWidth: '0' }) + root + .select('.regor-feature + .regor-feature') + .css({ borderLeft: `1px solid ${edge}` }) + root + .select('.feature-meta') + .css({ color: accent, font: `11px/1.5 ${mono}`, marginBottom: '36px' }) + root.select('.feature-meta .icon').css({ width: '25px', height: '25px' }) + root + .select('.regor-feature h3') + .css({ fontSize: '20px', letterSpacing: '-0.5px', lineHeight: '1.3' }) + root.select('.regor-feature p').css({ + marginTop: '14px', + fontSize: '14px', + color: muted, + lineHeight: '1.8', + }) + root.select('.feature-link').css({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: '6px', + marginTop: '24px', + color: `${accent} !important`, + fontSize: '12px', + fontWeight: '600', + }) + root.select('.feature-link span').css({ + position: 'absolute', + width: '1px', + height: '1px', + overflow: 'hidden', + clipPath: 'inset(50%)', + }) + root.select('.feature-link:hover').css({ + textDecoration: 'underline !important', + textUnderlineOffset: '4px', + }) + root.select('.ecosystem').css({ + position: 'relative', + background: t.neutral.surfaceAlt.rest.bgcolor, + borderBlock: `1px solid ${edge}`, + overflow: 'hidden', + }) + root.select('.ecosystem-layout').css({ + display: 'grid', + gridTemplateColumns: '1fr 1fr', + gap: '80px', + alignItems: 'center', + }) + root.select('.ecosystem-copy > p').css({ + marginTop: '22px', + color: muted, + fontSize: '15px', + maxWidth: '420px', + }) + root + .select('.ecosystem-copy > p strong') + .css({ color: ink, fontWeight: '650' }) + root.select('.ecosystem-links').css({ + display: 'flex', + alignItems: 'center', + flexWrap: 'wrap', + gap: '24px', + marginTop: '24px', + fontSize: '13px', + }) + root.select('.ecosystem-links a').css({ + color: `${accent} !important`, + display: 'inline-flex', + alignItems: 'center', + gap: '8px', + fontWeight: '600', + }) + root + .select('.cycle-diagram') + .css({ position: 'relative', padding: '30px 0', textAlign: 'center' }) + root.select('.cycle-nodes').css({ + display: 'grid', + gridTemplateColumns: '1fr 1fr', + gap: '48px', + position: 'relative', + zIndex: '1', + }) + root.select('.cycle-node').css({ + display: 'flex', + alignItems: 'center', + flexDirection: 'column', + gap: '8px', + padding: '28px 12px', + border: `1px solid ${edge}`, + borderRadius: '16px', + background: surface, + boxShadow: palette.effect.softShadow, + }) + root + .select('.cycle-mark') + .css({ font: `600 32px/1 ${mono}`, color: accent }) + root + .select('.cycle-node:last-child .cycle-mark') + .css({ color: t.secondary.text.default }) + root.select('.cycle-mark .icon').css({ width: '36px', height: '36px' }) + root + .select('.cycle-node strong') + .css({ marginTop: '12px', fontSize: '22px', letterSpacing: '-0.7px' }) + root.select('.cycle-node small').css({ color: muted, fontSize: '11px' }) + root.select('.cycle-path').css({ + position: 'absolute', + top: '-2px', + left: '10%', + width: '80%', + height: 'calc(100% + 4px)', + border: `1px solid ${t.accent.border.default}`, + borderRadius: '70px', + pointerEvents: 'none', + }) + root.select('.cycle-label').css({ + position: 'absolute', + zIndex: '2', + left: '50%', + transform: 'translateX(-50%)', + padding: '3px 12px', + color: accent, + background: t.neutral.surfaceAlt.rest.bgcolor, + font: `10px/1.5 ${mono}`, + whiteSpace: 'nowrap', + }) + root.select('.cycle-label:first-child').css({ top: '-12px' }) + root + .select('.cycle-label:last-child') + .css({ bottom: '-12px', color: t.secondary.text.default }) + root.select('.cycle-note').css({ + marginTop: '32px !important', + color: muted, + font: `10px/1.5 ${mono}`, + }) + root + .select('.resource-grid') + .css({ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '14px' }) + root.select('.regor-resource').css({ + display: 'flex', + alignItems: 'center', + gap: '22px', + padding: '25px', + border: `1px solid ${edge}`, + borderRadius: '10px', + background: surface, + transition: 'border-color 160ms, transform 160ms', + }) + root.select('.regor-resource:hover').css({ + borderColor: t.accent.border.default, + transform: 'translateY(-2px)', + }) + root.select('.resource-number').css({ + color: accent, + font: `11px/1.5 ${mono}`, + alignSelf: 'start', + paddingTop: '3px', + }) + root.select('.regor-resource > div').css({ flex: '1', minWidth: '0' }) + root + .select('.regor-resource h3') + .css({ fontSize: '17px', letterSpacing: '-0.3px' }) + root.select('.regor-resource p').css({ + color: muted, + fontSize: '12px', + marginTop: '5px', + lineHeight: '1.6', + }) + root + .select('.regor-resource > .icon') + .css({ color: muted, flexShrink: '0', width: '18px', height: '18px' }) + root.select('.closing').css({ + textAlign: 'center', + padding: '56px 24px', + marginBottom: '76px', + borderRadius: '16px', + border: `1px solid ${regorColors.signal}`, + background: regorColors.signal, + }) + root.select('.closing h2').css({ margin: '0', color: regorColors.onSignal }) + root + .select('.closing p') + .css({ color: '#3c4c20', marginBlock: '18px 26px' }) + root.select('.regor-home .closing .btn').css({ + background: regorColors.onSignal, + borderColor: regorColors.onSignal, + color: regorColors.signal, + }) + root + .select('.regor-home .closing .btn:hover') + .css({ background: '#2d3c16' }) + root.select('.regor-footer').css({ + borderTop: `1px solid ${edge}`, + paddingBlock: '40px 24px', + color: muted, + fontSize: '12px', + }) + root.select('.footer-inner, .footer-colophon').css({ + display: 'flex', + justifyContent: 'space-between', + gap: '24px', + alignItems: 'center', + }) + root.select('.footer-brand').css({ + display: 'inline-flex', + alignItems: 'center', + gap: '10px', + fontSize: '25px', + color: `${ink} !important`, + fontWeight: '750', + letterSpacing: '-1px', + }) + root + .select('.footer-brand > .icon, .footer-wordmark > span') + .css({ color: accent }) + root.select('.footer-brand .icon').css({ width: '26px', height: '26px' }) + root.select('.footer-inner p').css({ margin: '6px 0 0', fontSize: '12px' }) + root + .select('.footer-inner nav') + .css({ display: 'flex', gap: '16px', flexWrap: 'wrap' }) + root.select('.footer-colophon').css({ + borderTop: `1px solid ${edge}`, + paddingTop: '20px', + marginTop: '30px', + fontSize: '10px', + }) + root.select('.regor-footer .footer-actions').css({ gap: '16px' }) + root.select('.footer-actions .consent-settings-teleport-area').css({ + display: 'inline-flex', + alignItems: 'center', + }) + root.select('.regor-footer .footer-colophon [data-consent-settings]').css({ + font: 'inherit', + color: 'inherit', + background: 'transparent !important', + border: 'none !important', + outline: 'none !important', + borderRadius: '0', + padding: '0 !important', + margin: '0', + minHeight: '0', + boxShadow: 'none !important', + }) + root + .select('.regor-footer .footer-colophon [data-consent-settings]:hover') + .css({ color: accent }) + root + .select( + '.regor-footer .footer-colophon [data-consent-settings]:focus-visible', + ) + .css({ + color: accent, + textDecoration: 'underline', + textUnderlineOffset: '3px', + }) + root.select('.regor-footer a:hover').css({ color: accent }) + root + .select('.copy-status') + .css({ minHeight: '18px', fontSize: '11px', color: muted }) + root.media('max-width: 1000px').select('.hero-layout').css({ gap: '36px' }) + root + .media('max-width: 1000px') + .select('.regor-hero h1') + .css({ fontSize: '62px', letterSpacing: '-3px' }) + root + .media('max-width: 1000px') + .select('.ecosystem-layout') + .css({ gap: '40px' }) + root + .media('max-width: 1000px') + .select('.regor-feature') + .css({ padding: '24px' }) + const mobile = root.media('max-width: 760px') + mobile.select('.regor-container').css({ width: 'calc(100% - 40px)' }) + mobile.select('.regor-hero').css({ paddingBlock: '54px 48px' }) + mobile + .select('.hero-layout, .ecosystem-layout') + .css({ gridTemplateColumns: 'minmax(0, 1fr)', gap: '44px' }) + mobile + .select('.regor-hero h1') + .css({ fontSize: 'clamp(48px, 10vw, 68px)', letterSpacing: '-2.8px' }) + mobile.select('.hero-copy').css({ fontSize: '16px', maxWidth: '480px' }) + mobile.select('.workbench').css({ transform: 'none' }) + mobile + .select('.proof-strip') + .css({ gridTemplateColumns: '1fr', gap: '20px', paddingBlock: '24px' }) + mobile.select('.regor-section').css({ paddingBlock: '58px' }) + mobile.select('.section-heading').css({ display: 'block' }) + mobile + .select('.section-heading > p') + .css({ marginTop: '20px', maxWidth: '420px' }) + mobile + .select('.feature-grid, .resource-grid') + .css({ gridTemplateColumns: '1fr' }) + mobile + .select('.regor-feature + .regor-feature') + .css({ borderLeft: '0', borderTop: `1px solid ${edge}` }) + mobile.select('.feature-meta').css({ marginBottom: '22px' }) + mobile.select('.cycle-diagram').css({ + marginBlock: '15px 0', + maxWidth: '500px', + width: '100%', + marginInline: 'auto', + }) + mobile + .select('.closing') + .css({ padding: '40px 20px', marginBottom: '48px' }) + mobile + .select('.footer-inner') + .css({ alignItems: 'start', flexDirection: 'column' }) + mobile.select('.regor-topbar .header-guide').css({ display: 'none' }) + mobile.select('.regor-topbar .topbar__actions').css({ gap: '12px' }) + mobile.select('.template-doc .doc-main').css({ paddingTop: '24px' }) + mobile.select('.template-doc .doc-content').css({ fontSize: '15px' }) + root + .media('max-width: 380px') + .select('.regor-topbar .header-api') + .css({ display: 'none' }) + root + .media('max-width: 380px') + .select('.regor-hero h1') + .css({ fontSize: '40px' }) + root.media('max-width: 380px').select('.counter-row').css({ gap: '10px' }) + root + .media('max-width: 380px') + .select('.live-preview') + .css({ padding: '20px' }) + root + .media('prefers-reduced-motion: reduce') + .select('.regor-home *, .regor-home *::before, .regor-home *::after') + .css({ + transition: 'none !important', + animation: 'none !important', + scrollBehavior: 'auto !important', + }) + }) +} diff --git a/docs-site/package.json b/docs-site/package.json index 346f578..13718da 100644 --- a/docs-site/package.json +++ b/docs-site/package.json @@ -8,7 +8,15 @@ "release": "purestack publish --content ./content" }, "dependencies": { - "purestack": "1.1.7" + "@purestack/ts-css": "1.1.7", + "@purestack/ts-html": "1.1.7", + "@purestack/ts-style": "1.1.7", + "@purestack/ts-util": "1.1.7", + "purestack": "1.1.7", + "regor": "1.7.3" + }, + "devDependencies": { + "@types/node": "^22.0.0" }, "packageManager": "yarn@4.9.2" } diff --git a/docs-site/tsconfig.json b/docs-site/tsconfig.json new file mode 100644 index 0000000..6d1bc5f --- /dev/null +++ b/docs-site/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["node"], + "strict": true, + "noEmit": true, + "skipLibCheck": true + }, + "include": ["design/**/*.ts", "content/**/*.ts"] +} diff --git a/docs-site/yarn.lock b/docs-site/yarn.lock index bd2d6fb..32d200b 100644 --- a/docs-site/yarn.lock +++ b/docs-site/yarn.lock @@ -338,7 +338,7 @@ __metadata: languageName: node linkType: hard -"@purestack/ts-css@npm:^1.1.7": +"@purestack/ts-css@npm:1.1.7, @purestack/ts-css@npm:^1.1.7": version: 1.1.7 resolution: "@purestack/ts-css@npm:1.1.7" dependencies: @@ -348,7 +348,7 @@ __metadata: languageName: node linkType: hard -"@purestack/ts-html@npm:^1.1.7": +"@purestack/ts-html@npm:1.1.7, @purestack/ts-html@npm:^1.1.7": version: 1.1.7 resolution: "@purestack/ts-html@npm:1.1.7" dependencies: @@ -424,7 +424,7 @@ __metadata: languageName: node linkType: hard -"@purestack/ts-style@npm:^1.1.7": +"@purestack/ts-style@npm:1.1.7, @purestack/ts-style@npm:^1.1.7": version: 1.1.7 resolution: "@purestack/ts-style@npm:1.1.7" dependencies: @@ -448,7 +448,7 @@ __metadata: languageName: node linkType: hard -"@purestack/ts-util@npm:^1.1.7": +"@purestack/ts-util@npm:1.1.7, @purestack/ts-util@npm:^1.1.7": version: 1.1.7 resolution: "@purestack/ts-util@npm:1.1.7" checksum: 10c0/2a24f9f359af259850519b63337fc332e89ac575b09f30ff6fa85e7375922928c9a02b8a38d811116088d9a7fddedcf72823910cc635fd5a69f4adff54595b45 @@ -557,6 +557,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.0.0": + version: 22.20.5 + resolution: "@types/node@npm:22.20.5" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/0cf61a89c6a69917ab49f976a6bb11a29e3b348a6ae19f5827ceb91d3ade781faab58dcf3b8fa625f975f5d7536b9166ff94e8250c29272c667164f77c28fa88 + languageName: node + linkType: hard + "@types/relateurl@npm:^0.2.33": version: 0.2.33 resolution: "@types/relateurl@npm:0.2.33" @@ -1913,11 +1922,17 @@ __metadata: version: 0.0.0-use.local resolution: "regor-doc-site@workspace:." dependencies: + "@purestack/ts-css": "npm:1.1.7" + "@purestack/ts-html": "npm:1.1.7" + "@purestack/ts-style": "npm:1.1.7" + "@purestack/ts-util": "npm:1.1.7" + "@types/node": "npm:^22.0.0" purestack: "npm:1.1.7" + regor: "npm:1.7.3" languageName: unknown linkType: soft -"regor@npm:^1.7.3": +"regor@npm:1.7.3, regor@npm:^1.7.3": version: 1.7.3 resolution: "regor@npm:1.7.3" checksum: 10c0/c6079f93905f042df5682b42a293ea1c6442c59e0b50819b0f6bb9727c40cb9411b3d755809a06ac5592cf37c1b3049d4fb883a73de3acf23d9cd848d645cc76 @@ -2119,6 +2134,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + "unified@npm:^11.0.0, unified@npm:^11.0.5": version: 11.0.5 resolution: "unified@npm:11.0.5" From 120a1b629f5af306e02c9ad6f290edfc697080ec Mon Sep 17 00:00:00 2001 From: Ahmed Yasin Koculu Date: Thu, 8 Oct 2026 06:30:42 +0200 Subject: [PATCH 3/6] Improve guides and api references. --- docs-site/README.md | 52 ++- docs-site/content/api/_nav.json | 3 + docs-site/content/api/addUnbinder.md | 59 ---- docs-site/content/api/addUnbinder.mdx | 82 +++++ docs-site/content/api/batch.md | 54 ---- docs-site/content/api/batch.mdx | 77 +++++ docs-site/content/api/collectRefs.md | 75 ----- docs-site/content/api/collectRefs.mdx | 98 ++++++ docs-site/content/api/computeMany.md | 83 ----- docs-site/content/api/computeMany.mdx | 106 ++++++ docs-site/content/api/computeRef.md | 74 ----- docs-site/content/api/computeRef.mdx | 97 ++++++ docs-site/content/api/computed.md | 74 ----- docs-site/content/api/computed.mdx | 97 ++++++ ...contextRegistry.md => contextRegistry.mdx} | 31 +- .../api/{createApp.md => createApp.mdx} | 35 +- docs-site/content/api/cref.md | 59 ---- docs-site/content/api/cref.mdx | 82 +++++ ...defineComponent.md => defineComponent.mdx} | 31 +- docs-site/content/api/demos/batching.ts | 64 ++++ docs-site/content/api/demos/browser.ts | 14 + docs-site/content/api/demos/cleanup.ts | 114 +++++++ docs-site/content/api/demos/configuration.ts | 35 ++ docs-site/content/api/demos/derived.ts | 50 +++ docs-site/content/api/demos/effects.ts | 63 ++++ docs-site/content/api/demos/entanglement.ts | 50 +++ docs-site/content/api/demos/examples.ts | 44 +++ docs-site/content/api/demos/notifications.ts | 67 ++++ docs-site/content/api/demos/observation.ts | 68 ++++ .../content/api/demos/persistence-example.ts | 8 + docs-site/content/api/demos/raw-state.ts | 53 +++ docs-site/content/api/demos/registry.ts | 49 +++ docs-site/content/api/demos/state.ts | 81 +++++ docs-site/content/api/demos/templates.ts | 69 ++++ docs-site/content/api/demos/validation.ts | 53 +++ .../content/api/demos/warnings-example.ts | 10 + docs-site/content/api/drainUnbind.md | 48 --- docs-site/content/api/drainUnbind.mdx | 71 ++++ docs-site/content/api/endBatch.md | 51 --- docs-site/content/api/endBatch.mdx | 74 +++++ docs-site/content/api/entangle.md | 82 ----- docs-site/content/api/entangle.mdx | 105 ++++++ docs-site/content/api/flatten.md | 79 ----- docs-site/content/api/flatten.mdx | 102 ++++++ .../api/{getBindData.md => getBindData.mdx} | 29 +- docs-site/content/api/html.md | 60 ---- docs-site/content/api/html.mdx | 83 +++++ docs-site/content/api/index.md | 88 ----- docs-site/content/api/index.mdx | 124 +++++++ docs-site/content/api/isDeepRef.md | 63 ---- docs-site/content/api/isDeepRef.mdx | 86 +++++ docs-site/content/api/isRaw.md | 72 ----- docs-site/content/api/isRaw.mdx | 95 ++++++ docs-site/content/api/isRef.md | 63 ---- docs-site/content/api/isRef.mdx | 86 +++++ docs-site/content/api/markRaw.md | 69 ---- docs-site/content/api/markRaw.mdx | 92 ++++++ docs-site/content/api/observe.md | 71 ---- docs-site/content/api/observe.mdx | 94 ++++++ docs-site/content/api/observeMany.md | 71 ---- docs-site/content/api/observeMany.mdx | 94 ++++++ docs-site/content/api/observerCount.md | 66 ---- docs-site/content/api/observerCount.mdx | 89 ++++++ docs-site/content/api/onMounted.md | 57 ---- docs-site/content/api/onMounted.mdx | 81 +++++ docs-site/content/api/onUnmounted.md | 57 ---- docs-site/content/api/onUnmounted.mdx | 81 +++++ docs-site/content/api/pause.md | 61 ---- docs-site/content/api/pause.mdx | 84 +++++ .../content/api/{persist.md => persist.mdx} | 21 +- docs-site/content/api/{pval.md => pval.mdx} | 19 ++ docs-site/content/api/{raw.md => raw.mdx} | 27 +- docs-site/content/api/{ref.md => ref.mdx} | 47 ++- .../api/{regorConfig.md => regorConfig.mdx} | 33 +- docs-site/content/api/removeNode.md | 48 --- docs-site/content/api/removeNode.mdx | 71 ++++ docs-site/content/api/resume.md | 58 ---- docs-site/content/api/resume.mdx | 81 +++++ docs-site/content/api/silence.md | 81 ----- docs-site/content/api/silence.mdx | 104 ++++++ docs-site/content/api/sref.md | 98 ------ docs-site/content/api/sref.mdx | 121 +++++++ docs-site/content/api/startBatch.md | 51 --- docs-site/content/api/startBatch.mdx | 74 +++++ docs-site/content/api/svg.md | 38 --- docs-site/content/api/svg.mdx | 61 ++++ .../api/{toFragment.md => toFragment.mdx} | 35 +- .../{toJsonTemplate.md => toJsonTemplate.mdx} | 31 +- docs-site/content/api/trigger.md | 78 ----- docs-site/content/api/trigger.mdx | 101 ++++++ docs-site/content/api/unbind.md | 50 --- docs-site/content/api/unbind.mdx | 73 +++++ docs-site/content/api/unref.md | 63 ---- docs-site/content/api/unref.mdx | 86 +++++ .../content/api/{useScope.md => useScope.mdx} | 32 +- .../{warningHandler.md => warningHandler.mdx} | 9 + docs-site/content/api/watchEffect.md | 70 ---- docs-site/content/api/watchEffect.mdx | 93 ++++++ .../directives/{class.md => class.mdx} | 24 ++ docs-site/content/directives/context.md | 54 ---- docs-site/content/directives/context.mdx | 78 +++++ docs-site/content/directives/demos/bind.ts | 57 ++++ docs-site/content/directives/demos/browser.ts | 12 + docs-site/content/directives/demos/class.ts | 37 +++ docs-site/content/directives/demos/context.ts | 45 +++ .../content/directives/demos/examples.ts | 33 ++ docs-site/content/directives/demos/for.ts | 49 +++ docs-site/content/directives/demos/html.ts | 31 ++ docs-site/content/directives/demos/if.ts | 37 +++ docs-site/content/directives/demos/is.ts | 42 +++ docs-site/content/directives/demos/model.ts | 78 +++++ docs-site/content/directives/demos/on.ts | 35 ++ docs-site/content/directives/demos/pre.ts | 32 ++ docs-site/content/directives/demos/ref.ts | 35 ++ docs-site/content/directives/demos/show.ts | 26 ++ docs-site/content/directives/demos/style.ts | 40 +++ .../content/directives/demos/teleport.ts | 47 +++ docs-site/content/directives/demos/text.ts | 30 ++ docs-site/content/directives/index.md | 55 ---- docs-site/content/directives/index.mdx | 80 +++++ .../content/directives/{is.md => is.mdx} | 26 +- .../directives/{r-bind.md => r-bind.mdx} | 24 ++ .../directives/{r-for.md => r-for.mdx} | 24 ++ .../directives/{r-html.md => r-html.mdx} | 24 ++ .../content/directives/{r-if.md => r-if.mdx} | 24 ++ .../directives/{r-model.md => r-model.mdx} | 30 +- .../content/directives/{r-on.md => r-on.mdx} | 26 +- .../directives/{r-pre.md => r-pre.mdx} | 24 ++ .../directives/{r-show.md => r-show.mdx} | 24 ++ docs-site/content/directives/r-teleport.md | 50 --- docs-site/content/directives/r-teleport.mdx | 74 +++++ docs-site/content/directives/r-text.md | 58 ---- docs-site/content/directives/r-text.mdx | 82 +++++ .../content/directives/{ref.md => ref.mdx} | 24 ++ .../directives/{style.md => style.mdx} | 24 ++ .../content/examples/first-app/counter.ts | 36 +++ docs-site/content/examples/first-app/mount.ts | 14 + docs-site/content/getting-started.md | 168 ---------- docs-site/content/getting-started.mdx | 212 ++++++++++++ .../guide/{components.md => components.mdx} | 22 ++ docs-site/content/guide/demos/browser.ts | 24 ++ docs-site/content/guide/demos/lifecycle.ts | 61 ++++ docs-site/content/guide/demos/profile.ts | 95 ++++++ docs-site/content/guide/demos/quote.ts | 78 +++++ docs-site/content/guide/demos/services.ts | 86 +++++ docs-site/content/guide/index.md | 36 --- docs-site/content/guide/index.mdx | 72 +++++ ...d-cleanup.md => lifecycle-and-cleanup.mdx} | 22 ++ .../guide/{mounting.md => mounting.mdx} | 8 + .../guide/{performance.md => performance.mdx} | 8 + ...persisted-state.md => persisted-state.mdx} | 8 + .../guide/{reactivity.md => reactivity.mdx} | 22 ++ .../guide/{templates.md => templates.mdx} | 22 ++ ...troubleshooting.md => troubleshooting.mdx} | 8 + .../guide/{typescript.md => typescript.mdx} | 8 + docs-site/content/overview.md | 101 ------ docs-site/content/overview.mdx | 128 ++++++++ docs-site/content/siteConfig.json | 2 +- docs-site/design/apiComponents.ts | 13 + docs-site/design/apiStyles.ts | 42 +++ docs-site/design/components.ts | 6 + docs-site/design/directiveComponents.ts | 13 + docs-site/design/directiveStyles.ts | 117 +++++++ docs-site/design/guideComponents.ts | 35 ++ docs-site/design/guideStyles.ts | 302 ++++++++++++++++++ docs-site/design/styles.ts | 6 + docs-site/package.json | 2 +- 167 files changed, 6961 insertions(+), 2754 deletions(-) create mode 100644 docs-site/content/api/_nav.json delete mode 100644 docs-site/content/api/addUnbinder.md create mode 100644 docs-site/content/api/addUnbinder.mdx delete mode 100644 docs-site/content/api/batch.md create mode 100644 docs-site/content/api/batch.mdx delete mode 100644 docs-site/content/api/collectRefs.md create mode 100644 docs-site/content/api/collectRefs.mdx delete mode 100644 docs-site/content/api/computeMany.md create mode 100644 docs-site/content/api/computeMany.mdx delete mode 100644 docs-site/content/api/computeRef.md create mode 100644 docs-site/content/api/computeRef.mdx delete mode 100644 docs-site/content/api/computed.md create mode 100644 docs-site/content/api/computed.mdx rename docs-site/content/api/{contextRegistry.md => contextRegistry.mdx} (63%) rename docs-site/content/api/{createApp.md => createApp.mdx} (62%) delete mode 100644 docs-site/content/api/cref.md create mode 100644 docs-site/content/api/cref.mdx rename docs-site/content/api/{defineComponent.md => defineComponent.mdx} (78%) create mode 100644 docs-site/content/api/demos/batching.ts create mode 100644 docs-site/content/api/demos/browser.ts create mode 100644 docs-site/content/api/demos/cleanup.ts create mode 100644 docs-site/content/api/demos/configuration.ts create mode 100644 docs-site/content/api/demos/derived.ts create mode 100644 docs-site/content/api/demos/effects.ts create mode 100644 docs-site/content/api/demos/entanglement.ts create mode 100644 docs-site/content/api/demos/examples.ts create mode 100644 docs-site/content/api/demos/notifications.ts create mode 100644 docs-site/content/api/demos/observation.ts create mode 100644 docs-site/content/api/demos/persistence-example.ts create mode 100644 docs-site/content/api/demos/raw-state.ts create mode 100644 docs-site/content/api/demos/registry.ts create mode 100644 docs-site/content/api/demos/state.ts create mode 100644 docs-site/content/api/demos/templates.ts create mode 100644 docs-site/content/api/demos/validation.ts create mode 100644 docs-site/content/api/demos/warnings-example.ts delete mode 100644 docs-site/content/api/drainUnbind.md create mode 100644 docs-site/content/api/drainUnbind.mdx delete mode 100644 docs-site/content/api/endBatch.md create mode 100644 docs-site/content/api/endBatch.mdx delete mode 100644 docs-site/content/api/entangle.md create mode 100644 docs-site/content/api/entangle.mdx delete mode 100644 docs-site/content/api/flatten.md create mode 100644 docs-site/content/api/flatten.mdx rename docs-site/content/api/{getBindData.md => getBindData.mdx} (50%) delete mode 100644 docs-site/content/api/html.md create mode 100644 docs-site/content/api/html.mdx delete mode 100644 docs-site/content/api/index.md create mode 100644 docs-site/content/api/index.mdx delete mode 100644 docs-site/content/api/isDeepRef.md create mode 100644 docs-site/content/api/isDeepRef.mdx delete mode 100644 docs-site/content/api/isRaw.md create mode 100644 docs-site/content/api/isRaw.mdx delete mode 100644 docs-site/content/api/isRef.md create mode 100644 docs-site/content/api/isRef.mdx delete mode 100644 docs-site/content/api/markRaw.md create mode 100644 docs-site/content/api/markRaw.mdx delete mode 100644 docs-site/content/api/observe.md create mode 100644 docs-site/content/api/observe.mdx delete mode 100644 docs-site/content/api/observeMany.md create mode 100644 docs-site/content/api/observeMany.mdx delete mode 100644 docs-site/content/api/observerCount.md create mode 100644 docs-site/content/api/observerCount.mdx delete mode 100644 docs-site/content/api/onMounted.md create mode 100644 docs-site/content/api/onMounted.mdx delete mode 100644 docs-site/content/api/onUnmounted.md create mode 100644 docs-site/content/api/onUnmounted.mdx delete mode 100644 docs-site/content/api/pause.md create mode 100644 docs-site/content/api/pause.mdx rename docs-site/content/api/{persist.md => persist.mdx} (57%) rename docs-site/content/api/{pval.md => pval.mdx} (76%) rename docs-site/content/api/{raw.md => raw.mdx} (50%) rename docs-site/content/api/{ref.md => ref.mdx} (54%) rename docs-site/content/api/{regorConfig.md => regorConfig.mdx} (69%) delete mode 100644 docs-site/content/api/removeNode.md create mode 100644 docs-site/content/api/removeNode.mdx delete mode 100644 docs-site/content/api/resume.md create mode 100644 docs-site/content/api/resume.mdx delete mode 100644 docs-site/content/api/silence.md create mode 100644 docs-site/content/api/silence.mdx delete mode 100644 docs-site/content/api/sref.md create mode 100644 docs-site/content/api/sref.mdx delete mode 100644 docs-site/content/api/startBatch.md create mode 100644 docs-site/content/api/startBatch.mdx delete mode 100644 docs-site/content/api/svg.md create mode 100644 docs-site/content/api/svg.mdx rename docs-site/content/api/{toFragment.md => toFragment.mdx} (50%) rename docs-site/content/api/{toJsonTemplate.md => toJsonTemplate.mdx} (54%) delete mode 100644 docs-site/content/api/trigger.md create mode 100644 docs-site/content/api/trigger.mdx delete mode 100644 docs-site/content/api/unbind.md create mode 100644 docs-site/content/api/unbind.mdx delete mode 100644 docs-site/content/api/unref.md create mode 100644 docs-site/content/api/unref.mdx rename docs-site/content/api/{useScope.md => useScope.mdx} (53%) rename docs-site/content/api/{warningHandler.md => warningHandler.mdx} (71%) delete mode 100644 docs-site/content/api/watchEffect.md create mode 100644 docs-site/content/api/watchEffect.mdx rename docs-site/content/directives/{class.md => class.mdx} (66%) delete mode 100644 docs-site/content/directives/context.md create mode 100644 docs-site/content/directives/context.mdx create mode 100644 docs-site/content/directives/demos/bind.ts create mode 100644 docs-site/content/directives/demos/browser.ts create mode 100644 docs-site/content/directives/demos/class.ts create mode 100644 docs-site/content/directives/demos/context.ts create mode 100644 docs-site/content/directives/demos/examples.ts create mode 100644 docs-site/content/directives/demos/for.ts create mode 100644 docs-site/content/directives/demos/html.ts create mode 100644 docs-site/content/directives/demos/if.ts create mode 100644 docs-site/content/directives/demos/is.ts create mode 100644 docs-site/content/directives/demos/model.ts create mode 100644 docs-site/content/directives/demos/on.ts create mode 100644 docs-site/content/directives/demos/pre.ts create mode 100644 docs-site/content/directives/demos/ref.ts create mode 100644 docs-site/content/directives/demos/show.ts create mode 100644 docs-site/content/directives/demos/style.ts create mode 100644 docs-site/content/directives/demos/teleport.ts create mode 100644 docs-site/content/directives/demos/text.ts delete mode 100644 docs-site/content/directives/index.md create mode 100644 docs-site/content/directives/index.mdx rename docs-site/content/directives/{is.md => is.mdx} (61%) rename docs-site/content/directives/{r-bind.md => r-bind.mdx} (51%) rename docs-site/content/directives/{r-for.md => r-for.mdx} (53%) rename docs-site/content/directives/{r-html.md => r-html.mdx} (54%) rename docs-site/content/directives/{r-if.md => r-if.mdx} (68%) rename docs-site/content/directives/{r-model.md => r-model.mdx} (70%) rename docs-site/content/directives/{r-on.md => r-on.mdx} (69%) rename docs-site/content/directives/{r-pre.md => r-pre.mdx} (59%) rename docs-site/content/directives/{r-show.md => r-show.mdx} (59%) delete mode 100644 docs-site/content/directives/r-teleport.md create mode 100644 docs-site/content/directives/r-teleport.mdx delete mode 100644 docs-site/content/directives/r-text.md create mode 100644 docs-site/content/directives/r-text.mdx rename docs-site/content/directives/{ref.md => ref.mdx} (59%) rename docs-site/content/directives/{style.md => style.mdx} (64%) create mode 100644 docs-site/content/examples/first-app/counter.ts create mode 100644 docs-site/content/examples/first-app/mount.ts delete mode 100644 docs-site/content/getting-started.md create mode 100644 docs-site/content/getting-started.mdx rename docs-site/content/guide/{components.md => components.mdx} (86%) create mode 100644 docs-site/content/guide/demos/browser.ts create mode 100644 docs-site/content/guide/demos/lifecycle.ts create mode 100644 docs-site/content/guide/demos/profile.ts create mode 100644 docs-site/content/guide/demos/quote.ts create mode 100644 docs-site/content/guide/demos/services.ts delete mode 100644 docs-site/content/guide/index.md create mode 100644 docs-site/content/guide/index.mdx rename docs-site/content/guide/{lifecycle-and-cleanup.md => lifecycle-and-cleanup.mdx} (65%) rename docs-site/content/guide/{mounting.md => mounting.mdx} (78%) rename docs-site/content/guide/{performance.md => performance.mdx} (87%) rename docs-site/content/guide/{persisted-state.md => persisted-state.mdx} (77%) rename docs-site/content/guide/{reactivity.md => reactivity.mdx} (73%) rename docs-site/content/guide/{templates.md => templates.mdx} (76%) rename docs-site/content/guide/{troubleshooting.md => troubleshooting.mdx} (85%) rename docs-site/content/guide/{typescript.md => typescript.mdx} (86%) delete mode 100644 docs-site/content/overview.md create mode 100644 docs-site/content/overview.mdx create mode 100644 docs-site/design/apiComponents.ts create mode 100644 docs-site/design/apiStyles.ts create mode 100644 docs-site/design/directiveComponents.ts create mode 100644 docs-site/design/directiveStyles.ts create mode 100644 docs-site/design/guideComponents.ts create mode 100644 docs-site/design/guideStyles.ts diff --git a/docs-site/README.md b/docs-site/README.md index 7df7db4..1b86220 100644 --- a/docs-site/README.md +++ b/docs-site/README.md @@ -22,7 +22,7 @@ support (`/guide/` serves `/guide/index.html`). No `/regor` base path is needed. DNS and the host's TLS certificate must be configured for that domain separately. Write pages in `content/` as Markdown or Regor MDX. Filenames define routes; -`index.md` defines a directory's landing page. Keep API filenames and links in +`index.md` or `index.mdx` defines a directory's landing page. Keep API filenames and links in matching case. Use top-level `order` frontmatter to order navigation. Put static files in `content/`; they are copied into the output at the same relative path. @@ -97,3 +97,53 @@ Type-check site extensions from the repository root: ```sh yarn tsc -p docs-site/tsconfig.json --noEmit ``` + +## Interactive guides + +The guides use PureStack's `Panel`, `Grid`, `Badge`, `AlertBox`, `ExpandablePanel`, +and `Tabs` components. Their filenames use `.mdx`; their public URLs are unchanged. + +Four pages include live Regor examples with source tabs using ``: + +- Reactivity: a quote with writable refs, computed totals, and a batched reset. +- Templates: a filterable service board with keyed rows and conditional empty state. +- Components: typed reactive props, computed initials, and a parent-context named slot. +- Lifecycle: a conditional child that starts an interval on mount and clears it on unmount. + +Each example in `content/guide/demos/` exports its context factory and shared +template. `design/guideComponents.ts` renders the static previews; `demos/browser.ts` +mounts the matching interactive island through `PageScript`. The static controls +are disabled, and the lifecycle preview creates no timer until the reader mounts +its child. Scoped visual styles live in `design/guideStyles.ts` and follow both themes. + +Getting Started uses the same components, package-manager tabs, and a live counter +from `content/examples/first-app/`. Overview shows the state-to-DOM flow and reuses +the guide's computed quote example. + +Every directive reference in `content/directives/` has its own live preview and +imported source. The directive index groups all fifteen topics into cards and +includes a form preview. `content/directives/demos/examples.ts` shares the preview +registry between `design/directiveComponents.ts` for static rendering and +`demos/browser.ts` for browser mounting. Styles in `design/directiveStyles.ts` +use the existing palette and are scoped to the examples. The HTML example uses +fixed trusted strings, the form event example submits locally, and the teleport +example keeps its target within the preview. + +## API reference + +The API index groups 45 references into eight categories with jump links and +topic cards. All references use MDX, orientation panels, usage callouts, and +expandable related links while keeping their existing public URLs. + +Sixteen shared labs cover 43 API references, including state conversion, +derived values, subscriptions, effects, batching, explicit notifications, +entanglement, raw objects, template conversion, DOM cleanup, context lookup, +validation, configuration, lifecycle, and components. Their source tabs use +``. The lifecycle, component, and app labs reuse existing +examples; the other lab sources live in `content/api/demos/`. + +`demos/examples.ts` shares the registry between `design/apiComponents.ts` for +static previews and `demos/browser.ts` for scoped browser mounting. +`design/apiStyles.ts` extends the existing documentation styles and palette. +The `persist` and `warningHandler` pages include source examples for deliberate +browser setup rather than running storage or shared-handler changes on page load. diff --git a/docs-site/content/api/_nav.json b/docs-site/content/api/_nav.json new file mode 100644 index 0000000..d3823a3 --- /dev/null +++ b/docs-site/content/api/_nav.json @@ -0,0 +1,3 @@ +{ + "sequence": ["Regor API"] +} diff --git a/docs-site/content/api/addUnbinder.md b/docs-site/content/api/addUnbinder.md deleted file mode 100644 index 60fd04a..0000000 --- a/docs-site/content/api/addUnbinder.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: addUnbinder ---- - -## Overview - -The `addUnbinder` function is used to associate an unbinder function with a DOM node in Regor. An unbinder function is used to remove bound data and associated logic from the DOM node when necessary. - -## Usage - -### Associating an Unbinder Function - -To associate an unbinder function with a DOM node, call the `addUnbinder` function with the following parameters: - -- `node`: The DOM node to which you want to associate the unbinder function. - -- `unbinder`: A function that can be executed later to remove bound data and associated logic from the DOM node. - -### Example - -```javascript -import { addUnbinder } from 'regor' - -// Create an unbinder function -const myUnbinder = () => { - // Remove bound data and associated logic - // ... -} - -// Associate the unbinder function with a DOM node -const someElement = document.getElementById('example') -addUnbinder(someElement, myUnbinder) -``` - -## Parameters - -- `node`: The DOM node to which you want to associate the unbinder function. - -- `unbinder`: A function that can be executed later to remove bound data and associated logic from the DOM node. - -## Notes - -- The `addUnbinder` function is typically used internally within Regor to manage unbinder functions associated with DOM nodes. - -- It provides a way to associate an unbinder function with a specific DOM element, allowing for the clean removal of bound data and logic when needed. - -- Unbinder functions are typically created and associated with DOM nodes as part of the data binding process in Regor. - -- The unbinder function, when executed, should perform any necessary cleanup or removal of data bindings and associated logic from the DOM node. - -- This function is primarily intended for use in advanced scenarios where direct access to Regor's internal data management is required. - -## See Also - -- [removeNode](/api/removeNode) -- [unbind](/api/unbind) -- [getBindData](/api/getBindData) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/addUnbinder.mdx b/docs-site/content/api/addUnbinder.mdx new file mode 100644 index 0000000..660c545 --- /dev/null +++ b/docs-site/content/api/addUnbinder.mdx @@ -0,0 +1,82 @@ +--- +title: addUnbinder +description: "Associate a cleanup callback with a DOM node’s binding lifetime." +--- + +addUnbinderCleanup and Unbind

Associate a cleanup callback with a DOM node’s binding lifetime.

+ +## Overview + +The `addUnbinder` function is used to associate an unbinder function with a DOM node in Regor. An unbinder function is used to remove bound data and associated logic from the DOM node when necessary. + +## Try it live + +
+
Own a node through its full lifetimeLive API
+ +
+ + +
+

Mount, write, unbind, or remove and drain. Watch the DOM, observer count, and registered cleanup.

+
+ +## Usage + +### Associating an Unbinder Function + +To associate an unbinder function with a DOM node, call the `addUnbinder` function with the following parameters: + +- `node`: The DOM node to which you want to associate the unbinder function. + +- `unbinder`: A function that can be executed later to remove bound data and associated logic from the DOM node. + +### Example + +```javascript +import { addUnbinder } from 'regor' + +// Create an unbinder function +const myUnbinder = () => { + // Remove bound data and associated logic + // ... +} + +// Associate the unbinder function with a DOM node +const someElement = document.getElementById('example') +addUnbinder(someElement, myUnbinder) +``` + +## Parameters + +- `node`: The DOM node to which you want to associate the unbinder function. + +- `unbinder`: A function that can be executed later to remove bound data and associated logic from the DOM node. + +

The callback should release resources owned by that node. The preview counts custom cleanup calls.

+ +## Notes + +- The `addUnbinder` function is typically used internally within Regor to manage unbinder functions associated with DOM nodes. + +- It provides a way to associate an unbinder function with a specific DOM element, allowing for the clean removal of bound data and logic when needed. + +- Unbinder functions are typically created and associated with DOM nodes as part of the data binding process in Regor. + +- The unbinder function, when executed, should perform any necessary cleanup or removal of data bindings and associated logic from the DOM node. + +- This function is primarily intended for use in advanced scenarios where direct access to Regor's internal data management is required. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/batch.md b/docs-site/content/api/batch.md deleted file mode 100644 index 05a5873..0000000 --- a/docs-site/content/api/batch.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: batch ---- - -## Overview - -The `batch` function is used to batch multiple updates to refs, which can help optimize performance by reducing the number of observer notifications and triggers during a series of updates. When multiple changes to refs are made within a `batch` block, observers are only notified once, at the end of the batch. - -## Usage - -### Batching Updates - -To batch updates to refs, wrap the code that performs the updates within a `batch` function call. The `batch` function takes an `updater` function as an argument, and all updates made within the `updater` function are batched together. - -```ts -import { batch, ref } from 'regor' - -const myRef1 = ref(5) -const myRef2 = ref(10) - -batch(() => { - myRef1.value = 15 - myRef2.value = 20 -}) - -// Observers are notified only once at the end of the batch -// Outputs: -// Observer triggered: 20 -``` - -## Parameters - -- `updater`: A function that contains the updates to refs that should be batched together. Any changes made to refs within this function will be batched. - -## Notes - -- Batching updates with the `batch` function can help improve the performance of your application when multiple changes are made to refs in a short period. It reduces the number of observer notifications and triggers, which can be especially beneficial in situations with complex reactivity logic. - -- When using the `batch` function, observers associated with refs will be notified once, at the end of the batch, rather than for each individual update. This can lead to more efficient reactivity handling. - -- The `batch` function can be particularly useful when performing multiple ref updates within a loop or in response to user interactions. - -- Important: When using the batch function, keep in mind that reads of refs within the batch can return potentially stale or outdated values due to pausing auto-updates. Ensure that your code logic accounts for this situation when reading refs within a batch. - -## See Also - -- [`startBatch`](/api/startBatch) -- [`endBatch`](/api/endBatch) -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`trigger`](/api/trigger) -- [`observe`](/api/observe) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/batch.mdx b/docs-site/content/api/batch.mdx new file mode 100644 index 0000000..82d73b4 --- /dev/null +++ b/docs-site/content/api/batch.mdx @@ -0,0 +1,77 @@ +--- +title: batch +description: "Group synchronous ref writes and flush their notifications after the callback." +--- + +batchObservation and Batch

Group synchronous ref writes and flush their notifications after the callback.

+ +## Overview + +The `batch` function is used to batch multiple updates to refs, which can help optimize performance by reducing the number of observer notifications and triggers during a series of updates. When multiple changes to refs are made within a `batch` block, observers are only notified once, at the end of the batch. + +## Try it live + +
+
Same writes, different notification countsLive API
+ +
+ + +
+

Each action adds three to one ref. Compare plain writes, batch, and a manual start/end pair.

+
+ +## Usage + +### Batching Updates + +To batch updates to refs, wrap the code that performs the updates within a `batch` function call. The `batch` function takes an `updater` function as an argument, and all updates made within the `updater` function are batched together. + +```ts +import { batch, ref } from 'regor' + +const myRef1 = ref(5) +const myRef2 = ref(10) + +batch(() => { + myRef1.value = 15 + myRef2.value = 20 +}) + +// Observers are notified only once at the end of the batch +// Outputs: +// Observer triggered: 20 +``` + +## Parameters + +- `updater`: A function that contains the updates to refs that should be batched together. Any changes made to refs within this function will be batched. + +

Use batch for a bounded set of related writes. Awaited work belongs outside that synchronous update group.

+ +## Notes + +- Batching updates with the `batch` function can help improve the performance of your application when multiple changes are made to refs in a short period. It reduces the number of observer notifications and triggers, which can be especially beneficial in situations with complex reactivity logic. + +- When using the `batch` function, observers associated with refs will be notified once, at the end of the batch, rather than for each individual update. This can lead to more efficient reactivity handling. + +- The `batch` function can be particularly useful when performing multiple ref updates within a loop or in response to user interactions. + +- Important: When using the batch function, keep in mind that reads of refs within the batch can return potentially stale or outdated values due to pausing auto-updates. Ensure that your code logic accounts for this situation when reading refs within a batch. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/collectRefs.md b/docs-site/content/api/collectRefs.md deleted file mode 100644 index 1516530..0000000 --- a/docs-site/content/api/collectRefs.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: collectRefs ---- - -## Overview - -The `collectRefs` function allows you to collect a set of reactive references (refs) within a specific scope and return both the result of an action and the collected refs. This is useful for managing and tracking the refs used within a certain code block. - -## Usage - -### Collecting Refs - -To collect refs using `collectRefs`, you provide an action function that performs some logic involving refs. The function will execute within a scope where the refs are collected, and you can access the collected refs along with the result of the action. - -```ts -import { collectRefs, ref } from 'regor' - -const myRef1 = ref(5) -const myRef2 = ref('Hello') - -const { value, refs } = collectRefs(() => { - console.log(myRef1.value) - myRef2.value = 'World' -}) - -console.log(value) // Outputs undefined (result of the action) -console.log(refs) // Outputs an array containing myRef1 and myRef2 -``` - -## Parameters - -- `action`: A function that performs some logic and may involve reactive refs. The function is executed within a scope where the refs are collected. - -## Return Value - -- The `collectRefs` function returns an object with two properties: - - `value`: The result of the action function. - - `refs`: An array containing the collected refs used within the action function. - -## Example - -```ts -import { collectRefs, ref } from 'regor' - -const myRef1 = ref(5) -const myRef2 = ref('Hello') - -const { value, refs } = collectRefs(() => { - console.log(myRef1.value) - myRef2.value = 'World' -}) - -console.log(value) // Outputs undefined (result of the action) -console.log(refs) // Outputs an array containing myRef1 and myRef2 -``` - -## See Also - -- [`ref`](/api/ref) -- [`observe`](/api/observe) -- [`observeMany`](/api/observeMany) -- [`computed`](/api/computed) -- [`watchEffect`](/api/watchEffect) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/collectRefs.mdx b/docs-site/content/api/collectRefs.mdx new file mode 100644 index 0000000..d6ec094 --- /dev/null +++ b/docs-site/content/api/collectRefs.mdx @@ -0,0 +1,98 @@ +--- +title: collectRefs +description: "Run an action and return both its result and the refs collected during its reads." +--- + +collectRefsComputed and Effects

Run an action and return both its result and the refs collected during its reads.

+ +## Overview + +The `collectRefs` function allows you to collect a set of reactive references (refs) within a specific scope and return both the result of an action and the collected refs. This is useful for managing and tracking the refs used within a certain code block. + +## Try it live + +
+
See which reads become dependenciesLive API
+ +
+ + +
+

Change the tracked and silenced values separately. Collect the reads to inspect the dependency count and returned result.

+
+ +## Usage + +### Collecting Refs + +To collect refs using `collectRefs`, you provide an action function that performs some logic involving refs. The function will execute within a scope where the refs are collected, and you can access the collected refs along with the result of the action. + +```ts +import { collectRefs, ref } from 'regor' + +const myRef1 = ref(5) +const myRef2 = ref('Hello') + +const { value, refs } = collectRefs(() => { + console.log(myRef1.value) + myRef2.value = 'World' +}) + +console.log(value) // Outputs undefined (result of the action) +console.log(refs) // Outputs an array containing myRef1 and myRef2 +``` + +## Parameters + +- `action`: A function that performs some logic and may involve reactive refs. The function is executed within a scope where the refs are collected. + +## Return Value + +- The `collectRefs` function returns an object with two properties: + - `value`: The result of the action function. + - `refs`: An array containing the collected refs used within the action function. + +## Example + +```ts +import { collectRefs, ref } from 'regor' + +const myRef1 = ref(5) +const myRef2 = ref('Hello') + +const { value, refs } = collectRefs(() => { + console.log(myRef1.value) + myRef2.value = 'World' +}) + +console.log(value) // Outputs undefined (result of the action) +console.log(refs) // Outputs an array containing myRef1 and myRef2 +``` + +

collectRefs reports dependencies read during that invocation. It does not create a subscription by itself.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/computeMany.md b/docs-site/content/api/computeMany.md deleted file mode 100644 index efbd5db..0000000 --- a/docs-site/content/api/computeMany.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: computeMany ---- - -## Overview - -The `computeMany` function allows you to create a computed ref object that depends on multiple source ref objects and a computation function. The computed ref automatically updates when any of the source refs change, making it useful for deriving values from multiple reactive data sources. - -## Usage - -### Creating Computed Refs - -To create a computed ref using `computeMany`, you provide an array of source ref objects and a computation function. The computation function calculates the computed value based on the values of the source refs, and the computed ref will automatically update when any of the source refs change. - -```ts -import { computeMany, ref } from 'regor' - -const myRef1 = ref(5) -const myRef2 = ref(10) - -// Create a computed ref that depends on both myRef1 and myRef2 -const computedValue = computeMany( - [myRef1, myRef2], - (value1, value2) => value1 + value2, -) - -console.log(computedValue.value) // Outputs 15 - -// Later, when myRef1 or myRef2 changes, computedValue will automatically update -myRef1.value = 7 -console.log(computedValue.value) // Outputs 17 -``` - -## Parameters - -- `sources`: An array of source ref objects that the computed ref depends on. Changes to any of the source refs will trigger the computation. -- `compute`: A function that calculates the computed value based on the values of the source refs. This function should not have side effects and should only depend on reactive data. - -## Return Value - -- The `computeMany` function returns a computed ref object that holds the computed value. You can access the computed value using the `.value` property of the computed ref or by invoking it directly. - -## Example - -```ts -import { computeMany, ref } from 'regor' - -const myRef1 = ref(5) -const myRef2 = ref(10) - -// Create a computed ref that depends on both myRef1 and myRef2 -const computedValue = computeMany( - [myRef1, myRef2], - (value1, value2) => value1 + value2, -) - -console.log(computedValue.value) // Outputs 15 - -// Later, when myRef1 or myRef2 changes, computedValue will automatically update -myRef1.value = 7 -console.log(computedValue.value) // Outputs 17 -``` - -## See Also - -- [`computed`](/api/computed) -- [`computeRef`](/api/computeRef) -- [`ref`](/api/ref) -- [`observe`](/api/observe) -- [`observeMany`](/api/observeMany) -- [`watchEffect`](/api/watchEffect) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/computeMany.mdx b/docs-site/content/api/computeMany.mdx new file mode 100644 index 0000000..db58707 --- /dev/null +++ b/docs-site/content/api/computeMany.mdx @@ -0,0 +1,106 @@ +--- +title: computeMany +description: "Derive a read-only result from an explicit list of source refs." +--- + +computeManyComputed and Effects

Derive a read-only result from an explicit list of source refs.

+ +## Overview + +The `computeMany` function allows you to create a computed ref object that depends on multiple source ref objects and a computation function. The computed ref automatically updates when any of the source refs change, making it useful for deriving values from multiple reactive data sources. + +## Try it live + +
+
Three ways to derive a valueLive API
+ +
+ + +
+

Move either slider. The three read-only outputs use computed, computeRef, and computeMany.

+
+ +## Usage + +### Creating Computed Refs + +To create a computed ref using `computeMany`, you provide an array of source ref objects and a computation function. The computation function calculates the computed value based on the values of the source refs, and the computed ref will automatically update when any of the source refs change. + +```ts +import { computeMany, ref } from 'regor' + +const myRef1 = ref(5) +const myRef2 = ref(10) + +// Create a computed ref that depends on both myRef1 and myRef2 +const computedValue = computeMany( + [myRef1, myRef2], + (value1, value2) => value1 + value2, +) + +console.log(computedValue.value) // Outputs 15 + +// Later, when myRef1 or myRef2 changes, computedValue will automatically update +myRef1.value = 7 +console.log(computedValue.value) // Outputs 17 +``` + +## Parameters + +- `sources`: An array of source ref objects that the computed ref depends on. Changes to any of the source refs will trigger the computation. +- `compute`: A function that calculates the computed value based on the values of the source refs. This function should not have side effects and should only depend on reactive data. + +## Return Value + +- The `computeMany` function returns a computed ref object that holds the computed value. You can access the computed value using the `.value` property of the computed ref or by invoking it directly. + +## Example + +```ts +import { computeMany, ref } from 'regor' + +const myRef1 = ref(5) +const myRef2 = ref(10) + +// Create a computed ref that depends on both myRef1 and myRef2 +const computedValue = computeMany( + [myRef1, myRef2], + (value1, value2) => value1 + value2, +) + +console.log(computedValue.value) // Outputs 15 + +// Later, when myRef1 or myRef2 changes, computedValue will automatically update +myRef1.value = 7 +console.log(computedValue.value) // Outputs 17 +``` + +

The callback receives source values in the same order as the source array.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/computeRef.md b/docs-site/content/api/computeRef.md deleted file mode 100644 index fef38c5..0000000 --- a/docs-site/content/api/computeRef.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: computeRef ---- - -## Overview - -The `computeRef` function allows you to create a computed ref object that automatically computes its value based on a source ref object and a computation function. This is useful for deriving values from reactive data and ensuring that the computed ref updates whenever the source ref changes. - -## Usage - -### Creating Computed Refs - -To create a computed ref using `computeRef`, you provide a source ref and a computation function. The computation function calculates the computed value based on the value of the source ref, and the computed ref will automatically update when the source ref changes. - -```ts -import { computeRef, ref } from 'regor' - -const myRef = ref(5) - -// Create a computed ref -const computedValue = computeRef(myRef, (value) => value * 2) - -console.log(computedValue.value) // Outputs 10 - -// Later, when myRef changes, computedValue will automatically update -myRef.value = 7 -console.log(computedValue.value) // Outputs 14 -``` - -## Parameters - -- `source`: The source ref object that the computed ref depends on. Changes to the source ref will trigger the computation. -- `compute`: A function that calculates the computed value based on the current value of the source ref. This function should not have side effects and should only depend on reactive data. - -## Return Value - -- The `computeRef` function returns a computed ref object that holds the computed value. You can access the computed value using the `.value` property of the computed ref or by invoking it directly. - -## Example - -```ts -import { computeRef, ref } from 'regor' - -const myRef = ref(5) - -// Create a computed ref -const computedValue = computeRef(myRef, (value) => value * 2) - -console.log(computedValue.value) // Outputs 10 - -// Later, when myRef changes, computedValue will automatically update -myRef.value = 7 -console.log(computedValue.value) // Outputs 14 -``` - -## See Also - -- [`ref`](/api/ref) -- [`observe`](/api/observe) -- [`observeMany`](/api/observeMany) -- [`computed`](/api/computed) -- [`watchEffect`](/api/watchEffect) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/computeRef.mdx b/docs-site/content/api/computeRef.mdx new file mode 100644 index 0000000..ec573e2 --- /dev/null +++ b/docs-site/content/api/computeRef.mdx @@ -0,0 +1,97 @@ +--- +title: computeRef +description: "Derive a read-only result from one explicit source ref." +--- + +computeRefComputed and Effects

Derive a read-only result from one explicit source ref.

+ +## Overview + +The `computeRef` function allows you to create a computed ref object that automatically computes its value based on a source ref object and a computation function. This is useful for deriving values from reactive data and ensuring that the computed ref updates whenever the source ref changes. + +## Try it live + +
+
Three ways to derive a valueLive API
+ +
+ + +
+

Move either slider. The three read-only outputs use computed, computeRef, and computeMany.

+
+ +## Usage + +### Creating Computed Refs + +To create a computed ref using `computeRef`, you provide a source ref and a computation function. The computation function calculates the computed value based on the value of the source ref, and the computed ref will automatically update when the source ref changes. + +```ts +import { computeRef, ref } from 'regor' + +const myRef = ref(5) + +// Create a computed ref +const computedValue = computeRef(myRef, (value) => value * 2) + +console.log(computedValue.value) // Outputs 10 + +// Later, when myRef changes, computedValue will automatically update +myRef.value = 7 +console.log(computedValue.value) // Outputs 14 +``` + +## Parameters + +- `source`: The source ref object that the computed ref depends on. Changes to the source ref will trigger the computation. +- `compute`: A function that calculates the computed value based on the current value of the source ref. This function should not have side effects and should only depend on reactive data. + +## Return Value + +- The `computeRef` function returns a computed ref object that holds the computed value. You can access the computed value using the `.value` property of the computed ref or by invoking it directly. + +## Example + +```ts +import { computeRef, ref } from 'regor' + +const myRef = ref(5) + +// Create a computed ref +const computedValue = computeRef(myRef, (value) => value * 2) + +console.log(computedValue.value) // Outputs 10 + +// Later, when myRef changes, computedValue will automatically update +myRef.value = 7 +console.log(computedValue.value) // Outputs 14 +``` + +

Choose computeRef when the input dependency should be stated directly rather than discovered through reads.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/computed.md b/docs-site/content/api/computed.md deleted file mode 100644 index d97371d..0000000 --- a/docs-site/content/api/computed.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: computed ---- - -## Overview - -The `computed` function allows you to create a computed property that depends on reactive data and automatically updates when its dependencies change. Computed properties are useful for performing complex calculations or transformations on reactive data. - -[**`Try It Online`**](https://stackblitz.com/edit/regor-sample-ref?file=index.ts) - -## Usage - -### Creating Computed Properties - -To create a computed property using `computed`, you provide a function (`compute`) that calculates the computed value based on reactive data. The computed property will automatically update whenever the reactive data it depends on changes. - -```ts -import { computed, ref } from 'regor' - -const myRef = ref(5) - -// Create a computed property -const computedValue = computed(() => myRef.value * 2) - -console.log(computedValue.value) // Outputs 10 - -// Later, when myRef changes, computedValue will automatically update -myRef.value = 7 -console.log(computedValue.value) // Outputs 14 -``` - -## Parameters - -- `compute`: A function that calculates the computed value based on reactive data. This function should not have any side effects and should only depend on reactive data. - -## Return Value - -- The `computed` function returns a computed ref object that holds the calculated value. You can access the computed value using the `.value` property of the computed ref or by invoking it directly. - -## Example - -```ts -import { computed, ref } from 'regor' - -const myRef = ref(5) - -// Create a computed property -const computedValue = computed(() => myRef.value * 2) - -console.log(computedValue.value) // Outputs 10 - -// Later, when myRef changes, computedValue will automatically update -myRef.value = 7 -console.log(computedValue.value) // Outputs 14 -``` - -## See Also - -- [`ref`](/api/ref) -- [`observe`](/api/observe) -- [`observeMany`](/api/observeMany) -- [`watchEffect`](/api/watchEffect) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/computed.mdx b/docs-site/content/api/computed.mdx new file mode 100644 index 0000000..a3065a2 --- /dev/null +++ b/docs-site/content/api/computed.mdx @@ -0,0 +1,97 @@ +--- +title: computed +description: "Derive a read-only value by tracking the refs read during a computation." +--- + +computedComputed and Effects

Derive a read-only value by tracking the refs read during a computation.

+ +## Overview + +The `computed` function allows you to create a computed property that depends on reactive data and automatically updates when its dependencies change. Computed properties are useful for performing complex calculations or transformations on reactive data. + +[**`Try It Online`**](https://stackblitz.com/edit/regor-sample-ref?file=index.ts) + +## Try it live + +
+
Three ways to derive a valueLive API
+ +
+ + +
+

Move either slider. The three read-only outputs use computed, computeRef, and computeMany.

+
+ +## Usage + +### Creating Computed Properties + +To create a computed property using `computed`, you provide a function (`compute`) that calculates the computed value based on reactive data. The computed property will automatically update whenever the reactive data it depends on changes. + +```ts +import { computed, ref } from 'regor' + +const myRef = ref(5) + +// Create a computed property +const computedValue = computed(() => myRef.value * 2) + +console.log(computedValue.value) // Outputs 10 + +// Later, when myRef changes, computedValue will automatically update +myRef.value = 7 +console.log(computedValue.value) // Outputs 14 +``` + +## Parameters + +- `compute`: A function that calculates the computed value based on reactive data. This function should not have any side effects and should only depend on reactive data. + +## Return Value + +- The `computed` function returns a computed ref object that holds the calculated value. You can access the computed value using the `.value` property of the computed ref or by invoking it directly. + +## Example + +```ts +import { computed, ref } from 'regor' + +const myRef = ref(5) + +// Create a computed property +const computedValue = computed(() => myRef.value * 2) + +console.log(computedValue.value) // Outputs 10 + +// Later, when myRef changes, computedValue will automatically update +myRef.value = 7 +console.log(computedValue.value) // Outputs 14 +``` + +

Read source state and return a result. Put side effects in watchEffect or explicit observers.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/contextRegistry.md b/docs-site/content/api/contextRegistry.mdx similarity index 63% rename from docs-site/content/api/contextRegistry.md rename to docs-site/content/api/contextRegistry.mdx index 701536a..0d6bed8 100644 --- a/docs-site/content/api/contextRegistry.md +++ b/docs-site/content/api/contextRegistry.mdx @@ -1,7 +1,10 @@ --- title: contextRegistry +description: "Register context instances and resolve them by their runtime class." --- +contextRegistryLifecycle and Scope

Register context instances and resolve them by their runtime class.

+ ## Overview `ContextRegistry` is a utility class for explicit context sharing across @@ -11,6 +14,18 @@ It stores context instances by constructor and lets you resolve them by type. Lookup uses `instanceof`, so querying by a base class can return a subclass instance. +## Try it live + +
+
Resolve the instance you registeredLive API
+ +
+ + +
+

Register a workspace, replace it, or unregister it. Lookup uses the class rather than the draft input.

+
+ ## Usage ```ts @@ -177,11 +192,19 @@ createApp( ) ``` +

Registering another instance of the same constructor replaces the earlier entry. find can check for absence without throwing.

+ ## See Also -- [`defineComponent`](/api/defineComponent) -- [`useScope`](/api/useScope) -- [Components Guide](/guide/components) -- [TypeScript Guide](/guide/typescript) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/createApp.md b/docs-site/content/api/createApp.mdx similarity index 62% rename from docs-site/content/api/createApp.md rename to docs-site/content/api/createApp.mdx index d9b4af7..43e4391 100644 --- a/docs-site/content/api/createApp.md +++ b/docs-site/content/api/createApp.mdx @@ -1,18 +1,33 @@ --- title: createApp +description: "Mount a context on existing DOM or supply a template for a reactive island." --- +createAppApp and Components

Mount a context on existing DOM or supply a template for a reactive island.

+ ## Overview The `createApp` function is the entry point for creating a Regor application. It allows you to bind a Regor context to a specified DOM element, effectively rendering and managing the dynamic behavior of your application. +## Try it live + +
+
Mount a context and a templateLive API
+ +
+ + +
+

Increment or reset the ref. The browser entry shows how createApp mounts this view.

+
+ ## Usage ### Creating a Regor App To create a Regor application, call the `createApp` function with the following parameters: -- `context` (required): The Regor context or scope that defines the application's behavior and data. It can be a context object or a scope created using [`useScope`](#useScope). +- `context` (required): The Regor context or scope that defines the application's behavior and data. It can be a context object or a scope created using [`useScope`](/api/useScope). - `template` (optional): An HTML string or object specifying the template for rendering the application. It can include the following properties: @@ -67,6 +82,8 @@ The `createApp` function returns an object with the following properties: - `unbind`: A function that unbinds the app, removing all Regor bindings and event listeners associated with the app's root element, leaving the DOM as is. +

Choose a root that exists before mounting. Use the returned app handle to release its bindings or remove the root.

+ ## Notes - `createApp` is typically called at the entry point of your application to initialize Regor and bind it to a specific DOM element. @@ -87,10 +104,16 @@ The `createApp` function returns an object with the following properties: ## See Also -- [`defineComponent`](/api/defineComponent) -- [`RegorConfig`](/api/regorConfig) -- [`pval`](/api/pval) -- [`toFragment`](/api/toFragment) -- [`toJsonTemplate`](/api/toJsonTemplate) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/cref.md b/docs-site/content/api/cref.md deleted file mode 100644 index 85f0f85..0000000 --- a/docs-site/content/api/cref.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: cref ---- - -## Overview - -The `cref` function creates a deep ref from a flattened copy of the given value. - -It is equivalent to calling `ref(flatten(value))`: nested refs are unwrapped into plain values first, then the copied structure is converted into deep refs. - -Use `cref` when you want deep ref behavior without mutating the original object graph during initial conversion. - -## Usage - -```ts -import { cref } from 'regor' - -const source = { - user: { - name: 'Ada', - }, -} - -const state = cref(source) - -state().user().name('Grace') - -console.log(source.user.name) -// Outputs: Ada - -console.log(state().user().name()) -// Outputs: Grace -``` - -## Parameters - -- `value` (optional): Any value that you want to copy and convert into a deep ref. - -## Return Value - -The `cref` function returns the same kind of deep ref as `ref`. - -## Notes - -- `cref(value)` is equivalent to `ref(flatten(value))`. -- `cref` does not mutate the original object graph during initial conversion. -- `cref` does extra work compared with `ref`, so use `ref` for performance-critical paths where in-place conversion is acceptable. -- `cref` follows `flatten` behavior for nested refs, arrays, sets, maps, and circular references. - -## See Also - -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/cref.mdx b/docs-site/content/api/cref.mdx new file mode 100644 index 0000000..ae64e17 --- /dev/null +++ b/docs-site/content/api/cref.mdx @@ -0,0 +1,82 @@ +--- +title: cref +description: "Copy a structure before deep conversion so the original data remains unchanged." +--- + +crefReactivity

Copy a structure before deep conversion so the original data remains unchanged.

+ +## Overview + +The `cref` function creates a deep ref from a flattened copy of the given value. + +It is equivalent to calling `ref(flatten(value))`: nested refs are unwrapped into plain values first, then the copied structure is converted into deep refs. + +Use `cref` when you want deep ref behavior without mutating the original object graph during initial conversion. + +## Try it live + +
+
Compare deep, copied, and shallow stateLive API
+ +
+ + +
+

Change the name and apply it. Inspect the nested values, ref checks, and flattened snapshot.

+
+ +## Usage + +```ts +import { cref } from 'regor' + +const source = { + user: { + name: 'Ada', + }, +} + +const state = cref(source) + +state().user().name('Grace') + +console.log(source.user.name) +// Outputs: Ada + +console.log(state().user().name()) +// Outputs: Grace +``` + +## Parameters + +- `value` (optional): Any value that you want to copy and convert into a deep ref. + +## Return Value + +The `cref` function returns the same kind of deep ref as `ref`. + +

Use cref for plain source data whose original structure should remain intact.

+ +## Notes + +- `cref(value)` is equivalent to `ref(flatten(value))`. +- `cref` does not mutate the original object graph during initial conversion. +- `cref` does extra work compared with `ref`, so use `ref` for performance-critical paths where in-place conversion is acceptable. +- `cref` follows `flatten` behavior for nested refs, arrays, sets, maps, and circular references. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/defineComponent.md b/docs-site/content/api/defineComponent.mdx similarity index 78% rename from docs-site/content/api/defineComponent.md rename to docs-site/content/api/defineComponent.mdx index 367d955..17e4ab2 100644 --- a/docs-site/content/api/defineComponent.md +++ b/docs-site/content/api/defineComponent.mdx @@ -1,11 +1,26 @@ --- title: defineComponent +description: "Define a reusable template with a context factory, props, and slots." --- +defineComponentApp and Components

Define a reusable template with a context factory, props, and slots.

+ ## Overview The `defineComponent` function is used to define a Regor component, which encapsulates a part of your user interface (UI) with its own behavior and template. Components allow you to build complex UIs by composing smaller, reusable units. +## Try it live + +
+
Props and slots in a reusable viewLive API
+ +
+ + +
+

The parent controls the form; the child receives props and a named slot.

+
+ ## Usage ### Defining a Regor Component @@ -146,6 +161,8 @@ The `defineComponent` function returns a component object with the following pro - `defaultName`: An optional default name for the component. This name can be used for debugging and identification purposes. +

Put component state inside its context factory. Separate instances then have separate state and cleanup.

+ ## Notes - Components are a fundamental building block in Regor applications. They encapsulate UI elements, logic, and reactivity, making it easier to manage complex user interfaces. @@ -171,9 +188,15 @@ The `defineComponent` function returns a component object with the following pro ## See Also -- [`createApp`](/api/createApp) -- [`pval`](/api/pval) -- [`toFragment`](/api/toFragment) -- [`toJsonTemplate`](/api/toJsonTemplate) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/demos/batching.ts b/docs-site/content/api/demos/batching.ts new file mode 100644 index 0000000..9756965 --- /dev/null +++ b/docs-site/content/api/demos/batching.ts @@ -0,0 +1,64 @@ +import { batch, endBatch, html, observe, ref, startBatch } from 'regor' + +export function createBatching(interactive = false) { + const source = ref(0), + notifications = ref(0), + value = ref(0) + const mode = ref('Choose an update strategy.') + observe(source, () => notifications(notifications() + 1)) + const update = (strategy: string) => { + notifications(0) + const writes = () => { + for (let i = 0; i < 3; i++) source(source() + 1) + } + if (strategy === 'batch') batch(writes) + else if (strategy === 'manual') { + startBatch() + try { + writes() + } finally { + endBatch() + } + } else writes() + value(source()) + mode( + strategy === 'plain' + ? 'Three separate writes' + : strategy === 'batch' + ? 'One batch callback' + : 'startBatch + finally endBatch', + ) + } + return { + interactive, + notifications, + value, + mode, + plain: () => update('plain'), + grouped: () => update('batch'), + manual: () => update('manual'), + } +} + +export const batchingTemplate = html`
+
+ +
+
+
{{ value }}Source value
+
+ {{ notifications }}Observer callbacks +
+
+

{{ mode }}

+

+ Each action adds three. Compare notification counts for the same amount of + state change. +

+
` diff --git a/docs-site/content/api/demos/browser.ts b/docs-site/content/api/demos/browser.ts new file mode 100644 index 0000000..9fa1d78 --- /dev/null +++ b/docs-site/content/api/demos/browser.ts @@ -0,0 +1,14 @@ +import { createApp, RegorConfig, useScope } from 'regor' +import { apiExamples } from './examples' + +const element = document.getElementById('api-demo') +const name = element?.dataset.example +if (element && name && Object.hasOwn(apiExamples, name)) { + const example = apiExamples[name as keyof typeof apiExamples] + const scope = useScope(() => example.create(true)) + const config = + 'config' in scope.context && scope.context.config instanceof RegorConfig + ? scope.context.config + : undefined + createApp(scope, { element, template: example.template }, config) +} diff --git a/docs-site/content/api/demos/cleanup.ts b/docs-site/content/api/demos/cleanup.ts new file mode 100644 index 0000000..995b117 --- /dev/null +++ b/docs-site/content/api/demos/cleanup.ts @@ -0,0 +1,114 @@ +import { + addUnbinder, + createApp, + drainUnbind, + getBindData, + html, + observerCount, + onUnmounted, + ref, + removeNode, + sref, + unbind, + useScope, +} from 'regor' + +export function createCleanup(interactive = false) { + const host = sref(null) + const source = ref(0), + value = ref(0), + present = ref(false), + bound = ref(false) + const observers = ref(0), + callbacks = ref(0), + registered = ref(0) + let node: HTMLElement | null = null + const inspect = () => { + observers(observerCount(source)) + registered(node ? getBindData(node).unbinders.length : 0) + } + const mount = () => { + if (!host() || node) return + node = document.createElement('div') + node.className = 'directive-card api-owned-node' + host()!.appendChild(node) + createApp( + useScope(() => ({ source })), + { + element: node, + template: + 'Owned node

Bound value:

', + }, + ) + addUnbinder(node, () => callbacks(callbacks() + 1)) + present(true) + bound(true) + inspect() + } + const detach = () => { + if (node) unbind(node) + bound(false) + inspect() + } + const remove = async () => { + if (!node) return + removeNode(node) + await drainUnbind() + node = null + present(false) + bound(false) + inspect() + } + onUnmounted(() => { + if (node) { + unbind(node) + node.remove() + } + }) + return { + interactive, + host, + value, + present, + bound, + observers, + callbacks, + registered, + mount, + detach, + remove, + increment: () => { + source(source() + 1) + value(source()) + inspect() + }, + } +} + +export const cleanupTemplate = html`
+
+ +
+

+ Source value: {{ value }} · Node: {{ present ? 'present' : + 'absent' }} +

+
+
+
{{ observers }}Source observers
+
{{ registered }}Root unbinders
+
{{ callbacks }}Custom cleanup calls
+
+

+ Unbind keeps the node but freezes its bindings. Remove + drain removes it + and flushes deferred cleanup. +

+
` diff --git a/docs-site/content/api/demos/configuration.ts b/docs-site/content/api/demos/configuration.ts new file mode 100644 index 0000000..f506c05 --- /dev/null +++ b/docs-site/content/api/demos/configuration.ts @@ -0,0 +1,35 @@ +import { html, ref, RegorConfig, type PropValidationMode } from 'regor' + +export function createConfiguration(interactive = false) { + const config = new RegorConfig() + const policy = ref('throw') + const applied = ref(config.propValidationMode) + const apply = () => { + config.propValidationMode = policy() + applied(config.propValidationMode) + } + return { interactive, config, policy, applied, apply } +} + +export const configurationTemplate = html`
+
+ +
+
+ LOCAL REGORCONFIG{{ applied }} +

+ The browser mount passes this instance to createApp. The page's other apps + keep their own configuration. +

+
+
` diff --git a/docs-site/content/api/demos/derived.ts b/docs-site/content/api/demos/derived.ts new file mode 100644 index 0000000..e01a057 --- /dev/null +++ b/docs-site/content/api/demos/derived.ts @@ -0,0 +1,50 @@ +import { computed, computeMany, computeRef, html, ref } from 'regor' + +export function createDerived(interactive = false) { + const seats = ref(4) + const price = ref(25) + return { + interactive, + seats, + price, + total: computed(() => seats() * price()), + double: computeRef(seats, (value) => value * 2), + combined: computeMany([seats, price], (count, cost) => count + cost), + } +} + +export const derivedTemplate = html`
+
+ +
+
+
+ {{ total }}computed · seats × price +
+
{{ double }}computeRef · seats × 2
+
+ {{ combined }}computeMany · seats + price +
+
+

+ Three read-only values, three ways to specify their dependencies. +

+
` diff --git a/docs-site/content/api/demos/effects.ts b/docs-site/content/api/demos/effects.ts new file mode 100644 index 0000000..092a2ca --- /dev/null +++ b/docs-site/content/api/demos/effects.ts @@ -0,0 +1,63 @@ +import { collectRefs, html, ref, silence, watchEffect } from 'regor' + +export function createEffects(interactive = false) { + const tracked = ref(1), + untracked = ref(10) + const runs = ref(0), + cleanups = ref(0), + result = ref('') + const collected = ref(0), + inspected = ref(0) + watchEffect((onCleanup) => { + const value = tracked() + silence(() => { + runs(runs() + 1) + result(`${value} + ${untracked()} = ${value + untracked()}`) + }) + onCleanup?.(() => silence(() => cleanups(cleanups() + 1))) + }) + const inspect = () => { + const read = collectRefs(() => tracked() + silence(() => untracked())) + collected(read.refs.length) + inspected(read.value) + } + inspect() + return { + interactive, + tracked, + untracked, + runs, + cleanups, + result, + collected, + inspected, + inspect, + bumpTracked: () => tracked(tracked() + 1), + bumpUntracked: () => untracked(untracked() + 1), + } +} + +export const effectsTemplate = html`
+
+ +
+

Current refs: {{ tracked }} / {{ untracked }}

+

Last effect: {{ result }}

+
+
{{ runs }}Effect runs
+
{{ cleanups }}Effect cleanups
+
+ {{ collected }}Collected dependencies +
+
+

+ The silenced read does not rerun the effect. collectRefs captures one + dependency and returns the sampled sum: {{ inspected }}. +

+
` diff --git a/docs-site/content/api/demos/entanglement.ts b/docs-site/content/api/demos/entanglement.ts new file mode 100644 index 0000000..ecb62b0 --- /dev/null +++ b/docs-site/content/api/demos/entanglement.ts @@ -0,0 +1,50 @@ +import { entangle, html, ref } from 'regor' + +export function createEntanglement(interactive = false) { + const left = ref('Shared title'), + right = ref('') + const linked = ref(true) + const stop = entangle(left, right) + return { + interactive, + left, + right, + linked, + disconnect: () => { + stop() + linked(false) + }, + } +} + +export const entanglementTemplate = html`
+
+ +
+
+ {{ linked ? 'Two-way link active' : 'Refs are independent' }} +
+

+ Edit either side. Disconnect the link, then edit again. +

+
` diff --git a/docs-site/content/api/demos/examples.ts b/docs-site/content/api/demos/examples.ts new file mode 100644 index 0000000..b72b9fa --- /dev/null +++ b/docs-site/content/api/demos/examples.ts @@ -0,0 +1,44 @@ +import { createState, stateTemplate } from './state' +import { createDerived, derivedTemplate } from './derived' +import { createObservation, observationTemplate } from './observation' +import { createEffects, effectsTemplate } from './effects' +import { createBatching, batchingTemplate } from './batching' +import { createNotifications, notificationsTemplate } from './notifications' +import { createEntanglement, entanglementTemplate } from './entanglement' +import { createRawState, rawStateTemplate } from './raw-state' +import { createTemplates, templatesTemplate } from './templates' +import { createCleanup, cleanupTemplate } from './cleanup' +import { createRegistry, registryTemplate } from './registry' +import { createValidation, validationTemplate } from './validation' +import { createConfiguration, configurationTemplate } from './configuration' +import { createLifecycle, lifecycleTemplate } from '../../guide/demos/lifecycle' +import { createProfile, profileTemplate } from '../../guide/demos/profile' +import { + createCounter, + counterTemplate, +} from '../../examples/first-app/counter' + +export const apiExamples = { + state: { create: createState, template: stateTemplate }, + derived: { create: createDerived, template: derivedTemplate }, + observation: { create: createObservation, template: observationTemplate }, + effects: { create: createEffects, template: effectsTemplate }, + batching: { create: createBatching, template: batchingTemplate }, + notifications: { + create: createNotifications, + template: notificationsTemplate, + }, + entanglement: { create: createEntanglement, template: entanglementTemplate }, + rawState: { create: createRawState, template: rawStateTemplate }, + templates: { create: createTemplates, template: templatesTemplate }, + cleanup: { create: createCleanup, template: cleanupTemplate }, + registry: { create: createRegistry, template: registryTemplate }, + validation: { create: createValidation, template: validationTemplate }, + configuration: { + create: createConfiguration, + template: configurationTemplate, + }, + lifecycle: { create: createLifecycle, template: lifecycleTemplate }, + component: { create: createProfile, template: profileTemplate }, + app: { create: createCounter, template: counterTemplate }, +} as const diff --git a/docs-site/content/api/demos/notifications.ts b/docs-site/content/api/demos/notifications.ts new file mode 100644 index 0000000..8ba33f1 --- /dev/null +++ b/docs-site/content/api/demos/notifications.ts @@ -0,0 +1,67 @@ +import { html, observe, pause, ref, resume, trigger } from 'regor' + +export function createNotifications(interactive = false) { + const source = ref(0), + stored = ref(0), + seen = ref(0), + callbacks = ref(0), + paused = ref(false) + observe(source, (value) => { + seen(value) + callbacks(callbacks() + 1) + }) + return { + interactive, + stored, + seen, + callbacks, + paused, + write: () => { + source(source() + 1) + stored(source()) + }, + pauseSource: () => { + pause(source) + paused(true) + }, + resumeSource: () => { + resume(source) + paused(false) + }, + notify: () => trigger(source), + } +} + +export const notificationsTemplate = html`
+
+ +
+
+
{{ stored }}Stored value
+
{{ seen }}Observer's last value
+
{{ callbacks }}Callbacks
+
+

+ Notifications are {{ paused ? 'paused' : 'active' }}. +

+

+ Pause, write, then resume and trigger. The stored value and the last + observed value show different responsibilities. +

+
` diff --git a/docs-site/content/api/demos/observation.ts b/docs-site/content/api/demos/observation.ts new file mode 100644 index 0000000..2fe98c4 --- /dev/null +++ b/docs-site/content/api/demos/observation.ts @@ -0,0 +1,68 @@ +import { html, observe, observeMany, observerCount, ref } from 'regor' + +export function createObservation(interactive = false) { + const left = ref(0), + right = ref(0) + const single = ref(0), + multiple = ref(0), + listening = ref(true) + const count = ref(0) + const stopSingle = observe(left, () => single(single() + 1)) + const stopMany = observeMany([left, right], () => multiple(multiple() + 1)) + // These source refs are not rendered directly, so this count isolates our observers. + const refresh = () => count(observerCount(left)) + const values = ref('0 / 0') + const bumpLeft = () => { + left(left() + 1) + values(`${left()} / ${right()}`) + refresh() + } + const bumpRight = () => { + right(right() + 1) + values(`${left()} / ${right()}`) + refresh() + } + const stop = () => { + stopSingle() + stopMany() + listening(false) + refresh() + } + refresh() + return { + interactive, + values, + single, + multiple, + listening, + count, + bumpLeft, + bumpRight, + stop, + } +} + +export const observationTemplate = html`
+
+ +
+

Source values: {{ values }}

+
+
+ {{ single }}observe · left callbacks +
+
+ {{ multiple }}observeMany · callbacks +
+
{{ count }}Observers on left
+
+

+ After stopping, source values still change but the callback counts stay put. +

+
` diff --git a/docs-site/content/api/demos/persistence-example.ts b/docs-site/content/api/demos/persistence-example.ts new file mode 100644 index 0000000..36e8124 --- /dev/null +++ b/docs-site/content/api/demos/persistence-example.ts @@ -0,0 +1,8 @@ +import { persist, ref, useScope } from 'regor' + +// Call in the browser when mounting the app that owns these preferences. +export function createPreferences() { + return useScope(() => ({ + compact: persist(ref(false), 'regor-example:preferences:v1'), + })) +} diff --git a/docs-site/content/api/demos/raw-state.ts b/docs-site/content/api/demos/raw-state.ts new file mode 100644 index 0000000..96562aa --- /dev/null +++ b/docs-site/content/api/demos/raw-state.ts @@ -0,0 +1,53 @@ +import { computed, html, isRaw, isRef, markRaw, ref } from 'regor' + +export function createRawState(interactive = false) { + const resource = markRaw({ label: 'External resource' }) + const state = ref({ resource, title: 'Reactive title' }) + return { + interactive, + state, + rawCheck: isRaw(resource), + sameObject: state().resource === resource, + nestedIsRef: isRef(resource.label), + snapshot: computed(() => state().title()), + } +} + +export const rawStateTemplate = html`
+
+ +

+ The marked resource keeps its identity and its plain fields during deep + conversion. +

+
+
+ CONVERSION BOUNDARY +
+
+
isRaw(resource)
+
{{ rawCheck }}
+
+
+
Same resource object
+
{{ sameObject }}
+
+
+
isRef(resource.label)
+
{{ nestedIsRef }}
+
+
+
Reactive title
+
{{ snapshot }}
+
+
+
+
` diff --git a/docs-site/content/api/demos/registry.ts b/docs-site/content/api/demos/registry.ts new file mode 100644 index 0000000..8308c93 --- /dev/null +++ b/docs-site/content/api/demos/registry.ts @@ -0,0 +1,49 @@ +import { ContextRegistry, html, ref } from 'regor' + +class Workspace { + constructor(readonly name: string) {} +} + +export function createRegistry(interactive = false) { + const registry = new ContextRegistry() + const name = ref('Regor Studio'), + resolved = ref('Nothing registered yet.') + const register = () => { + registry.register(new Workspace(name())) + resolved(registry.require(Workspace).name) + } + const clear = () => { + registry.unregisterByClass(Workspace) + resolved(registry.find(Workspace)?.name ?? 'Nothing registered yet.') + } + return { interactive, name, resolved, register, clear } +} + +export const registryTemplate = html`
+
+ +
+ +
+
+
+ RESOLVED BY CLASS{{ resolved }} +

+ The registry stores an instance. Editing the draft alone does not replace + it. +

+
+
` diff --git a/docs-site/content/api/demos/state.ts b/docs-site/content/api/demos/state.ts new file mode 100644 index 0000000..f802fd4 --- /dev/null +++ b/docs-site/content/api/demos/state.ts @@ -0,0 +1,81 @@ +import { + computed, + cref, + flatten, + html, + isDeepRef, + isRef, + ref, + sref, + unref, +} from 'regor' + +export function createState(interactive = false) { + const original = { profile: { name: 'Ada' } } + const deep = ref({ profile: { name: 'Ada' } }) + const copied = cref(original) + const shallow = sref({ profile: { name: 'Ada' } }) + const name = ref('Grace') + const apply = () => { + deep().profile().name(name()) + copied().profile().name(name()) + shallow({ profile: { name: name() } }) + } + return { + interactive, + name, + deep, + copied, + shallow, + apply, + originalName: original.profile.name, + snapshot: computed(() => JSON.stringify(flatten(deep()), null, 2)), + refCheck: isRef(deep), + deepCheck: isDeepRef(deep), + shallowCheck: isDeepRef(shallow), + plainName: computed(() => unref(deep().profile().name)), + } +} + +export const stateTemplate = html`
+
+ +
+
+
+ REF / DEEP{{ deep.profile.name }} +

Nested properties are refs.

+
+
+ CREF / COPY FIRST{{ copied.profile.name }} +

Original still says {{ originalName }}.

+
+
+ SREF / SHALLOW{{ shallow.profile.name }} +

Replace the plain object to notify.

+
+
+
+
+
isRef(deep) / isDeepRef(deep)
+
{{ refCheck }} / {{ deepCheck }}
+
+
+
isDeepRef(shallow) / unref(name)
+
{{ shallowCheck }} / {{ plainName }}
+
+
+

+
` diff --git a/docs-site/content/api/demos/templates.ts b/docs-site/content/api/demos/templates.ts new file mode 100644 index 0000000..37faa32 --- /dev/null +++ b/docs-site/content/api/demos/templates.ts @@ -0,0 +1,69 @@ +import { + computed, + html, + raw, + ref, + svg, + toFragment, + toJsonTemplate, +} from 'regor' + +export function createTemplates(interactive = false) { + const message = ref('Hello, Regor') + const json = computed(() => ({ t: 'p', c: [{ d: message() }] })) + const serialized = computed(() => JSON.stringify(json(), null, 2)) + const tagged = computed(() => html`

${message()}

`) + const rawTagged = computed(() => raw`

${message()}

`) + const svgTagged = svg`` + const roundTrip = ref('Convert the JSON to a fragment, then back to JSON.') + const convert = () => { + const fragment = toFragment(json()) + const element = fragment.firstElementChild! + roundTrip(JSON.stringify(toJsonTemplate(element), null, 2)) + } + return { + interactive, + message, + serialized, + tagged, + rawTagged, + svgTagged, + roundTrip, + convert, + } +} + +export const templatesTemplate = html`
+
+ +
+
+
+ HTML / RAW TAGS +

+      

raw produces the same string: {{ tagged === rawTagged }}

+ SVG TAG +

+    
+
+ JSON TEMPLATE +

+      ROUND TRIP
+      

+    
+
+

+ Generated strings are shown as text. Tagged templates assemble strings; they + do not sanitize interpolated values. +

+
` diff --git a/docs-site/content/api/demos/validation.ts b/docs-site/content/api/demos/validation.ts new file mode 100644 index 0000000..804dabf --- /dev/null +++ b/docs-site/content/api/demos/validation.ts @@ -0,0 +1,53 @@ +import { defineComponent, html, pval, ref } from 'regor' + +export function createValidation(interactive = false) { + const ValidatorField = defineComponent( + html`
+
+ +
+

{{ result }}

+

+ Validators check runtime types. They do not coerce a string into a + number. +

+
`, + { + context: (head) => { + const text = ref('12'), + asNumber = ref(true), + result = ref('Validate the candidate to see its runtime contract.') + const validate = () => { + try { + pval.isNumber(asNumber() ? Number(text()) : text(), 'count', head) + result('Valid: count is a number.') + } catch (error) { + result(error instanceof Error ? error.message : String(error)) + } + } + return { interactive, text, asNumber, result, validate } + }, + }, + ) + return { interactive, components: { ValidatorField } } +} + +export const validationTemplate = html`` diff --git a/docs-site/content/api/demos/warnings-example.ts b/docs-site/content/api/demos/warnings-example.ts new file mode 100644 index 0000000..01fec89 --- /dev/null +++ b/docs-site/content/api/demos/warnings-example.ts @@ -0,0 +1,10 @@ +import { warningHandler } from 'regor' + +// Installing a handler affects all Regor apps using this module instance. +export function installWarningHandler(handler: typeof warningHandler.warning) { + const previous = warningHandler.warning + warningHandler.warning = handler + return () => { + warningHandler.warning = previous + } +} diff --git a/docs-site/content/api/drainUnbind.md b/docs-site/content/api/drainUnbind.md deleted file mode 100644 index 01de715..0000000 --- a/docs-site/content/api/drainUnbind.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: drainUnbind ---- - -## Overview - -`drainUnbind` flushes Regor's pending unbind queue immediately. - -Regor defers some unbind work after `removeNode(...)` for better runtime behavior. Use `drainUnbind()` when you need deterministic cleanup timing. - -## Usage - -```ts -import { createApp, drainUnbind, html, ref } from 'regor' - -const root = document.createElement('div') -const show = ref(true) - -const app = createApp({ - template: html`
Hello
`, - setup: { show }, -}) - -app.mount(root) -show(false) // schedules node removal + deferred unbind - -await drainUnbind() // force pending unbind cleanup now -``` - -## Signature - -```ts -drainUnbind(): Promise -``` - -## Notes - -- Safe to call when there is nothing pending. -- Useful in tests when you need cleanup completed before assertions. -- Complements `removeNode` and `unbind`; it does not replace app lifecycle (`app.unmount()`). - -## See Also - -- [removeNode](/api/removeNode) -- [unbind](/api/unbind) -- [addUnbinder](/api/addUnbinder) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/drainUnbind.mdx b/docs-site/content/api/drainUnbind.mdx new file mode 100644 index 0000000..7a74fff --- /dev/null +++ b/docs-site/content/api/drainUnbind.mdx @@ -0,0 +1,71 @@ +--- +title: drainUnbind +description: "Flush the pending unbind queue after nodes have been removed." +--- + +drainUnbindCleanup and Unbind

Flush the pending unbind queue after nodes have been removed.

+ +## Overview + +`drainUnbind` flushes Regor's pending unbind queue immediately. + +Regor defers some unbind work after `removeNode(...)` for better runtime behavior. Use `drainUnbind()` when you need deterministic cleanup timing. + +## Try it live + +
+
Own a node through its full lifetimeLive API
+ +
+ + +
+

Mount, write, unbind, or remove and drain. Watch the DOM, observer count, and registered cleanup.

+
+ +## Usage + +```ts +import { createApp, drainUnbind, html, ref } from 'regor' + +const root = document.createElement('div') +const show = ref(true) + +const app = createApp({ + template: html`
Hello
`, + setup: { show }, +}) + +app.mount(root) +show(false) // schedules node removal + deferred unbind + +await drainUnbind() // force pending unbind cleanup now +``` + +## Signature + +```ts +drainUnbind(): Promise +``` + +

Await drainUnbind in checks or integrations that depend on the deferred queue being empty.

+ +## Notes + +- Safe to call when there is nothing pending. +- Useful in tests when you need cleanup completed before assertions. +- Complements `removeNode` and `unbind`; it does not replace app lifecycle (`app.unmount()`). + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/endBatch.md b/docs-site/content/api/endBatch.md deleted file mode 100644 index ef34ca0..0000000 --- a/docs-site/content/api/endBatch.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: endBatch ---- - -## Overview - -The `endBatch` function is used in conjunction with the `startBatch`function to end a batch of ref updates and notify observers of the changes made during the batch. Batching ref updates using `startBatch` and `endBatch` can improve application performance by reducing the number of observer notifications and triggers during a series of updates. - -## Usage - -### Ending a Batch - -To end a batch of ref updates, call the `endBatch` function. When a batch is ended, observers are notified of the changes made to refs during the batch, but this notification is performed only once, optimizing performance. - -```ts -import { batch, startBatch, endBatch, ref } from 'regor' - -const myRef1 = ref(5) -const myRef2 = ref(10) - -startBatch() // Start a batch - -myRef1.value = 15 -myRef2.value = 20 - -endBatch() // End the batch and notify observers - -// Observers are notified only once at the end of the batch -// Outputs: -// Observer triggered: 20 -``` - -## Notes - -- The `endBatch` function is used in conjunction with the `startBatch` function to finalize a batch of ref updates. It ensures that observers are notified of the ref changes made during the batch in an optimized manner, reducing unnecessary notifications. - -- Batching updates with `startBatch` and `endBatch` can significantly improve the performance of your application, especially when multiple changes are made to refs in rapid succession. It minimizes the number of observer notifications and triggers. - -- It's important to call the `endBatch` function to conclude a batch and ensure that observers are informed of the changes made during the batch. - -- Important: When using the batch functions, keep in mind that reads of refs within the batch can return potentially stale or outdated values due to pausing auto-updates. Ensure that your code logic accounts for this situation when reading refs within a batch. - -## See Also - -- [`startBatch`](/api/startBatch) -- [`batch`](/api/batch) -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/endBatch.mdx b/docs-site/content/api/endBatch.mdx new file mode 100644 index 0000000..34b5f0e --- /dev/null +++ b/docs-site/content/api/endBatch.mdx @@ -0,0 +1,74 @@ +--- +title: endBatch +description: "Close a manual batch and flush notifications when the outer batch ends." +--- + +endBatchObservation and Batch

Close a manual batch and flush notifications when the outer batch ends.

+ +## Overview + +The `endBatch` function is used in conjunction with the `startBatch`function to end a batch of ref updates and notify observers of the changes made during the batch. Batching ref updates using `startBatch` and `endBatch` can improve application performance by reducing the number of observer notifications and triggers during a series of updates. + +## Try it live + +
+
Same writes, different notification countsLive API
+ +
+ + +
+

Each action adds three to one ref. Compare plain writes, batch, and a manual start/end pair.

+
+ +## Usage + +### Ending a Batch + +To end a batch of ref updates, call the `endBatch` function. When a batch is ended, observers are notified of the changes made to refs during the batch, but this notification is performed only once, optimizing performance. + +```ts +import { batch, startBatch, endBatch, ref } from 'regor' + +const myRef1 = ref(5) +const myRef2 = ref(10) + +startBatch() // Start a batch + +myRef1.value = 15 +myRef2.value = 20 + +endBatch() // End the batch and notify observers + +// Observers are notified only once at the end of the batch +// Outputs: +// Observer triggered: 20 +``` + +

Prefer batch for a callback-sized update. Use a manual pair only when it makes ownership clearer.

+ +## Notes + +- The `endBatch` function is used in conjunction with the `startBatch` function to finalize a batch of ref updates. It ensures that observers are notified of the ref changes made during the batch in an optimized manner, reducing unnecessary notifications. + +- Batching updates with `startBatch` and `endBatch` can significantly improve the performance of your application, especially when multiple changes are made to refs in rapid succession. It minimizes the number of observer notifications and triggers. + +- It's important to call the `endBatch` function to conclude a batch and ensure that observers are informed of the changes made during the batch. + +- Important: When using the batch functions, keep in mind that reads of refs within the batch can return potentially stale or outdated values due to pausing auto-updates. Ensure that your code logic accounts for this situation when reading refs within a batch. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/entangle.md b/docs-site/content/api/entangle.md deleted file mode 100644 index 82e4c9c..0000000 --- a/docs-site/content/api/entangle.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: entangle ---- - -## Overview - -The `entangle` function allows you to create a bidirectional link between two refs, ensuring that changes in one ref are mirrored in the other. This bidirectional linking is particularly useful when you want two refs to always have the same value. - -## Usage - -### Creating a Bidirectional Link - -To create a bidirectional link between two refs, simply call the `entangle` function with the two refs as arguments. After calling `entangle`, any changes made to one ref will be automatically reflected in the other. - -```ts -import { entangle, ref } from 'regor' - -const ref1 = ref(5) -const ref2 = ref(10) - -const stopEntangle = entangle(ref1, ref2) - -console.log(ref1.value) // Outputs: 5 -console.log(ref2.value) // Outputs: 5 - -ref1.value = 15 // Both refs are updated -console.log(ref1.value) // Outputs: 15 -console.log(ref2.value) // Outputs: 15 - -stopEntangle() // Stop the bidirectional linking -``` - -## Parameters - -- `r1`: The first ref that you want to entangle. -- `r2`: The second ref that you want to entangle. - -## Return Value - -- The `entangle` function returns a function that, when called, stops the bidirectional linking between the two refs. - -## Notes - -- Changes made to either of the entangled refs will be automatically reflected in the other, ensuring that they always have the same value. - -- It's important to call the returned function to stop the bidirectional linking when you no longer need it to prevent unintended updates. - -- Circular entanglements, where ref1 and ref2 form a circular dependency, should be avoided, as they can lead to infinite loops and unpredictable behavior. - -## Example - -```ts -import { entangle, ref } from 'regor' - -const ref1 = ref(5) -const ref2 = ref(10) - -const stopEntangle = entangle(ref1, ref2) - -console.log(ref1.value) // Outputs: 5 -console.log(ref2.value) // Outputs: 5 - -ref1.value = 15 // Both refs are updated -console.log(ref1.value) // Outputs: 15 -console.log(ref2.value) // Outputs: 15 - -stopEntangle() // Stop the bidirectional linking -``` - -## See Also - -- [`ref`](/api/ref) -- [`sref`](/api/ref) -- [`observe`](/api/observe) -- [`observeMany`](/api/observeMany) -- [`unref`](/api/unref) -- [`isRef`](/api/isRef) -- [`isDeepRef`](/api/isDeepRef) -- [`computeRef`](/api/computeRef) -- [`watchEffect`](/api/watchEffect) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/entangle.mdx b/docs-site/content/api/entangle.mdx new file mode 100644 index 0000000..8689d6f --- /dev/null +++ b/docs-site/content/api/entangle.mdx @@ -0,0 +1,105 @@ +--- +title: entangle +description: "Link two writable refs in both directions and return a function to disconnect them." +--- + +entangleReactivity

Link two writable refs in both directions and return a function to disconnect them.

+ +## Overview + +The `entangle` function allows you to create a bidirectional link between two refs, ensuring that changes in one ref are mirrored in the other. This bidirectional linking is particularly useful when you want two refs to always have the same value. + +## Try it live + +
+
Two refs, one shared valueLive API
+ +
+ + +
+

Edit either side while the link is active. Disconnect it to make the refs independent.

+
+ +## Usage + +### Creating a Bidirectional Link + +To create a bidirectional link between two refs, simply call the `entangle` function with the two refs as arguments. After calling `entangle`, any changes made to one ref will be automatically reflected in the other. + +```ts +import { entangle, ref } from 'regor' + +const ref1 = ref(5) +const ref2 = ref(10) + +const stopEntangle = entangle(ref1, ref2) + +console.log(ref1.value) // Outputs: 5 +console.log(ref2.value) // Outputs: 5 + +ref1.value = 15 // Both refs are updated +console.log(ref1.value) // Outputs: 15 +console.log(ref2.value) // Outputs: 15 + +stopEntangle() // Stop the bidirectional linking +``` + +## Parameters + +- `r1`: The first ref that you want to entangle. +- `r2`: The second ref that you want to entangle. + +## Return Value + +- The `entangle` function returns a function that, when called, stops the bidirectional linking between the two refs. + +

Keep the returned stop function when a two-way link should end before its owner unmounts.

+ +## Notes + +- Changes made to either of the entangled refs will be automatically reflected in the other, ensuring that they always have the same value. + +- It's important to call the returned function to stop the bidirectional linking when you no longer need it to prevent unintended updates. + +- Circular entanglements, where ref1 and ref2 form a circular dependency, should be avoided, as they can lead to infinite loops and unpredictable behavior. + +## Example + +```ts +import { entangle, ref } from 'regor' + +const ref1 = ref(5) +const ref2 = ref(10) + +const stopEntangle = entangle(ref1, ref2) + +console.log(ref1.value) // Outputs: 5 +console.log(ref2.value) // Outputs: 5 + +ref1.value = 15 // Both refs are updated +console.log(ref1.value) // Outputs: 15 +console.log(ref2.value) // Outputs: 15 + +stopEntangle() // Stop the bidirectional linking +``` + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/flatten.md b/docs-site/content/api/flatten.md deleted file mode 100644 index bf662a4..0000000 --- a/docs-site/content/api/flatten.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: flatten ---- - -## Overview - -The `flatten` function recursively traverses a nested structure, such as an object, array, set, or map, and returns a flattened version of the structure. This means that it removes any nested references and produces a structure containing no refs. - -## Usage - -### Flattening Nested Structures - -To flatten a nested structure, simply pass the reference to the `flatten` function. It will return a new structure with all nested references removed. - -```ts -import { flatten, ref } from 'regor' - -const nestedData = { - name: 'John', - age: ref(30), - hobbies: ['reading', 'swimming', ref('drawing')], -} - -const flattenedData = flatten(nestedData) - -console.log(flattenedData) -// Outputs: { name: 'John', age: 30, hobbies: [ 'reading', 'swimming', 'drawing' ] } -``` - -## Parameters - -- `reference`: The nested structure (object, array, set, map) that you want to flatten. It can contain nested refs, which will be resolved during flattening. - -## Return Value - -- The `flatten` function returns a new structure that is a flattened version of the input `reference`. Any nested refs within the structure are resolved, resulting in a single-level structure. - -## Notes - -- The `flatten` function recursively flattens nested structures, including arrays, sets, maps, and objects. - -- If the input `reference` contains refs, they are automatically unrefed during flattening, and their values are included in the flattened structure. - -- Circular references within the input `reference` are not supported, and attempting to flatten such structures may result in unexpected behavior. - -## Example - -```ts -import { flatten, ref } from 'regor' - -const nestedData = { - name: 'John', - age: ref(30), - hobbies: ['reading', 'swimming', ref('drawing')], -} - -const flattenedData = flatten(nestedData) - -console.log(flattenedData) -// Outputs: { name: 'John', age: 30, hobbies: [ 'reading', 'swimming', 'drawing' ] } -``` - -## See Also - -- [`ref`](/api/ref) -- [`cref`](/api/cref) -- [`sref`](/api/sref) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`observe`](/api/observe) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/flatten.mdx b/docs-site/content/api/flatten.mdx new file mode 100644 index 0000000..913fee9 --- /dev/null +++ b/docs-site/content/api/flatten.mdx @@ -0,0 +1,102 @@ +--- +title: flatten +description: "Unwrap a nested reactive structure into plain values." +--- + +flattenUtilities

Unwrap a nested reactive structure into plain values.

+ +## Overview + +The `flatten` function recursively traverses a nested structure, such as an object, array, set, or map, and returns a flattened version of the structure. This means that it removes any nested references and produces a structure containing no refs. + +## Try it live + +
+
Compare deep, copied, and shallow stateLive API
+ +
+ + +
+

Change the name and apply it. Inspect the nested values, ref checks, and flattened snapshot.

+
+ +## Usage + +### Flattening Nested Structures + +To flatten a nested structure, simply pass the reference to the `flatten` function. It will return a new structure with all nested references removed. + +```ts +import { flatten, ref } from 'regor' + +const nestedData = { + name: 'John', + age: ref(30), + hobbies: ['reading', 'swimming', ref('drawing')], +} + +const flattenedData = flatten(nestedData) + +console.log(flattenedData) +// Outputs: { name: 'John', age: 30, hobbies: [ 'reading', 'swimming', 'drawing' ] } +``` + +## Parameters + +- `reference`: The nested structure (object, array, set, map) that you want to flatten. It can contain nested refs, which will be resolved during flattening. + +## Return Value + +- The `flatten` function returns a new structure that is a flattened version of the input `reference`. Any nested refs within the structure are resolved, resulting in a single-level structure. + +

Use a plain snapshot for serialization or external code that should not receive refs.

+ +## Notes + +- The `flatten` function recursively flattens nested structures, including arrays, sets, maps, and objects. + +- If the input `reference` contains refs, they are automatically unrefed during flattening, and their values are included in the flattened structure. + +- Circular references within the input `reference` are not supported, and attempting to flatten such structures may result in unexpected behavior. + +## Example + +```ts +import { flatten, ref } from 'regor' + +const nestedData = { + name: 'John', + age: ref(30), + hobbies: ['reading', 'swimming', ref('drawing')], +} + +const flattenedData = flatten(nestedData) + +console.log(flattenedData) +// Outputs: { name: 'John', age: 30, hobbies: [ 'reading', 'swimming', 'drawing' ] } +``` + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/getBindData.md b/docs-site/content/api/getBindData.mdx similarity index 50% rename from docs-site/content/api/getBindData.md rename to docs-site/content/api/getBindData.mdx index f7a9245..6d66729 100644 --- a/docs-site/content/api/getBindData.md +++ b/docs-site/content/api/getBindData.mdx @@ -1,11 +1,26 @@ --- title: getBindData +description: "Access or initialize the binding metadata associated with a node." --- +getBindDataCleanup and Unbind

Access or initialize the binding metadata associated with a node.

+ ## Overview The `getBindData` function is used to retrieve or create a BindData object associated with a DOM node. The BindData object contains information about bound data and associated unbinders for Regor. +## Try it live + +
+
Own a node through its full lifetimeLive API
+ +
+ + +
+

Mount, write, unbind, or remove and drain. Watch the DOM, observer count, and registered cleanup.

+
+ ## Usage ### Retrieving or Creating BindData @@ -38,6 +53,8 @@ The `getBindData` function returns a `BindData` object associated with the provi - `data`: A record of bound data, where keys represent data properties, and values represent the associated data. +

Inspect metadata deliberately. Prefer app handles and lifecycle hooks for ordinary ownership and cleanup.

+ ## Notes - The `getBindData` function is typically used internally within Regor to manage bound data and unbinders associated with DOM nodes. @@ -52,8 +69,14 @@ The `getBindData` function returns a `BindData` object associated with the provi ## See Also -- [addUnbinder](/api/addUnbinder) -- [removeNode](/api/removeNode) -- [unbind](/api/unbind) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/html.md b/docs-site/content/api/html.md deleted file mode 100644 index 256db4f..0000000 --- a/docs-site/content/api/html.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: html ---- - -## Overview - -The `html` function in Regor is a utility function for creating HTML strings using template literals and interpolating values into the resulting string. It is commonly used to generate HTML content dynamically within Regor components. - -## Usage - -### Creating HTML Strings - -The `html` function takes two parameters: - -- `templates` (TemplateStringsArray): An array of string literals representing the static parts of the HTML template. - -- `...args` (any[]): Any number of additional arguments that will be interpolated into the template to generate the dynamic parts of the HTML. - -### Example - -```javascript -import { html } from 'regor' - -// Create an HTML string with dynamic content -const name = 'John' -const age = 30 -const htmlString = html`

- Hello, my name is ${name} and I am ${age} years old. -

` - -// The resulting HTML string: -// "

Hello, my name is John and I am 30 years old.

" -``` - -## Parameters - -- `templates` (TemplateStringsArray): An array of string literals representing the static parts of the HTML template. - -- `...args` (any[]): Any number of additional arguments that will be interpolated into the template to generate the dynamic parts of the HTML. - -## Return Value - -- Returns a string that represents the HTML content generated by interpolating the template literals and values provided in the `args` array. - -## Notes - -- The `html` function is useful for creating HTML strings with dynamic content, such as when generating HTML markup for Regor components or templates. - -- It uses JavaScript's template literal syntax to define the static parts of the HTML template and interpolates values into the template using `${...}` placeholders. - -- The resulting HTML string can be directly used in your Regor components or inserted into the DOM as needed. - -- In Regor, this function is commonly used in conjunction with template rendering and component creation to generate HTML content. - -## See Also - -- [raw](/api/raw) -- [svg](/api/svg) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/html.mdx b/docs-site/content/api/html.mdx new file mode 100644 index 0000000..48f846e --- /dev/null +++ b/docs-site/content/api/html.mdx @@ -0,0 +1,83 @@ +--- +title: html +description: "Assemble a template string with a JavaScript tagged template literal." +--- + +htmlUtilities

Assemble a template string with a JavaScript tagged template literal.

+ +## Overview + +The `html` function in Regor is a utility function for creating HTML strings using template literals and interpolating values into the resulting string. It is commonly used to generate HTML content dynamically within Regor components. + +## Try it live + +
+
From strings to structured DOMLive API
+ +
+ + +
+

Edit the text, then convert a JSON template into a detached fragment and serialize its element back to JSON.

+
+ +## Usage + +### Creating HTML Strings + +The `html` function takes two parameters: + +- `templates` (TemplateStringsArray): An array of string literals representing the static parts of the HTML template. + +- `...args` (any[]): Any number of additional arguments that will be interpolated into the template to generate the dynamic parts of the HTML. + +### Example + +```javascript +import { html } from 'regor' + +// Create an HTML string with dynamic content +const name = 'John' +const age = 30 +const htmlString = html`

+ Hello, my name is ${name} and I am ${age} years old. +

` + +// The resulting HTML string: +// "

Hello, my name is John and I am 30 years old.

" +``` + +## Parameters + +- `templates` (TemplateStringsArray): An array of string literals representing the static parts of the HTML template. + +- `...args` (any[]): Any number of additional arguments that will be interpolated into the template to generate the dynamic parts of the HTML. + +## Return Value + +- Returns a string that represents the HTML content generated by interpolating the template literals and values provided in the `args` array. + +

JavaScript interpolation runs when the string is assembled. Regor expressions such as {{ message }} are bound when the template mounts.

+ +## Notes + +- The `html` function is useful for creating HTML strings with dynamic content, such as when generating HTML markup for Regor components or templates. + +- It uses JavaScript's template literal syntax to define the static parts of the HTML template and interpolates values into the template using `${...}` placeholders. + +- The resulting HTML string can be directly used in your Regor components or inserted into the DOM as needed. + +- In Regor, this function is commonly used in conjunction with template rendering and component creation to generate HTML content. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/index.md b/docs-site/content/api/index.md deleted file mode 100644 index 58ec25e..0000000 --- a/docs-site/content/api/index.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Regor API -order: 6 ---- - -This section contains the function-level reference for Regor. - -Use this page as an index, then open each API page for signature details and examples. - -## App and Components - -1. [`createApp`](/api/createApp) -2. [`defineComponent`](/api/defineComponent) -3. [`pval`](/api/pval) -4. [`toFragment`](/api/toFragment) -5. [`toJsonTemplate`](/api/toJsonTemplate) -6. [`RegorConfig`](/api/regorConfig) - -## Reactivity - -1. [`ref`](/api/ref) -2. [`cref`](/api/cref) -3. [`sref`](/api/sref) -4. [`isRef`](/api/isRef) -5. [`isDeepRef`](/api/isDeepRef) -6. [`unref`](/api/unref) -7. [`pause`](/api/pause) -8. [`resume`](/api/resume) -9. [`trigger`](/api/trigger) -10. [`entangle`](/api/entangle) - -## Computed and Effects - -1. [`computed`](/api/computed) -2. [`computeRef`](/api/computeRef) -3. [`computeMany`](/api/computeMany) -4. [`watchEffect`](/api/watchEffect) -5. [`collectRefs`](/api/collectRefs) -6. [`silence`](/api/silence) - -## Observation and Batch - -1. [`observe`](/api/observe) -2. [`observeMany`](/api/observeMany) -3. [`observerCount`](/api/observerCount) -4. [`batch`](/api/batch) -5. [`startBatch`](/api/startBatch) -6. [`endBatch`](/api/endBatch) - -## Lifecycle and Scope - -1. [`useScope`](/api/useScope) -2. [`onMounted`](/api/onMounted) -3. [`onUnmounted`](/api/onUnmounted) -4. [`contextRegistry`](/api/contextRegistry) - -## Cleanup and Unbind - -1. [`addUnbinder`](/api/addUnbinder) -2. [`getBindData`](/api/getBindData) -3. [`removeNode`](/api/removeNode) -4. [`unbind`](/api/unbind) -5. [`drainUnbind`](/api/drainUnbind) - -## Utilities - -1. [`flatten`](/api/flatten) -2. [`markRaw`](/api/markRaw) -3. [`isRaw`](/api/isRaw) -4. [`persist`](/api/persist) -5. [`html`](/api/html) -6. [`raw`](/api/raw) -7. [`svg`](/api/svg) - -## Logging - -1. [`warningHandler`](/api/warningHandler) - -## Recommendation - -Start with: - -1. [`createApp`](/api/createApp) -2. [`ref`](/api/ref) -3. [`cref`](/api/cref) -4. [`sref`](/api/sref) -5. [`computed`](/api/computed) -6. [`watchEffect`](/api/watchEffect) diff --git a/docs-site/content/api/index.mdx b/docs-site/content/api/index.mdx new file mode 100644 index 0000000..1d13013 --- /dev/null +++ b/docs-site/content/api/index.mdx @@ -0,0 +1,124 @@ +--- +title: Regor API +description: "Find the API by purpose, try it live, and inspect the code behind its behavior." +order: 6 +--- + +This section contains the function-level reference for Regor. + +Use this page as an index, then open each API page for signature details and examples. + +45 APIs8 categoriesLive examples

Start with an app and writable state. Then choose the APIs for derivation, observation, composition, and cleanup.

+ +App and ComponentsReactivityComputed and EffectsObservation and BatchLifecycle and ScopeCleanup and UnbindUtilitiesLogging + +## Try it live + +
+
Three ways to derive a valueLive API
+ +
+ + +
+

Move either slider. The three read-only outputs use computed, computeRef, and computeMany.

+
+ + +## App and Components + + +

createApp

Mount a context on existing DOM or supply a template for a reactive island.

Explore createApp
+

defineComponent

Define a reusable template with a context factory, props, and slots.

Explore defineComponent
+

pval

Validate component inputs at runtime with composable type and shape validators.

Explore pval
+

toFragment

Build a DocumentFragment from a JSON template describing HTML or SVG.

Explore toFragment
+

toJsonTemplate

Convert DOM elements into JSON templates for inspection or later rendering.

Explore toJsonTemplate
+

RegorConfig

Configure an app’s directives, global context, interpolation, and validation policy.

Explore regorConfig
+
+ +## Reactivity + + +

ref

Create writable state and recursively convert nested object and array fields to refs.

Explore ref
+

cref

Copy a structure before deep conversion so the original data remains unchanged.

Explore cref
+

sref

Hold shallow writable state and replace plain object values to notify bindings.

Explore sref
+

isRef

Check whether a value is a Regor reactive reference.

Explore isRef
+

isDeepRef

Check whether a value carries Regor’s deep-ref marker.

Explore isDeepRef
+

unref

Read one ref layer, or return a non-ref value unchanged.

Explore unref
+

pause

Pause automatic notifications from a ref while retaining its stored value.

Explore pause
+

resume

Resume a ref’s notification behavior after a pause.

Explore resume
+

trigger

Notify a ref’s observers explicitly, with optional recursive triggering.

Explore trigger
+

entangle

Link two writable refs in both directions and return a function to disconnect them.

Explore entangle
+
+ +## Computed and Effects + + +

computed

Derive a read-only value by tracking the refs read during a computation.

Explore computed
+

computeRef

Derive a read-only result from one explicit source ref.

Explore computeRef
+

computeMany

Derive a read-only result from an explicit list of source refs.

Explore computeMany
+

watchEffect

Run an effect immediately, then rerun it when the refs it reads change.

Explore watchEffect
+

collectRefs

Run an action and return both its result and the refs collected during its reads.

Explore collectRefs
+

silence

Exclude an action’s ref reads from active dependency collection.

Explore silence
+
+ +## Observation and Batch + + +

observe

Subscribe to one ref and stop the subscription with the returned function.

Explore observe
+

observeMany

Subscribe to multiple refs and receive their current values in one callback.

Explore observeMany
+

observerCount

Inspect how many observer callbacks are registered on a ref.

Explore observerCount
+

batch

Group synchronous ref writes and flush their notifications after the callback.

Explore batch
+

startBatch

Start a manual notification batch to be closed with endBatch.

Explore startBatch
+

endBatch

Close a manual batch and flush notifications when the outer batch ends.

Explore endBatch
+
+ +## Lifecycle and Scope + + +

useScope

Create a context with owned effects and lifecycle cleanup.

Explore useScope
+

onMounted

Register setup that runs when its owning app or component mounts.

Explore onMounted
+

onUnmounted

Register cleanup for resources owned by an app, component, or scope.

Explore onUnmounted
+

ContextRegistry

Register context instances and resolve them by their runtime class.

Explore contextRegistry
+
+ +## Cleanup and Unbind + + +

addUnbinder

Associate a cleanup callback with a DOM node’s binding lifetime.

Explore addUnbinder
+

getBindData

Access or initialize the binding metadata associated with a node.

Explore getBindData
+

removeNode

Remove a node and schedule cleanup of its bindings.

Explore removeNode
+

unbind

Stop a node’s bindings and descendant listeners while retaining the DOM.

Explore unbind
+

drainUnbind

Flush the pending unbind queue after nodes have been removed.

Explore drainUnbind
+
+ +## Utilities + + +

flatten

Unwrap a nested reactive structure into plain values.

Explore flatten
+

markRaw

Mark an object so deep conversion keeps its identity and plain fields.

Explore markRaw
+

isRaw

Check whether an object has been marked to skip deep conversion.

Explore isRaw
+

persist

Associate a ref with a localStorage key and restore its saved value.

Explore persist
+

html

Assemble a template string with a JavaScript tagged template literal.

Explore html
+

raw

Use the html tag’s string-assembly behavior under its raw alias.

Explore raw
+

svg

Assemble an SVG template string with the same tag behavior as html.

Explore svg
+
+ +## Logging + + +

warningHandler

Customize Regor’s warning handling and retain a way to restore the previous handler.

Explore warningHandler
+
+ +## Recommendation + +Start with: + +1. [`createApp`](/api/createApp) +2. [`ref`](/api/ref) +3. [`cref`](/api/cref) +4. [`sref`](/api/sref) +5. [`computed`](/api/computed) +6. [`watchEffect`](/api/watchEffect) + + diff --git a/docs-site/content/api/isDeepRef.md b/docs-site/content/api/isDeepRef.md deleted file mode 100644 index c632b9d..0000000 --- a/docs-site/content/api/isDeepRef.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: isDeepRef ---- - -## Overview - -The `isDeepRef` function determines whether a given value is a deep ref object, indicating that it has been deeply converted into a ref object using `ref` or `cref`. - -## Usage - -### Checking for Deep Ref - -To check if a value is a deep ref, you can use the `isDeepRef` function. - -```ts -import { isDeepRef } from 'regor' - -const myValue = /* Your value here */ - -if (isDeepRef(myValue)) { - console.log('The value is a deep ref.') -} else { - console.log('The value is not a deep ref.') -} -``` - -## Parameters - -- `value`: The value you want to check for being a deep ref object. - -## Return Value - -- The `isDeepRef` function returns `true` if the provided `value` is a deep ref object, and `false` otherwise. - -## Example - -```ts -import { isDeepRef } from 'regor' - -const deepRefValue = /* A deep ref value created using ref or cref */ - -if (isDeepRef(deepRefValue)) { - console.log('This value is a deep ref object.') -} else { - console.log('This value is not a deep ref object.') -} -``` - -## See Also - -- [`ref`](/api/ref) -- [`cref`](/api/cref) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`observe`](/api/observe) -- [`sref`](/api/sref) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/isDeepRef.mdx b/docs-site/content/api/isDeepRef.mdx new file mode 100644 index 0000000..b4b4d2f --- /dev/null +++ b/docs-site/content/api/isDeepRef.mdx @@ -0,0 +1,86 @@ +--- +title: isDeepRef +description: "Check whether a value carries Regor’s deep-ref marker." +--- + +isDeepRefReactivity

Check whether a value carries Regor’s deep-ref marker.

+ +## Overview + +The `isDeepRef` function determines whether a given value is a deep ref object, indicating that it has been deeply converted into a ref object using `ref` or `cref`. + +## Try it live + +
+
Compare deep, copied, and shallow stateLive API
+ +
+ + +
+

Change the name and apply it. Inspect the nested values, ref checks, and flattened snapshot.

+
+ +## Usage + +### Checking for Deep Ref + +To check if a value is a deep ref, you can use the `isDeepRef` function. + +```ts +import { isDeepRef } from 'regor' + +const myValue = /* Your value here */ + +if (isDeepRef(myValue)) { + console.log('The value is a deep ref.') +} else { + console.log('The value is not a deep ref.') +} +``` + +## Parameters + +- `value`: The value you want to check for being a deep ref object. + +## Return Value + +- The `isDeepRef` function returns `true` if the provided `value` is a deep ref object, and `false` otherwise. + +## Example + +```ts +import { isDeepRef } from 'regor' + +const deepRefValue = /* A deep ref value created using ref or cref */ + +if (isDeepRef(deepRefValue)) { + console.log('This value is a deep ref object.') +} else { + console.log('This value is not a deep ref object.') +} +``` + +

Both are callable refs, but their handling of nested plain values differs.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/isRaw.md b/docs-site/content/api/isRaw.md deleted file mode 100644 index 609eb5d..0000000 --- a/docs-site/content/api/isRaw.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: isRaw ---- - -## Overview - -The `isRaw` function determines whether a given value has been marked as "raw" using the `markRaw` function, indicating that it should not be deeply converted into a deep ref when using the `ref` function. - -## Usage - -### Checking for Raw Value - -To check if a value is marked as raw, you can use the `isRaw` function. - -```ts -import { isRaw } from 'regor' - -const myValue = /* Your value here */ - -if (isRaw(myValue)) { - console.log('The value is marked as raw.') -} else { - console.log('The value is not marked as raw.') -} -``` - -## Parameters - -- `value`: The value you want to check for being marked as raw. - -## Return Value - -- The `isRaw` function returns `true` if the provided `value` is marked as raw using `markRaw`, and `false` otherwise. - -## Implementation Details - -- The function checks if the provided value has a property marked with the `rawSymbol` set to `1`, indicating that it is marked as raw. - -## Example - -```ts -import { markRaw, isRaw } from 'regor' - -const data = { - name: 'Alice', - age: 30, - rawProperty: markRaw({ nested: 'value' }), -} - -// Check if rawProperty is marked as raw -if (isRaw(data.rawProperty)) { - console.log('The rawProperty is marked as raw.') -} else { - console.log('The rawProperty is not marked as raw.') -} -``` - -## See Also - -- [`markRaw`](/api/markRaw) -- [`ref`](/api/ref) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`observe`](/api/observe) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/isRaw.mdx b/docs-site/content/api/isRaw.mdx new file mode 100644 index 0000000..6933d78 --- /dev/null +++ b/docs-site/content/api/isRaw.mdx @@ -0,0 +1,95 @@ +--- +title: isRaw +description: "Check whether an object has been marked to skip deep conversion." +--- + +isRawUtilities

Check whether an object has been marked to skip deep conversion.

+ +## Overview + +The `isRaw` function determines whether a given value has been marked as "raw" using the `markRaw` function, indicating that it should not be deeply converted into a deep ref when using the `ref` function. + +## Try it live + +
+
A deliberate conversion boundaryLive API
+ +
+ + +
+

Edit the reactive title. The marked resource keeps its object identity and plain nested field.

+
+ +## Usage + +### Checking for Raw Value + +To check if a value is marked as raw, you can use the `isRaw` function. + +```ts +import { isRaw } from 'regor' + +const myValue = /* Your value here */ + +if (isRaw(myValue)) { + console.log('The value is marked as raw.') +} else { + console.log('The value is not marked as raw.') +} +``` + +## Parameters + +- `value`: The value you want to check for being marked as raw. + +## Return Value + +- The `isRaw` function returns `true` if the provided `value` is marked as raw using `markRaw`, and `false` otherwise. + +## Implementation Details + +- The function checks if the provided value has a property marked with the `rawSymbol` set to `1`, indicating that it is marked as raw. + +## Example + +```ts +import { markRaw, isRaw } from 'regor' + +const data = { + name: 'Alice', + age: 30, + rawProperty: markRaw({ nested: 'value' }), +} + +// Check if rawProperty is marked as raw +if (isRaw(data.rawProperty)) { + console.log('The rawProperty is marked as raw.') +} else { + console.log('The rawProperty is not marked as raw.') +} +``` + +

isRaw checks the conversion boundary marker. isRef checks whether the value is a reactive ref.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/isRef.md b/docs-site/content/api/isRef.md deleted file mode 100644 index 0ac49bb..0000000 --- a/docs-site/content/api/isRef.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: isRef ---- - -## Overview - -The `isRef` function determines whether a given value is a ref object, indicating that it has been converted into a ref using the `ref`, `sref` or `computed` functions. - -## Usage - -### Checking for Ref - -To check if a value is a ref, you can use the `isRef` function. - -```ts -import { isRef } from 'regor' - -const myValue = /* Your value here */ - -if (isRef(myValue)) { - console.log('The value is a ref.') -} else { - console.log('The value is not a ref.') -} -``` - -## Parameters - -- `value`: The value you want to check for being a ref object. - -## Return Value - -- The `isRef` function returns `true` if the provided `value` is a ref object, and `false` otherwise. - -## Example - -```ts -import { isRef } from 'regor' - -const refValue = /* A ref value created using the ref or sref function */ - -if (isRef(refValue)) { - console.log('This value is a ref object.') -} else { - console.log('This value is not a ref object.') -} -``` - -## See Also - -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`isDeepRef`](/api/isDeepRef) -- [`unref`](/api/unref) -- [`observe`](/api/observe) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/isRef.mdx b/docs-site/content/api/isRef.mdx new file mode 100644 index 0000000..df8acc2 --- /dev/null +++ b/docs-site/content/api/isRef.mdx @@ -0,0 +1,86 @@ +--- +title: isRef +description: "Check whether a value is a Regor reactive reference." +--- + +isRefReactivity

Check whether a value is a Regor reactive reference.

+ +## Overview + +The `isRef` function determines whether a given value is a ref object, indicating that it has been converted into a ref using the `ref`, `sref` or `computed` functions. + +## Try it live + +
+
Compare deep, copied, and shallow stateLive API
+ +
+ + +
+

Change the name and apply it. Inspect the nested values, ref checks, and flattened snapshot.

+
+ +## Usage + +### Checking for Ref + +To check if a value is a ref, you can use the `isRef` function. + +```ts +import { isRef } from 'regor' + +const myValue = /* Your value here */ + +if (isRef(myValue)) { + console.log('The value is a ref.') +} else { + console.log('The value is not a ref.') +} +``` + +## Parameters + +- `value`: The value you want to check for being a ref object. + +## Return Value + +- The `isRef` function returns `true` if the provided `value` is a ref object, and `false` otherwise. + +## Example + +```ts +import { isRef } from 'regor' + +const refValue = /* A ref value created using the ref or sref function */ + +if (isRef(refValue)) { + console.log('This value is a ref object.') +} else { + console.log('This value is not a ref object.') +} +``` + +

isRef recognizes deep, shallow, and computed refs. Use isDeepRef for the deep-conversion distinction.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/markRaw.md b/docs-site/content/api/markRaw.md deleted file mode 100644 index a1226a1..0000000 --- a/docs-site/content/api/markRaw.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: markRaw ---- - -## Overview - -The `markRaw` function allows you to mark a given value as "raw," indicating that it should not be converted into a deep ref when using the `ref` function. Marking a value as "raw" ensures that specific nested properties or the entire object will remain untracked and not reactive. - -## Usage - -### Marking a Value as Raw - -To mark a value as raw, you can use the `markRaw` function. - -```ts -import { markRaw } from 'regor' - -const myValue = /* Your object here */ - -// Marking the object as raw -const rawValue = markRaw(myValue) -``` - -## Parameters - -- `value`: The object or value you want to mark as raw, preventing it from being deeply converted into a ref object. - -## Return Value - -- The `markRaw` function returns the same value that you passed as an argument, but with an additional marker indicating it is a raw value. - -## Implementation Details - -- The function sets a marker on the provided value using the `rawSymbol` to indicate that it should not be deeply converted into a ref. -- The marked object remains untracked when used with the `ref` function. - -## Example - -```ts -import { markRaw, ref } from 'regor' - -const data = { - name: 'Alice', - age: 30, - rawProperty: markRaw({ nested: 'value' }), -} - -const myRef = ref(data) - -// Changes to rawProperty will not trigger reactivity -myRef().rawProperty.nested = 'updated value' -console.log(myRef().rawProperty.nested) // Outputs 'updated value' -``` - -## See Also - -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`observe`](/api/observe) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/markRaw.mdx b/docs-site/content/api/markRaw.mdx new file mode 100644 index 0000000..78dc09c --- /dev/null +++ b/docs-site/content/api/markRaw.mdx @@ -0,0 +1,92 @@ +--- +title: markRaw +description: "Mark an object so deep conversion keeps its identity and plain fields." +--- + +markRawUtilities

Mark an object so deep conversion keeps its identity and plain fields.

+ +## Overview + +The `markRaw` function allows you to mark a given value as "raw," indicating that it should not be converted into a deep ref when using the `ref` function. Marking a value as "raw" ensures that specific nested properties or the entire object will remain untracked and not reactive. + +## Try it live + +
+
A deliberate conversion boundaryLive API
+ +
+ + +
+

Edit the reactive title. The marked resource keeps its object identity and plain nested field.

+
+ +## Usage + +### Marking a Value as Raw + +To mark a value as raw, you can use the `markRaw` function. + +```ts +import { markRaw } from 'regor' + +const myValue = /* Your object here */ + +// Marking the object as raw +const rawValue = markRaw(myValue) +``` + +## Parameters + +- `value`: The object or value you want to mark as raw, preventing it from being deeply converted into a ref object. + +## Return Value + +- The `markRaw` function returns the same value that you passed as an argument, but with an additional marker indicating it is a raw value. + +## Implementation Details + +- The function sets a marker on the provided value using the `rawSymbol` to indicate that it should not be deeply converted into a ref. +- The marked object remains untracked when used with the `ref` function. + +## Example + +```ts +import { markRaw, ref } from 'regor' + +const data = { + name: 'Alice', + age: 30, + rawProperty: markRaw({ nested: 'value' }), +} + +const myRef = ref(data) + +// Changes to rawProperty will not trigger reactivity +myRef().rawProperty.nested = 'updated value' +console.log(myRef().rawProperty.nested) // Outputs 'updated value' +``` + +

Use markRaw for an object that should remain outside deep conversion, such as a resource owned by another library.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/observe.md b/docs-site/content/api/observe.md deleted file mode 100644 index 2ad3099..0000000 --- a/docs-site/content/api/observe.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: observe ---- - -## Overview - -The `observe` function allows you to create observers that react to changes in ref objects, providing a callback that triggers when the ref's value changes. This is useful for handling side effects or updating UI elements based on reactive data. - -[**`Try It Online`**](https://stackblitz.com/edit/regor-sample-ref?file=index.ts) - -## Usage - -### Creating Observers - -To create an observer, you can use the `observe` function, passing in a ref object and a callback function. - -```ts -import { observe, ref } from 'regor' - -const myRef = ref('Hello, Regor!') - -// Create an observer -const stopObserving = observe(myRef, (newValue) => { - console.log('Value changed:', newValue) -}) -``` - -## Parameters - -- `source`: The ref object you want to observe for changes. -- `observer`: A callback function that will be triggered whenever the ref's value changes. -- `init` (optional): If `true`, the observer will be immediately invoked with the current value of the ref when it's created. - -## Return Value - -- The `observe` function returns a `stopObserving` function that allows you to stop the observer when it's no longer needed. Calling `stopObserving` will unsubscribe the observer from the ref object. - -## Example - -```ts -import { observe, ref } from 'regor' - -const myRef = ref('Hello, Regor!') - -// Create an observer with init set to true -const stopObserving = observe( - myRef, - (newValue) => { - console.log('Value changed:', newValue) - }, - true, -) - -// Later, when the observer is no longer needed, stop it -stopObserving() -``` - -## See Also - -- [`observeMany`](/api/observeMany) -- [`observerCount`](/api/observerCount) -- [`watchEffect`](/api/watchEffect) -- [`computed`](/api/computed) -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/observe.mdx b/docs-site/content/api/observe.mdx new file mode 100644 index 0000000..36e6c0e --- /dev/null +++ b/docs-site/content/api/observe.mdx @@ -0,0 +1,94 @@ +--- +title: observe +description: "Subscribe to one ref and stop the subscription with the returned function." +--- + +observeObservation and Batch

Subscribe to one ref and stop the subscription with the returned function.

+ +## Overview + +The `observe` function allows you to create observers that react to changes in ref objects, providing a callback that triggers when the ref's value changes. This is useful for handling side effects or updating UI elements based on reactive data. + +[**`Try It Online`**](https://stackblitz.com/edit/regor-sample-ref?file=index.ts) + +## Try it live + +
+
Watch subscriptions start and stopLive API
+ +
+ + +
+

Update either source, then stop the observers. Their callback counts stop while source values keep changing.

+
+ +## Usage + +### Creating Observers + +To create an observer, you can use the `observe` function, passing in a ref object and a callback function. + +```ts +import { observe, ref } from 'regor' + +const myRef = ref('Hello, Regor!') + +// Create an observer +const stopObserving = observe(myRef, (newValue) => { + console.log('Value changed:', newValue) +}) +``` + +## Parameters + +- `source`: The ref object you want to observe for changes. +- `observer`: A callback function that will be triggered whenever the ref's value changes. +- `init` (optional): If `true`, the observer will be immediately invoked with the current value of the ref when it's created. + +## Return Value + +- The `observe` function returns a `stopObserving` function that allows you to stop the observer when it's no longer needed. Calling `stopObserving` will unsubscribe the observer from the ref object. + +## Example + +```ts +import { observe, ref } from 'regor' + +const myRef = ref('Hello, Regor!') + +// Create an observer with init set to true +const stopObserving = observe( + myRef, + (newValue) => { + console.log('Value changed:', newValue) + }, + true, +) + +// Later, when the observer is no longer needed, stop it +stopObserving() +``` + +

Keep the returned stop function for explicit teardown. Scoped observers are also associated with their owner’s cleanup.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/observeMany.md b/docs-site/content/api/observeMany.md deleted file mode 100644 index 908feca..0000000 --- a/docs-site/content/api/observeMany.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: observeMany ---- - -## Overview - -The `observeMany` function allows you to create observers that react to changes in multiple ref objects simultaneously. This is useful for handling side effects or updating UI elements based on changes in multiple reactive data sources. - -## Usage - -### Creating Observers for Multiple Refs - -To create an observer for multiple ref objects, you can use the `observeMany` function, passing in an array of ref objects and a callback function. - -```ts -import { observeMany, ref } from 'regor' - -const ref1 = ref('Hello') -const ref2 = ref('World') - -// Create an observer for multiple refs -const stopObserving = observeMany([ref1, ref2], (newValues) => { - console.log('Values changed:', newValues) -}) -``` - -## Parameters - -- `sources`: An array of ref objects you want to observe for changes. -- `observer`: A callback function that will be triggered whenever any of the ref values change. The callback receives an array of the current values of all observed refs. -- `init` (optional): If `true`, the observer will be immediately invoked with the current values of the refs when it's created. - -## Return Value - -- The `observeMany` function returns a `stopObserving` function that allows you to stop the observer when it's no longer needed. Calling `stopObserving` will unsubscribe the observer from all the observed ref objects. - -## Example - -```ts -import { observeMany, ref } from 'regor' - -const ref1 = ref('Hello') -const ref2 = ref('World') - -// Create an observer for multiple refs with init set to true -const stopObserving = observeMany( - [ref1, ref2], - (newValues) => { - console.log('Values changed:', newValues) - }, - true, -) - -// Later, when the observer is no longer needed, stop it -stopObserving() -``` - -## See Also - -- [`observe`](/api/observe) -- [`observerCount`](/api/observerCount) -- [`watchEffect`](/api/watchEffect) -- [`computed`](/api/computed) -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/observeMany.mdx b/docs-site/content/api/observeMany.mdx new file mode 100644 index 0000000..cd2da0c --- /dev/null +++ b/docs-site/content/api/observeMany.mdx @@ -0,0 +1,94 @@ +--- +title: observeMany +description: "Subscribe to multiple refs and receive their current values in one callback." +--- + +observeManyObservation and Batch

Subscribe to multiple refs and receive their current values in one callback.

+ +## Overview + +The `observeMany` function allows you to create observers that react to changes in multiple ref objects simultaneously. This is useful for handling side effects or updating UI elements based on changes in multiple reactive data sources. + +## Try it live + +
+
Watch subscriptions start and stopLive API
+ +
+ + +
+

Update either source, then stop the observers. Their callback counts stop while source values keep changing.

+
+ +## Usage + +### Creating Observers for Multiple Refs + +To create an observer for multiple ref objects, you can use the `observeMany` function, passing in an array of ref objects and a callback function. + +```ts +import { observeMany, ref } from 'regor' + +const ref1 = ref('Hello') +const ref2 = ref('World') + +// Create an observer for multiple refs +const stopObserving = observeMany([ref1, ref2], (newValues) => { + console.log('Values changed:', newValues) +}) +``` + +## Parameters + +- `sources`: An array of ref objects you want to observe for changes. +- `observer`: A callback function that will be triggered whenever any of the ref values change. The callback receives an array of the current values of all observed refs. +- `init` (optional): If `true`, the observer will be immediately invoked with the current values of the refs when it's created. + +## Return Value + +- The `observeMany` function returns a `stopObserving` function that allows you to stop the observer when it's no longer needed. Calling `stopObserving` will unsubscribe the observer from all the observed ref objects. + +## Example + +```ts +import { observeMany, ref } from 'regor' + +const ref1 = ref('Hello') +const ref2 = ref('World') + +// Create an observer for multiple refs with init set to true +const stopObserving = observeMany( + [ref1, ref2], + (newValues) => { + console.log('Values changed:', newValues) + }, + true, +) + +// Later, when the observer is no longer needed, stop it +stopObserving() +``` + +

A callback can run when either source changes. Batch related writes when you need grouped notifications.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/observerCount.md b/docs-site/content/api/observerCount.md deleted file mode 100644 index 073ac90..0000000 --- a/docs-site/content/api/observerCount.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: observerCount ---- - -## Overview - -The `observerCount` function allows you to determine the number of observers (callbacks) currently registered on a ref object. This can be useful for debugging and understanding how many entities are actively reacting to changes in the ref object. - -## Usage - -### Getting the Observer Count - -To get the number of observers for a ref object, you can use the `observerCount` function. - -```ts -import { observerCount, ref } from 'regor' - -const myRef = ref('Hello, Regor!') - -// Get the observer count -const count = observerCount(myRef) -console.log('Observer count:', count) -``` - -## Parameters - -- `source`: The ref object for which you want to retrieve the observer count. - -## Return Value - -- The `observerCount` function returns the number of observers (callbacks) currently registered on the provided ref object. - -## Example - -```ts -import { observerCount, ref, observe } from 'regor' - -const myRef = ref('Hello, Regor!') - -// Create an observer for the ref -observe(myRef, () => { - console.log('Ref value changed.') -}) - -// Get the observer count -const count = observerCount(myRef) -console.log('Observer count:', count) // Outputs 'Observer count: 1' -``` - -## See Also - -- [`ref`](/api/ref) -- [`observe`](/api/observe) -- [`observeMany`](/api/observeMany) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/observerCount.mdx b/docs-site/content/api/observerCount.mdx new file mode 100644 index 0000000..f26f359 --- /dev/null +++ b/docs-site/content/api/observerCount.mdx @@ -0,0 +1,89 @@ +--- +title: observerCount +description: "Inspect how many observer callbacks are registered on a ref." +--- + +observerCountObservation and Batch

Inspect how many observer callbacks are registered on a ref.

+ +## Overview + +The `observerCount` function allows you to determine the number of observers (callbacks) currently registered on a ref object. This can be useful for debugging and understanding how many entities are actively reacting to changes in the ref object. + +## Try it live + +
+
Watch subscriptions start and stopLive API
+ +
+ + +
+

Update either source, then stop the observers. Their callback counts stop while source values keep changing.

+
+ +## Usage + +### Getting the Observer Count + +To get the number of observers for a ref object, you can use the `observerCount` function. + +```ts +import { observerCount, ref } from 'regor' + +const myRef = ref('Hello, Regor!') + +// Get the observer count +const count = observerCount(myRef) +console.log('Observer count:', count) +``` + +## Parameters + +- `source`: The ref object for which you want to retrieve the observer count. + +## Return Value + +- The `observerCount` function returns the number of observers (callbacks) currently registered on the provided ref object. + +## Example + +```ts +import { observerCount, ref, observe } from 'regor' + +const myRef = ref('Hello, Regor!') + +// Create an observer for the ref +observe(myRef, () => { + console.log('Ref value changed.') +}) + +// Get the observer count +const count = observerCount(myRef) +console.log('Observer count:', count) // Outputs 'Observer count: 1' +``` + +

Template bindings and computed values can also observe a ref. The preview keeps its source refs outside the template to isolate explicit subscriptions.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/onMounted.md b/docs-site/content/api/onMounted.md deleted file mode 100644 index 013b772..0000000 --- a/docs-site/content/api/onMounted.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: onMounted ---- - -## Overview - -The `onMounted` function allows you to register a callback function that will be executed when an app or component is mounted or initialized. This is particularly useful for performing setup tasks or side effects when a component becomes active. - -## Usage - -### Registering the `onMounted` Callback - -To register an `onMounted` callback, simply call the `onMounted` function and pass the desired callback function as an argument. The callback will be executed when the app or component is mounted. - -```ts -import { createApp, defineComponent, html, useScope, onMounted } from 'regor' - -const userRow = defineComponent(html`
`, { - context: () => ({ - // Register an onMounted callback - onMounted(() => { - // Perform initialization tasks - console.log('Component is mounted!') - }) - }) -}) - -createApp( - useScope(() => { - // Register an onMounted callback - onMounted(() => { - // Perform initialization tasks - console.log('App is mounted!') - }) - return {} - }), -) -``` - -## Parameters - -- `onMounted` (required): A callback function that will be executed when the component or scope is mounted. - -## Notes - -- `onMounted` callbacks can be useful for initializing state, fetching data, setting up event listeners, or any other task that should be performed when a component becomes active. - -- Multiple `onMounted` callbacks can be registered, and they will be executed in the order they were registered. - -- `onMounted` is often used in conjunction with `onUnmounted` to define cleanup tasks that should be performed when a component is unmounted. - -## See Also - -- [`useScope`](/api/useScope) -- [`onUnmounted`](/api/onUnmounted) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/onMounted.mdx b/docs-site/content/api/onMounted.mdx new file mode 100644 index 0000000..b93edb2 --- /dev/null +++ b/docs-site/content/api/onMounted.mdx @@ -0,0 +1,81 @@ +--- +title: onMounted +description: "Register setup that runs when its owning app or component mounts." +--- + +onMountedLifecycle and Scope

Register setup that runs when its owning app or component mounts.

+ +## Overview + +The `onMounted` function allows you to register a callback function that will be executed when an app or component is mounted or initialized. This is particularly useful for performing setup tasks or side effects when a component becomes active. + +## Try it live + +
+
Setup and cleanup with an ownerLive API
+ +
+ + +
+

Mount the child ticker, then unmount it. The parent keeps totals while the child releases its interval.

+
+ +## Usage + +### Registering the `onMounted` Callback + +To register an `onMounted` callback, simply call the `onMounted` function and pass the desired callback function as an argument. The callback will be executed when the app or component is mounted. + +```ts +import { createApp, defineComponent, html, useScope, onMounted } from 'regor' + +const userRow = defineComponent(html`
`, { + context: () => { + // Register an onMounted callback + onMounted(() => { + // Perform initialization tasks + console.log('Component is mounted!') + }) + return {} + }, +}) + +createApp( + useScope(() => { + // Register an onMounted callback + onMounted(() => { + // Perform initialization tasks + console.log('App is mounted!') + }) + return {} + }), +) +``` + +## Parameters + +- `onMounted` (required): A callback function that will be executed when the component or scope is mounted. + +

Pair mounted setup with unmounted cleanup when it starts timers, listeners, or subscriptions.

+ +## Notes + +- `onMounted` callbacks can be useful for initializing state, fetching data, setting up event listeners, or any other task that should be performed when a component becomes active. + +- Multiple `onMounted` callbacks can be registered, and they will be executed in the order they were registered. + +- `onMounted` is often used in conjunction with `onUnmounted` to define cleanup tasks that should be performed when a component is unmounted. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/onUnmounted.md b/docs-site/content/api/onUnmounted.md deleted file mode 100644 index d83ae3b..0000000 --- a/docs-site/content/api/onUnmounted.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: onUnmounted ---- - -## Overview - -The `onUnmounted` function allows you to register a callback function that will be executed when a component or scope is unmounted or cleaned up. This is useful for performing cleanup tasks or removing event listeners when a component becomes inactive. - -## Usage - -### Registering the `onUnmounted` Callback - -To register an `onUnmounted` callback, simply call the `onUnmounted` function and pass the desired callback function as an argument. The callback will be executed when the component or scope is unmounted or cleaned up. - -```ts -import { createApp, defineComponent, html, useScope, onUnmounted } from 'regor' - -const userRow = defineComponent(html`
`, { - context: () => ({ - // Register an onUnmounted callback - onUnmounted(() => { - // Perform cleanup tasks - console.log('Component is unmounted!') - }) - }) -}) - -createApp( - useScope(() => { - // Register an onUnmounted callback - onUnmounted(() => { - // Perform cleanup tasks - console.log('App is unmounted!') - }) - return {} - }), -) -``` - -## Parameters - -- `onUnmounted` (required): A callback function that will be executed when the app or component is unmounted or cleaned up. - -## Notes - -- `onUnmounted` callbacks can be useful for cleaning up resources, removing event listeners, or any other task that should be performed when a component becomes inactive. - -- Multiple `onUnmounted` callbacks can be registered, and they will be executed in the order they were registered. - -- `onUnmounted` is often used in conjunction with `onMounted` to define initialization and cleanup tasks for components or scopes. - -## See Also - -- [`useScope`](/api/useScope) -- [`onMounted`](/api/onMounted) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/onUnmounted.mdx b/docs-site/content/api/onUnmounted.mdx new file mode 100644 index 0000000..c0d5c59 --- /dev/null +++ b/docs-site/content/api/onUnmounted.mdx @@ -0,0 +1,81 @@ +--- +title: onUnmounted +description: "Register cleanup for resources owned by an app, component, or scope." +--- + +onUnmountedLifecycle and Scope

Register cleanup for resources owned by an app, component, or scope.

+ +## Overview + +The `onUnmounted` function allows you to register a callback function that will be executed when a component or scope is unmounted or cleaned up. This is useful for performing cleanup tasks or removing event listeners when a component becomes inactive. + +## Try it live + +
+
Setup and cleanup with an ownerLive API
+ +
+ + +
+

Mount the child ticker, then unmount it. The parent keeps totals while the child releases its interval.

+
+ +## Usage + +### Registering the `onUnmounted` Callback + +To register an `onUnmounted` callback, simply call the `onUnmounted` function and pass the desired callback function as an argument. The callback will be executed when the component or scope is unmounted or cleaned up. + +```ts +import { createApp, defineComponent, html, useScope, onUnmounted } from 'regor' + +const userRow = defineComponent(html`
`, { + context: () => { + // Register an onUnmounted callback + onUnmounted(() => { + // Perform cleanup tasks + console.log('Component is unmounted!') + }) + return {} + }, +}) + +createApp( + useScope(() => { + // Register an onUnmounted callback + onUnmounted(() => { + // Perform cleanup tasks + console.log('App is unmounted!') + }) + return {} + }), +) +``` + +## Parameters + +- `onUnmounted` (required): A callback function that will be executed when the app or component is unmounted or cleaned up. + +

Keep the resource handle near the hook that releases it. The ticker preview shows its interval stopping after unmount.

+ +## Notes + +- `onUnmounted` callbacks can be useful for cleaning up resources, removing event listeners, or any other task that should be performed when a component becomes inactive. + +- Multiple `onUnmounted` callbacks can be registered, and they will be executed in the order they were registered. + +- `onUnmounted` is often used in conjunction with `onMounted` to define initialization and cleanup tasks for components or scopes. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/pause.md b/docs-site/content/api/pause.md deleted file mode 100644 index bab4139..0000000 --- a/docs-site/content/api/pause.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: pause ---- - -## Overview - -The `pause` function is used to pause the automatic triggering of observers for a specific ref. When a ref is paused, its observers are temporarily deactivated, and changes to the ref's value will not trigger observer callbacks until it is resumed using the `resume` function. - -## Usage - -### Pausing Observers - -To pause the observers of a specific ref, call the `pause` function with the ref as the `source` argument. This will temporarily deactivate the observers associated with the ref. - -```ts -import { pause, ref, observe } from 'regor' - -const myRef = ref(5) - -observe(myRef, () => { - console.log('Observer triggered:', myRef.value) -}) - -myRef.value = 10 // The observer is automatically triggered - -// Pause the observers of myRef -pause(myRef) - -myRef.value = 15 // The observer is not triggered - -// Resume the observers of myRef -resume(myRef) - -myRef.value = 20 // The observer is triggered again - -// Outputs: -// Observer triggered: 10 -// Observer triggered: 20 -``` - -## Parameters - -- `source`: The ref for which you want to pause the automatic triggering of observers. - -## Notes - -- The `pause` function is useful when you want to temporarily disable observer notifications for a ref, allowing you to make multiple changes to the ref's value without triggering observers in between. - -- Pausing a ref does not prevent manual triggering of observers using the `trigger` function. - -- To resume the observers of a paused ref, use the `resume` function. - -## See Also - -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`observe`](/api/observe) -- [`trigger`](/api/trigger) -- [`resume`](/api/resume) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/pause.mdx b/docs-site/content/api/pause.mdx new file mode 100644 index 0000000..90271f7 --- /dev/null +++ b/docs-site/content/api/pause.mdx @@ -0,0 +1,84 @@ +--- +title: pause +description: "Pause automatic notifications from a ref while retaining its stored value." +--- + +pauseReactivity

Pause automatic notifications from a ref while retaining its stored value.

+ +## Overview + +The `pause` function is used to pause the automatic triggering of observers for a specific ref. When a ref is paused, its observers are temporarily deactivated, and changes to the ref's value will not trigger observer callbacks until it is resumed using the `resume` function. + +## Try it live + +
+
Separate stored values from notificationsLive API
+ +
+ + +
+

Pause, write, resume, and trigger. Compare the stored value with what the observer last received.

+
+ +## Usage + +### Pausing Observers + +To pause the observers of a specific ref, call the `pause` function with the ref as the `source` argument. This will temporarily deactivate the observers associated with the ref. + +```ts +import { pause, ref, observe } from 'regor' + +const myRef = ref(5) + +observe(myRef, () => { + console.log('Observer triggered:', myRef.value) +}) + +myRef.value = 10 // The observer is automatically triggered + +// Pause the observers of myRef +pause(myRef) + +myRef.value = 15 // The observer is not triggered + +// Resume the observers of myRef +resume(myRef) + +myRef.value = 20 // The observer is triggered again + +// Outputs: +// Observer triggered: 10 +// Observer triggered: 20 +``` + +## Parameters + +- `source`: The ref for which you want to pause the automatic triggering of observers. + +

While paused, writes can change the stored value without updating observers. Inspect both in the preview.

+ +## Notes + +- The `pause` function is useful when you want to temporarily disable observer notifications for a ref, allowing you to make multiple changes to the ref's value without triggering observers in between. + +- Pausing a ref does not prevent manual triggering of observers using the `trigger` function. + +- To resume the observers of a paused ref, use the `resume` function. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/persist.md b/docs-site/content/api/persist.mdx similarity index 57% rename from docs-site/content/api/persist.md rename to docs-site/content/api/persist.mdx index 9ff7331..07db03a 100644 --- a/docs-site/content/api/persist.md +++ b/docs-site/content/api/persist.mdx @@ -1,11 +1,18 @@ --- title: persist +description: "Associate a ref with a localStorage key and restore its saved value." --- +persistUtilities

Associate a ref with a localStorage key and restore its saved value.

+ ## Overview The `persist` function allows you to persist the state of a ref in the browser's `localStorage` by associating it with a unique `key`. This enables you to store and retrieve the state of the ref across page reloads or even when the browser is closed and reopened. +Preferences in a browser app

Create preference refs inside the scope of the browser app that owns them.

+ + + ## Usage ### Persisting a Ref @@ -43,6 +50,8 @@ console.log(myPersistedRef.value) // Output: The value stored in localStorage The `persist` function returns the same ref that was passed as `anyRef`. This allows you to use the ref as usual in your application. +

persist reads and writes browser localStorage. Call it from browser-owned setup with a namespaced key and a suitable preference value.

+ ## Notes - The `persist` function is particularly useful for preserving the state of application data, user preferences, or settings across different browser sessions. @@ -55,9 +64,13 @@ The `persist` function returns the same ref that was passed as `anyRef`. This al ## See Also -- [`ref`](/api/ref) -- [`flatten`](/api/flatten) -- [`watchEffect`](/api/watchEffect) -- [`localStorage` Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) + + + [Back to the API list](/api/) diff --git a/docs-site/content/api/pval.md b/docs-site/content/api/pval.mdx similarity index 76% rename from docs-site/content/api/pval.md rename to docs-site/content/api/pval.mdx index 1844c77..36a753e 100644 --- a/docs-site/content/api/pval.md +++ b/docs-site/content/api/pval.mdx @@ -1,7 +1,10 @@ --- title: pval +description: "Validate component inputs at runtime with composable type and shape validators." --- +pvalApp and Components

Validate component inputs at runtime with composable type and shape validators.

+ ## Overview `pval` is the built-in prop-validator namespace for `head.validateProps(...)`. @@ -20,6 +23,18 @@ head.validateProps({ }) ``` +## Try it live + +
+
Check a runtime value explicitlyLive API
+ +
+ + +
+

Validate a number or keep the candidate as a string. Failed validation is caught and displayed in the preview.

+
+ ## When to use it Use `pval` inside `defineComponent(..., { context(head) { ... } })` when you want an explicit runtime contract for component inputs. @@ -258,8 +273,12 @@ const startsWithPrefix: PropValidator = (value, name, head) => { } ``` +

Use validators for a runtime contract. Convert inputs deliberately when your application needs a different type.

+ ## See Also 1. [defineComponent](/api/defineComponent) 2. [Components guide](/guide/components) 3. [TypeScript guide](/guide/typescript) + + diff --git a/docs-site/content/api/raw.md b/docs-site/content/api/raw.mdx similarity index 50% rename from docs-site/content/api/raw.md rename to docs-site/content/api/raw.mdx index c9f63e7..c44fbab 100644 --- a/docs-site/content/api/raw.md +++ b/docs-site/content/api/raw.mdx @@ -1,11 +1,26 @@ --- title: raw +description: "Use the html tag’s string-assembly behavior under its raw alias." --- +rawUtilities

Use the html tag’s string-assembly behavior under its raw alias.

+ ## Overview The `raw` function in Regor is an alias for the `html` function. It serves the same purpose and can be used interchangeably with `html` to create HTML strings from template literals and interpolated values. It is commonly used to generate HTML content dynamically within Regor components. +## Try it live + +
+
From strings to structured DOMLive API
+ +
+ + +
+

Edit the text, then convert a JSON template into a detached fragment and serialize its element back to JSON.

+
+ ## Usage The `raw` function is essentially identical to the `html` function, and its usage is the same. It allows you to create HTML strings with dynamic content using template literals and interpolating values into the resulting string. @@ -34,6 +49,8 @@ const htmlString = raw`

Hello, my name is ${name} and I am ${age} years old.

raw does not mean markRaw. It assembles a string and does not sanitize values interpolated into that string.

+ ## Notes - The `raw` function is functionally equivalent to the `html` function and can be used interchangeably. It provides a convenient way to create HTML strings with dynamic content. @@ -46,7 +63,13 @@ const htmlString = raw`

Hello, my name is ${name} and I am ${age} years old. +

+ [Back to the API list](/api/) + + diff --git a/docs-site/content/api/ref.md b/docs-site/content/api/ref.mdx similarity index 54% rename from docs-site/content/api/ref.md rename to docs-site/content/api/ref.mdx index 99c6d7d..12397a2 100644 --- a/docs-site/content/api/ref.md +++ b/docs-site/content/api/ref.mdx @@ -1,13 +1,28 @@ --- title: ref +description: "Create writable state and recursively convert nested object and array fields to refs." --- +refReactivity

Create writable state and recursively convert nested object and array fields to refs.

+ ## Overview The `ref` function converts a given value and its nested properties into ref objects recursively, returning a ref object that reflects the structure of the input value. [**`Try It Online`**](https://stackblitz.com/edit/regor-sample-ref?file=index.ts) +## Try it live + +
+
Compare deep, copied, and shallow stateLive API
+ +
+ + +
+

Change the name and apply it. Inspect the nested values, ref checks, and flattened snapshot.

+
+ ## Usage ### Getting the Ref Value @@ -38,6 +53,8 @@ To update the value of a ref object, you have two options: The `ref` function returns a ref object representing the input value and its nested properties. The specific type of the returned ref object depends on the input value's type. +

ref converts the supplied structure in place. Choose cref when you need a copied structure.

+ ## Notes - Certain types such as Node, Date, RegExp, Promise, and Error are not recursively converted into ref objects. They are treated as-is and returned as the value of the ref object. @@ -101,17 +118,23 @@ console.log(myRef().age()) // Outputs 35 ## See Also -- [`cref`](/api/cref) -- [`sref`](/api/sref) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`observe`](/api/observe) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/regorConfig.md b/docs-site/content/api/regorConfig.mdx similarity index 69% rename from docs-site/content/api/regorConfig.md rename to docs-site/content/api/regorConfig.mdx index 867df52..1aa2141 100644 --- a/docs-site/content/api/regorConfig.md +++ b/docs-site/content/api/regorConfig.mdx @@ -1,11 +1,26 @@ --- title: RegorConfig +description: "Configure an app’s directives, global context, interpolation, and validation policy." --- +RegorConfigApp and Components

Configure an app’s directives, global context, interpolation, and validation policy.

+ ## Overview The `RegorConfig` class is used to configure and customize the behavior of the Regor library. It provides options for setting directives, global context, and other configuration parameters. +## Try it live + +
+
Configure one app instanceLive API
+ +
+ + +
+

Apply a validation policy to the local config used by this preview’s browser mount.

+
+ ## Usage The `RegorConfig` class is typically used to create a configuration object that can be passed to Regor during initialization. You can customize various aspects of Regor's behavior using this configuration. @@ -135,6 +150,8 @@ config.updateDirectives((directiveMap, builtInNames) => { The `RegorConfig` class provides default configuration values for various properties and options. These defaults are used if no custom configuration is provided. +

Pass a separate RegorConfig instance to createApp when one island needs custom behavior.

+ ## Notes - The `RegorConfig` class allows you to fine-tune Regor's behavior to match your specific application requirements. @@ -153,10 +170,16 @@ The `RegorConfig` class provides default configuration values for various proper ## See Also -- [`createApp`](/api/createApp) -- [`defineComponent`](/api/defineComponent) -- [`pval`](/api/pval) -- [`toFragment`](/api/toFragment) -- [`toJsonTemplate`](/api/toJsonTemplate) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/removeNode.md b/docs-site/content/api/removeNode.md deleted file mode 100644 index 83aab36..0000000 --- a/docs-site/content/api/removeNode.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: removeNode ---- - -## Overview - -The `removeNode` function in Regor is responsible for removing a DOM node and initiating the unbinding process to clean up associated data bindings and event listeners. This function ensures that elements are safely removed from the DOM while also releasing any resources associated with them. - -## Usage - -### Removing a DOM Node and Unbinding - -The `removeNode` function takes a single parameter: - -- `node`: The DOM node you want to remove from the document. This function will also initiate the unbinding process to clean up associated data bindings and event listeners. - -### Example - -```javascript -import { removeNode } from 'regor' - -// Remove a DOM node and clean up associated data bindings and event listeners -const someElement = document.getElementById('example') -removeNode(someElement) -``` - -## Parameters - -- `node`: The DOM node you want to remove from the document. This function will also initiate the unbinding process to clean up associated data bindings and event listeners. - -## Notes - -- The `removeNode` function is used to safely remove a DOM node from the document while ensuring that any bound data and associated logic are properly unbound and cleaned up. - -- When called on a specific DOM node, the function also initiates the unbinding process, which includes removing event listeners and cleaning up data bindings associated with the node and its descendants. - -- This function is typically used internally within Regor to facilitate the cleanup process when components are unmounted or when elements are removed from the DOM as part of Regor's rendering and lifecycle management. - -- It is essential to use the `removeNode` function or Regor's lifecycle management mechanisms when removing elements from the DOM to prevent memory leaks and ensure proper cleanup. - -## See Also - -- [addUnbinder](/api/addUnbinder) -- [unbind](/api/unbind) -- [drainUnbind](/api/drainUnbind) -- [getBindData](/api/getBindData) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/removeNode.mdx b/docs-site/content/api/removeNode.mdx new file mode 100644 index 0000000..f853310 --- /dev/null +++ b/docs-site/content/api/removeNode.mdx @@ -0,0 +1,71 @@ +--- +title: removeNode +description: "Remove a node and schedule cleanup of its bindings." +--- + +removeNodeCleanup and Unbind

Remove a node and schedule cleanup of its bindings.

+ +## Overview + +The `removeNode` function in Regor is responsible for removing a DOM node and initiating the unbinding process to clean up associated data bindings and event listeners. This function ensures that elements are safely removed from the DOM while also releasing any resources associated with them. + +## Try it live + +
+
Own a node through its full lifetimeLive API
+ +
+ + +
+

Mount, write, unbind, or remove and drain. Watch the DOM, observer count, and registered cleanup.

+
+ +## Usage + +### Removing a DOM Node and Unbinding + +The `removeNode` function takes a single parameter: + +- `node`: The DOM node you want to remove from the document. This function will also initiate the unbinding process to clean up associated data bindings and event listeners. + +### Example + +```javascript +import { removeNode } from 'regor' + +// Remove a DOM node and clean up associated data bindings and event listeners +const someElement = document.getElementById('example') +removeNode(someElement) +``` + +## Parameters + +- `node`: The DOM node you want to remove from the document. This function will also initiate the unbinding process to clean up associated data bindings and event listeners. + +

removeNode detaches the node immediately and queues unbinding. drainUnbind flushes the deferred work when you need deterministic cleanup.

+ +## Notes + +- The `removeNode` function is used to safely remove a DOM node from the document while ensuring that any bound data and associated logic are properly unbound and cleaned up. + +- When called on a specific DOM node, the function also initiates the unbinding process, which includes removing event listeners and cleaning up data bindings associated with the node and its descendants. + +- This function is typically used internally within Regor to facilitate the cleanup process when components are unmounted or when elements are removed from the DOM as part of Regor's rendering and lifecycle management. + +- It is essential to use the `removeNode` function or Regor's lifecycle management mechanisms when removing elements from the DOM to prevent memory leaks and ensure proper cleanup. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/resume.md b/docs-site/content/api/resume.md deleted file mode 100644 index 0776582..0000000 --- a/docs-site/content/api/resume.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: resume ---- - -## Overview - -The `resume` function is used to resume the automatic triggering of observers for a specific ref that has previously been paused using the `pause` function. When a ref is resumed, its observers are reactivated, and changes to the ref's value will once again trigger observer callbacks. - -## Usage - -### Resuming Observers - -To resume the observers of a specific ref, call the `resume` function with the ref as the `source` argument. This will reactivate the observers associated with the ref. - -```ts -import { pause, resume, ref, observe } from 'regor' - -const myRef = ref(5) - -observe(myRef, () => { - console.log('Observer triggered:', myRef.value) -}) - -myRef.value = 10 // The observer is automatically triggered - -// Pause the observers of myRef -pause(myRef) - -myRef.value = 15 // The observer is not triggered - -// Resume the observers of myRef -resume(myRef) - -myRef.value = 20 // The observer is triggered again - -// Outputs: -// Observer triggered: 10 -// Observer triggered: 20 -``` - -## Parameters - -- `source`: The ref for which you want to resume the automatic triggering of observers. - -## Notes - -- The `resume` function is used to reactivate observers for a ref that has previously been paused using the `pause` function. This allows you to continue receiving observer notifications when changes are made to the ref's value. - -- Resuming a ref's observers does not trigger observer callbacks for past changes made while the ref was paused. Only future changes to the ref's value will trigger observers. - -## See Also - -- [`ref`](/api/ref) -- [`observe`](/api/observe) -- [`trigger`](/api/trigger) -- [`pause`](/api/pause) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/resume.mdx b/docs-site/content/api/resume.mdx new file mode 100644 index 0000000..c8ecc14 --- /dev/null +++ b/docs-site/content/api/resume.mdx @@ -0,0 +1,81 @@ +--- +title: resume +description: "Resume a ref’s notification behavior after a pause." +--- + +resumeReactivity

Resume a ref’s notification behavior after a pause.

+ +## Overview + +The `resume` function is used to resume the automatic triggering of observers for a specific ref that has previously been paused using the `pause` function. When a ref is resumed, its observers are reactivated, and changes to the ref's value will once again trigger observer callbacks. + +## Try it live + +
+
Separate stored values from notificationsLive API
+ +
+ + +
+

Pause, write, resume, and trigger. Compare the stored value with what the observer last received.

+
+ +## Usage + +### Resuming Observers + +To resume the observers of a specific ref, call the `resume` function with the ref as the `source` argument. This will reactivate the observers associated with the ref. + +```ts +import { pause, resume, ref, observe } from 'regor' + +const myRef = ref(5) + +observe(myRef, () => { + console.log('Observer triggered:', myRef.value) +}) + +myRef.value = 10 // The observer is automatically triggered + +// Pause the observers of myRef +pause(myRef) + +myRef.value = 15 // The observer is not triggered + +// Resume the observers of myRef +resume(myRef) + +myRef.value = 20 // The observer is triggered again + +// Outputs: +// Observer triggered: 10 +// Observer triggered: 20 +``` + +## Parameters + +- `source`: The ref for which you want to resume the automatic triggering of observers. + +

The preview separates writing, resuming, and explicitly triggering so their effects are visible.

+ +## Notes + +- The `resume` function is used to reactivate observers for a ref that has previously been paused using the `pause` function. This allows you to continue receiving observer notifications when changes are made to the ref's value. + +- Resuming a ref's observers does not trigger observer callbacks for past changes made while the ref was paused. Only future changes to the ref's value will trigger observers. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/silence.md b/docs-site/content/api/silence.md deleted file mode 100644 index 933380a..0000000 --- a/docs-site/content/api/silence.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: silence ---- - -## Overview - -The `silence` function is an internal utility provided by Regor. It is used to temporarily suspend the normal behavior of collecting refs within the callback of `watchEffect`, `computed` or `collectRefs`. This allows you to perform actions on refs excluded from normal behavior of `watchEffect`, `computed` or `collectRefs`. It is useful in specific scenarios when you want to prevent ref collection for some refs. - -## Usage - -### Silencing Ref Collection - -To temporarily suspend ref collection within the callback of `watchEffect`, `computed` or `collectRefs`, you can wrap your action function with `silence`. - -```ts -import { silence, watchEffect, ref } from 'regor' - -const myRef = ref(5) -const anotherRef = ref(7) - -watchEffect(() => { - console.log(myRef.value) // myRef is collected and will be observed. - - silence(() => { - anotherRef.value = 10 // anotherRef is excluded from the ref collection and will not be observed. - console.log(anotherRef.value) - }) -}) - -myRef.value = 8 // watchEffect's callback will be invoked. -anotherRef.value = 9 // watchEffect's callback will not be invoked -``` - -## Parameters - -- `action`: A function that performs some logic within the callback of `watchEffect`, `computed` or `collectRefs` but temporarily suspends ref collection. The function is executed within a scope where ref collection is silenced. - -## Return Value - -- The `silence` function returns the result of the action function, allowing you to access the outcome of the action. - -## Example - -```ts -import { silence, watchEffect, ref } from 'regor' - -const myRef = ref(5) - -watchEffect(() => { - console.log(myRef.value) // Outputs 5 - - silence(() => { - myRef.value = 10 - console.log(myRef.value) // Outputs 10 - }) - - console.log(myRef.value) // Outputs 10 -}) -``` - -## See Also - -- [`ref`](/api/ref) -- [`computed`](/api/computed) -- [`observe`](/api/observe) -- [`observeMany`](/api/observeMany) -- [`computed`](/api/computed) -- [`watchEffect`](/api/watchEffect) -- [`collectRefs`](/api/collectRefs) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/silence.mdx b/docs-site/content/api/silence.mdx new file mode 100644 index 0000000..bf24968 --- /dev/null +++ b/docs-site/content/api/silence.mdx @@ -0,0 +1,104 @@ +--- +title: silence +description: "Exclude an action’s ref reads from active dependency collection." +--- + +silenceComputed and Effects

Exclude an action’s ref reads from active dependency collection.

+ +## Overview + +The `silence` function is an internal utility provided by Regor. It is used to temporarily suspend the normal behavior of collecting refs within the callback of `watchEffect`, `computed` or `collectRefs`. This allows you to perform actions on refs excluded from normal behavior of `watchEffect`, `computed` or `collectRefs`. It is useful in specific scenarios when you want to prevent ref collection for some refs. + +## Try it live + +
+
See which reads become dependenciesLive API
+ +
+ + +
+

Change the tracked and silenced values separately. Collect the reads to inspect the dependency count and returned result.

+
+ +## Usage + +### Silencing Ref Collection + +To temporarily suspend ref collection within the callback of `watchEffect`, `computed` or `collectRefs`, you can wrap your action function with `silence`. + +```ts +import { silence, watchEffect, ref } from 'regor' + +const myRef = ref(5) +const anotherRef = ref(7) + +watchEffect(() => { + console.log(myRef.value) // myRef is collected and will be observed. + + silence(() => { + anotherRef.value = 10 // anotherRef is excluded from the ref collection and will not be observed. + console.log(anotherRef.value) + }) +}) + +myRef.value = 8 // watchEffect's callback will be invoked. +anotherRef.value = 9 // watchEffect's callback will not be invoked +``` + +## Parameters + +- `action`: A function that performs some logic within the callback of `watchEffect`, `computed` or `collectRefs` but temporarily suspends ref collection. The function is executed within a scope where ref collection is silenced. + +## Return Value + +- The `silence` function returns the result of the action function, allowing you to access the outcome of the action. + +## Example + +```ts +import { silence, watchEffect, ref } from 'regor' + +const myRef = ref(5) + +watchEffect(() => { + console.log(myRef.value) // Outputs 5 + + silence(() => { + myRef.value = 10 + console.log(myRef.value) // Outputs 10 + }) + + console.log(myRef.value) // Outputs 10 +}) +``` + +

Refs still hold reactive values. Their reads inside silence are excluded from the surrounding collector.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/sref.md b/docs-site/content/api/sref.md deleted file mode 100644 index 9827c44..0000000 --- a/docs-site/content/api/sref.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: sref ---- - -## Overview - -The `sref` function converts a given value into an sref (short for "simple ref") object and returns the sref. An sref allows you to both retrieve and update its value. - -The nested properties of an sref are not converted to refs. - -[**`Try It Online`**](https://stackblitz.com/edit/regor-sample-ref?file=index.ts) - -## Usage - -### Getting the SRef Value - -You can access the value of the sref object using two methods: - -1. `srefObj.value`: Accesses the value directly. -2. `srefObj()`: Invokes the sref object to retrieve its value. - -### Setting the SRef Value - -To update the value of an sref object, you have two options: - -1. `srefObj.value = newValue`: Sets the value directly. -2. `srefObj(newValue)`: Invokes the sref object with the new value to update it. - -## Parameters - -- `value` (optional): Any value that you want to convert into an sref object. The function supports several input types: - - - Basic types such as numbers, strings, booleans, Date etc. - - sref objects. - - objects - - Array, Map, Set. - - `null` or `undefined`. - -## Return Value - -The `sref` function returns an sref object representing the input value. The specific type of the returned sref object depends on the input value's type. - -## Notes - -- `sref` modifies prototype of arrays, maps, and sets to make them reactive. - -- Observers can be attached to the sref object to be notified of changes to its value. - -- The function also supports batch collecting changes and pausing/resuming auto-triggering of observers. -- Every `ref` is an `sref`, but not every `sref` is a `ref`. - -## Example - -```ts -import { sref } from 'regor' - -const initialValue = { - name: 'John', - age: 30, - hobbies: ['reading', 'swimming'], -} - -const mySRef = sref(initialValue) - -// Accessing the sref value using function call -console.log(mySRef()) // Outputs the initial value - -// Accessing the sref value using value getter -console.log(mySRef.value) // Outputs the initial value - -// Updating the sref value -mySRef().name = 'Alice' // Directly modifying the sref value -console.log(mySRef().name) // Outputs 'Alice' - -mySRef({ - name: 'Alice', - age: 35, - hobbies: ['reading', 'swimming'], -}) // Invoking the sref with a new value -console.log(mySRef().age) // Outputs 35 -``` - -## See Also - -- [`ref`](/api/ref) -- [`cref`](/api/cref) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`observe`](/api/observe) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/sref.mdx b/docs-site/content/api/sref.mdx new file mode 100644 index 0000000..4216aa3 --- /dev/null +++ b/docs-site/content/api/sref.mdx @@ -0,0 +1,121 @@ +--- +title: sref +description: "Hold shallow writable state and replace plain object values to notify bindings." +--- + +srefReactivity

Hold shallow writable state and replace plain object values to notify bindings.

+ +## Overview + +The `sref` function converts a given value into an sref (short for "simple ref") object and returns the sref. An sref allows you to both retrieve and update its value. + +The nested properties of an sref are not converted to refs. + +[**`Try It Online`**](https://stackblitz.com/edit/regor-sample-ref?file=index.ts) + +## Try it live + +
+
Compare deep, copied, and shallow stateLive API
+ +
+ + +
+

Change the name and apply it. Inspect the nested values, ref checks, and flattened snapshot.

+
+ +## Usage + +### Getting the SRef Value + +You can access the value of the sref object using two methods: + +1. `srefObj.value`: Accesses the value directly. +2. `srefObj()`: Invokes the sref object to retrieve its value. + +### Setting the SRef Value + +To update the value of an sref object, you have two options: + +1. `srefObj.value = newValue`: Sets the value directly. +2. `srefObj(newValue)`: Invokes the sref object with the new value to update it. + +## Parameters + +- `value` (optional): Any value that you want to convert into an sref object. The function supports several input types: + + - Basic types such as numbers, strings, booleans, Date etc. + - sref objects. + - objects + - Array, Map, Set. + - `null` or `undefined`. + +## Return Value + +The `sref` function returns an sref object representing the input value. The specific type of the returned sref object depends on the input value's type. + +

For ordinary objects, mutating a nested field does not notify by itself. Replace the object or trigger intentionally.

+ +## Notes + +- `sref` modifies prototype of arrays, maps, and sets to make them reactive. + +- Observers can be attached to the sref object to be notified of changes to its value. + +- The function also supports batch collecting changes and pausing/resuming auto-triggering of observers. +- Every `ref` is an `sref`, but not every `sref` is a `ref`. + +## Example + +```ts +import { sref } from 'regor' + +const initialValue = { + name: 'John', + age: 30, + hobbies: ['reading', 'swimming'], +} + +const mySRef = sref(initialValue) + +// Accessing the sref value using function call +console.log(mySRef()) // Outputs the initial value + +// Accessing the sref value using value getter +console.log(mySRef.value) // Outputs the initial value + +// Updating the sref value +mySRef().name = 'Alice' // Directly modifying the sref value +console.log(mySRef().name) // Outputs 'Alice' + +mySRef({ + name: 'Alice', + age: 35, + hobbies: ['reading', 'swimming'], +}) // Invoking the sref with a new value +console.log(mySRef().age) // Outputs 35 +``` + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/startBatch.md b/docs-site/content/api/startBatch.md deleted file mode 100644 index fdf7fd0..0000000 --- a/docs-site/content/api/startBatch.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: startBatch ---- - -## Overview - -The `startBatch` function is used in conjunction with the `batch` function to batch multiple updates to refs, optimizing performance by reducing the number of observer notifications and triggers during a series of updates. The `startBatch` function initializes a batch operation, and any ref updates made after calling `startBatch` are batched together until the `endBatch` function is called. - -## Usage - -### Starting a Batch - -To start a batch of ref updates, call the `startBatch` function. Once a batch is started, any subsequent changes made to refs are considered part of that batch and are not immediately observed or triggered. Instead, observers are notified only once at the end of the batch. - -```javascript -import { batch, startBatch, endBatch, ref } from 'regor' - -const myRef1 = ref(5) -const myRef2 = ref(10) - -startBatch() // Start a batch - -myRef1.value = 15 -myRef2.value = 20 - -endBatch() // End the batch - -// Observers are notified only once at the end of the batch -// Outputs: -// Observer triggered: 20 -``` - -## Notes - -- The `startBatch` function is used in conjunction with the `endBatch` function to group ref updates together within a batch. After starting a batch with `startBatch`, any subsequent changes to refs are included in that batch until the `endBatch` function is called. - -- Batching updates with the `startBatch` and `endBatch` functions can help improve the performance of your application when multiple changes are made to refs in a short period. It reduces the number of observer notifications and triggers, which can be especially beneficial in situations with complex reactivity logic. - -- It's essential to call the `endBatch` function to finalize the batch and notify observers of the ref updates made during the batch. - -- Important: When using the batch functions, keep in mind that reads of refs within the batch can return potentially stale or outdated values due to pausing auto-updates. Ensure that your code logic accounts for this situation when reading refs within a batch. - -## See Also - -- [`endBatch`](/api/endBatch) -- [`batch`](/api/batch) -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/startBatch.mdx b/docs-site/content/api/startBatch.mdx new file mode 100644 index 0000000..f09fa65 --- /dev/null +++ b/docs-site/content/api/startBatch.mdx @@ -0,0 +1,74 @@ +--- +title: startBatch +description: "Start a manual notification batch to be closed with endBatch." +--- + +startBatchObservation and Batch

Start a manual notification batch to be closed with endBatch.

+ +## Overview + +The `startBatch` function is used in conjunction with the `batch` function to batch multiple updates to refs, optimizing performance by reducing the number of observer notifications and triggers during a series of updates. The `startBatch` function initializes a batch operation, and any ref updates made after calling `startBatch` are batched together until the `endBatch` function is called. + +## Try it live + +
+
Same writes, different notification countsLive API
+ +
+ + +
+

Each action adds three to one ref. Compare plain writes, batch, and a manual start/end pair.

+
+ +## Usage + +### Starting a Batch + +To start a batch of ref updates, call the `startBatch` function. Once a batch is started, any subsequent changes made to refs are considered part of that batch and are not immediately observed or triggered. Instead, observers are notified only once at the end of the batch. + +```javascript +import { batch, startBatch, endBatch, ref } from 'regor' + +const myRef1 = ref(5) +const myRef2 = ref(10) + +startBatch() // Start a batch + +myRef1.value = 15 +myRef2.value = 20 + +endBatch() // End the batch + +// Observers are notified only once at the end of the batch +// Outputs: +// Observer triggered: 20 +``` + +

Put endBatch in finally so an exception cannot leave later notifications inside an unfinished batch.

+ +## Notes + +- The `startBatch` function is used in conjunction with the `endBatch` function to group ref updates together within a batch. After starting a batch with `startBatch`, any subsequent changes to refs are included in that batch until the `endBatch` function is called. + +- Batching updates with the `startBatch` and `endBatch` functions can help improve the performance of your application when multiple changes are made to refs in a short period. It reduces the number of observer notifications and triggers, which can be especially beneficial in situations with complex reactivity logic. + +- It's essential to call the `endBatch` function to finalize the batch and notify observers of the ref updates made during the batch. + +- Important: When using the batch functions, keep in mind that reads of refs within the batch can return potentially stale or outdated values due to pausing auto-updates. Ensure that your code logic accounts for this situation when reading refs within a batch. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/svg.md b/docs-site/content/api/svg.md deleted file mode 100644 index 8ba963a..0000000 --- a/docs-site/content/api/svg.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: svg ---- - -## Overview - -The `svg` function is an alias-style template tag with the same interpolation behavior as `html`, tailored for authoring SVG markup in TypeScript templates. - -## Usage - -```ts -import { svg } from 'regor' - -const radius = 16 -const icon = svg` - -` -``` - -## Parameters - -- `templates` (`TemplateStringsArray`): Static segments of the template literal. -- `...args` (`unknown[]`): Interpolated values inserted between template segments. - -## Return Value - -- Returns a `string` containing the combined SVG markup. - -## Notes - -- `svg` behaves exactly like `html` at runtime (string assembly), so you can use it anywhere a template string is accepted. -- Use `svg` when you want semantic clarity in code and editor hinting for SVG snippets. - -## See Also - -- [html](/api/html) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/svg.mdx b/docs-site/content/api/svg.mdx new file mode 100644 index 0000000..9121882 --- /dev/null +++ b/docs-site/content/api/svg.mdx @@ -0,0 +1,61 @@ +--- +title: svg +description: "Assemble an SVG template string with the same tag behavior as html." +--- + +svgUtilities

Assemble an SVG template string with the same tag behavior as html.

+ +## Overview + +The `svg` function is an alias-style template tag with the same interpolation behavior as `html`, tailored for authoring SVG markup in TypeScript templates. + +## Try it live + +
+
From strings to structured DOMLive API
+ +
+ + +
+

Edit the text, then convert a JSON template into a detached fragment and serialize its element back to JSON.

+
+ +## Usage + +```ts +import { svg } from 'regor' + +const radius = 16 +const icon = svg` + +` +``` + +## Parameters + +- `templates` (`TemplateStringsArray`): Static segments of the template literal. +- `...args` (`unknown[]`): Interpolated values inserted between template segments. + +## Return Value + +- Returns a `string` containing the combined SVG markup. + +

svg assembles a string. The mounting or fragment options determine how nodes are created and bound.

+ +## Notes + +- `svg` behaves exactly like `html` at runtime (string assembly), so you can use it anywhere a template string is accepted. +- Use `svg` when you want semantic clarity in code and editor hinting for SVG snippets. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/toFragment.md b/docs-site/content/api/toFragment.mdx similarity index 50% rename from docs-site/content/api/toFragment.md rename to docs-site/content/api/toFragment.mdx index 7190ec4..f980740 100644 --- a/docs-site/content/api/toFragment.md +++ b/docs-site/content/api/toFragment.mdx @@ -1,11 +1,26 @@ --- title: toFragment +description: "Build a DocumentFragment from a JSON template describing HTML or SVG." --- +toFragmentApp and Components

Build a DocumentFragment from a JSON template describing HTML or SVG.

+ ## Overview The `toFragment` function is used to convert a JSON template, representing HTML or SVG elements, into a DocumentFragment. This can be particularly useful when you want to create a lightweight, in-memory representation of the DOM structure for further manipulation or rendering. +## Try it live + +
+
From strings to structured DOMLive API
+ +
+ + +
+

Edit the text, then convert a JSON template into a detached fragment and serialize its element back to JSON.

+
+ ## Usage ### Converting a JSON Template to a DocumentFragment @@ -25,11 +40,11 @@ const jsonTemplate = { { t: 'h1', a: { class: 'title' }, - d: 'Hello, Regor!', + c: [{ d: 'Hello, Regor!' }], }, { t: 'p', - d: 'Regor is awesome.', + c: [{ d: 'Regor is awesome.' }], }, ], } @@ -54,6 +69,8 @@ targetElement.appendChild(fragment) The `toFragment` function returns a `DocumentFragment` containing the elements created from the provided JSON template(s). +

toFragment builds DOM structure. Use createApp when those nodes should also participate in Regor bindings.

+ ## Notes - The `toFragment` function is useful for creating DocumentFragments that can be used for lightweight rendering and manipulation of DOM structures. @@ -62,14 +79,20 @@ The `toFragment` function returns a `DocumentFragment` containing the elements c - The resulting `DocumentFragment` can be appended to the DOM or further manipulated using standard DOM methods. -- Ensure that the JSON template follows the expected structure with tag names (`t`), attributes (`a`), children (`c`), and text content (`d`) as specified in the parameter descriptions. +- Use `t` for an element, `a` for its attributes, and `c` for its child nodes. A text node uses `d`; element text belongs in a child such as `c: [{ d: 'Hello' }]`. - Custom attribute handling and other options can be configured using the `config` parameter. ## See Also -- [`toJsonTemplate`](/api/toJsonTemplate) -- [`createApp`](/api/createApp) -- [`defineComponent`](/api/defineComponent) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/toJsonTemplate.md b/docs-site/content/api/toJsonTemplate.mdx similarity index 54% rename from docs-site/content/api/toJsonTemplate.md rename to docs-site/content/api/toJsonTemplate.mdx index 5e6bf94..bc1ebab 100644 --- a/docs-site/content/api/toJsonTemplate.md +++ b/docs-site/content/api/toJsonTemplate.mdx @@ -1,7 +1,10 @@ --- title: toJsonTemplate +description: "Convert DOM elements into JSON templates for inspection or later rendering." --- +toJsonTemplateApp and Components

Convert DOM elements into JSON templates for inspection or later rendering.

+ ## Overview The `toJsonTemplate` function is used to convert an HTML element or an array of HTML elements into a JSON structure. This can be useful for: @@ -9,6 +12,18 @@ The `toJsonTemplate` function is used to convert an HTML element or an array of - Rendering HTML content in strict content security policy (CSP) pages. - Improving rendering performance. +## Try it live + +
+
From strings to structured DOMLive API
+ +
+ + +
+

Edit the text, then convert a JSON template into a detached fragment and serialize its element back to JSON.

+
+ ## Usage ### Converting an HTML Element to JSON @@ -47,10 +62,12 @@ The `toJsonTemplate` function returns a JSON structure that represents the HTML - `c` (array): An array of JSON structures representing the child elements of the HTML element. Each child element is converted to a JSON structure and added to this array. -- `d` (string): The text node content of the HTML element. This property is present if the HTML element contains text content. +- `d` (string): The content of a text node. Element text is represented by text-node entries inside `c`. - `n` (number): The node type of the HTML element, specifically for comment nodes. This property is present if the HTML element is a comment node. +

The JSON describes nodes and attributes. Event listeners and app state need their own context and binding step.

+ ## Notes - The `toJsonTemplate` function can handle both single HTML elements and arrays of HTML elements. When converting an array, it returns an array of JSON structures. @@ -63,8 +80,14 @@ The `toJsonTemplate` function returns a JSON structure that represents the HTML ## See Also -- [`toFragment`](/api/toFragment) -- [`createApp`](/api/createApp) -- [`defineComponent`](/api/defineComponent) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/trigger.md b/docs-site/content/api/trigger.md deleted file mode 100644 index 5ac1bd0..0000000 --- a/docs-site/content/api/trigger.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: trigger ---- - -## Overview - -The `trigger` function is used to manually trigger observers and update dependent refs. This function is particularly useful when you need to manually control when ref updates and observer notifications occur. - -## Usage - -### Manually Triggering Observers - -To manually trigger observers for a specific ref, call the `trigger` function with the ref as the `source` argument. This will notify all observers of the ref and update any dependent refs. - -```ts -import { trigger, ref, observe } from 'regor' - -const myRef = ref(5) - -observe(myRef, () => { - console.log('Observer triggered:', myRef.value) -}) - -myRef.value = 10 // The observer is automatically triggered - -// Manually trigger the observer -trigger(myRef) - -// Outputs: -// Observer triggered: 10 -``` - -### Recursive Triggering - -By default, the `trigger` function only notifies observers of the specified ref. If you want to trigger observers recursively for nested refs within arrays, sets, maps, or objects, you can set the `isRecursive` argument to `true`. This will trigger observers for all nested refs. - -```ts -import { trigger, ref, observe } from 'regor' - -const myRef = ref([1, 2, 3]) - -observe(myRef, () => { - console.log('Observer triggered:', myRef.value) -}) - -myRef.value.push(4) // The observer is automatically triggered - -// Manually trigger the observer recursively -trigger(myRef, undefined, true) - -// Outputs: -// Observer triggered: [1, 2, 3, 4] -``` - -## Parameters - -- `source`: The ref for which you want to manually trigger observers. -- `eventSource` (optional): An optional event source that can be provided to identify the source of the trigger. This can be useful for debugging and tracking trigger events. -- `isRecursive` (optional): A boolean flag that, when set to `true`, triggers observers recursively for nested refs within arrays, sets, maps, and objects. By default, this is set to `false`. - -## Notes - -- The `trigger` function is typically used for advanced scenarios where manual control over observer notifications is required. In most cases, observers are automatically notified when a ref's value changes. - -- Recursive triggering can be resource-intensive if there are deep and complex nested structures. Use it judiciously to avoid unnecessary performance overhead. - -## See Also - -- [`ref`](/api/ref) -- [`sref`](/api/sref) -- [`observe`](/api/observe) -- [`unref`](/api/unref) -- [`isRef`](/api/isRef) -- [`isDeepRef`](/api/isDeepRef) -- [`computed`](/api/computeRef) -- [`watchEffect`](/api/watchEffect) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/trigger.mdx b/docs-site/content/api/trigger.mdx new file mode 100644 index 0000000..818201d --- /dev/null +++ b/docs-site/content/api/trigger.mdx @@ -0,0 +1,101 @@ +--- +title: trigger +description: "Notify a ref’s observers explicitly, with optional recursive triggering." +--- + +triggerReactivity

Notify a ref’s observers explicitly, with optional recursive triggering.

+ +## Overview + +The `trigger` function is used to manually trigger observers and update dependent refs. This function is particularly useful when you need to manually control when ref updates and observer notifications occur. + +## Try it live + +
+
Separate stored values from notificationsLive API
+ +
+ + +
+

Pause, write, resume, and trigger. Compare the stored value with what the observer last received.

+
+ +## Usage + +### Manually Triggering Observers + +To manually trigger observers for a specific ref, call the `trigger` function with the ref as the `source` argument. This will notify all observers of the ref and update any dependent refs. + +```ts +import { trigger, ref, observe } from 'regor' + +const myRef = ref(5) + +observe(myRef, () => { + console.log('Observer triggered:', myRef.value) +}) + +myRef.value = 10 // The observer is automatically triggered + +// Manually trigger the observer +trigger(myRef) + +// Outputs: +// Observer triggered: 10 +``` + +### Recursive Triggering + +By default, the `trigger` function only notifies observers of the specified ref. If you want to trigger observers recursively for nested refs within arrays, sets, maps, or objects, you can set the `isRecursive` argument to `true`. This will trigger observers for all nested refs. + +```ts +import { trigger, ref, observe } from 'regor' + +const myRef = ref([1, 2, 3]) + +observe(myRef, () => { + console.log('Observer triggered:', myRef.value) +}) + +myRef.value.push(4) // The observer is automatically triggered + +// Manually trigger the observer recursively +trigger(myRef, undefined, true) + +// Outputs: +// Observer triggered: [1, 2, 3, 4] +``` + +## Parameters + +- `source`: The ref for which you want to manually trigger observers. +- `eventSource` (optional): An optional event source that can be provided to identify the source of the trigger. This can be useful for debugging and tracking trigger events. +- `isRecursive` (optional): A boolean flag that, when set to `true`, triggers observers recursively for nested refs within arrays, sets, maps, and objects. By default, this is set to `false`. + +

Use trigger when a change needs notification beyond the normal setter behavior. Keep recursive triggering scoped to the data that needs it.

+ +## Notes + +- The `trigger` function is typically used for advanced scenarios where manual control over observer notifications is required. In most cases, observers are automatically notified when a ref's value changes. + +- Recursive triggering can be resource-intensive if there are deep and complex nested structures. Use it judiciously to avoid unnecessary performance overhead. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/unbind.md b/docs-site/content/api/unbind.md deleted file mode 100644 index 00ca269..0000000 --- a/docs-site/content/api/unbind.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: unbind ---- - -## Overview - -The `unbind` function in Regor is responsible for removing bound data and associated logic from a DOM node and its descendants. This function is crucial for cleaning up data bindings and event listeners when elements are removed from the DOM or when they are no longer needed. - -## Usage - -### Removing Bound Data and Logic - -The `unbind` function takes a single parameter: - -- `node`: The DOM node from which you want to start the unbinding process. The function will recursively unbind data and logic from this node and its descendants. - -### Example - -```javascript -import { unbind } from 'regor' - -// Remove bound data and associated logic from a DOM node and its descendants -const someElement = document.getElementById('example') -unbind(someElement) -``` - -## Parameters - -- `node`: The DOM node from which you want to start the unbinding process. The function will recursively unbind data and logic from this node and its descendants. - -## Notes - -- The `unbind` function is typically used internally within Regor to clean up data bindings and event listeners associated with DOM nodes that are being removed or are no longer needed. - -- When called on a specific DOM node, the function recursively traverses all child nodes, unbinding data and logic as it goes. - -- The primary purpose of this function is to ensure that there are no memory leaks or lingering event listeners when elements are removed from the DOM. - -- It is essential to call the `unbind` function when elements are removed from the DOM manually or as part of a Regor component's lifecycle management. - -- In most cases, you do not need to call this function explicitly, as Regor handles the unbinding process automatically when components are unmounted or when elements are removed from the DOM through Regor's rendering and cleanup mechanisms. - -## See Also - -- [addUnbinder](/api/addUnbinder) -- [removeNode](/api/removeNode) -- [drainUnbind](/api/drainUnbind) -- [getBindData](/api/getBindData) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/unbind.mdx b/docs-site/content/api/unbind.mdx new file mode 100644 index 0000000..c0c6631 --- /dev/null +++ b/docs-site/content/api/unbind.mdx @@ -0,0 +1,73 @@ +--- +title: unbind +description: "Stop a node’s bindings and descendant listeners while retaining the DOM." +--- + +unbindCleanup and Unbind

Stop a node’s bindings and descendant listeners while retaining the DOM.

+ +## Overview + +The `unbind` function in Regor is responsible for removing bound data and associated logic from a DOM node and its descendants. This function is crucial for cleaning up data bindings and event listeners when elements are removed from the DOM or when they are no longer needed. + +## Try it live + +
+
Own a node through its full lifetimeLive API
+ +
+ + +
+

Mount, write, unbind, or remove and drain. Watch the DOM, observer count, and registered cleanup.

+
+ +## Usage + +### Removing Bound Data and Logic + +The `unbind` function takes a single parameter: + +- `node`: The DOM node from which you want to start the unbinding process. The function will recursively unbind data and logic from this node and its descendants. + +### Example + +```javascript +import { unbind } from 'regor' + +// Remove bound data and associated logic from a DOM node and its descendants +const someElement = document.getElementById('example') +unbind(someElement) +``` + +## Parameters + +- `node`: The DOM node from which you want to start the unbinding process. The function will recursively unbind data and logic from this node and its descendants. + +

The retained node can show its last value while the source continues to change. Remove it separately when its DOM is no longer needed.

+ +## Notes + +- The `unbind` function is typically used internally within Regor to clean up data bindings and event listeners associated with DOM nodes that are being removed or are no longer needed. + +- When called on a specific DOM node, the function recursively traverses all child nodes, unbinding data and logic as it goes. + +- The primary purpose of this function is to ensure that there are no memory leaks or lingering event listeners when elements are removed from the DOM. + +- It is essential to call the `unbind` function when elements are removed from the DOM manually or as part of a Regor component's lifecycle management. + +- In most cases, you do not need to call this function explicitly, as Regor handles the unbinding process automatically when components are unmounted or when elements are removed from the DOM through Regor's rendering and cleanup mechanisms. + +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/unref.md b/docs-site/content/api/unref.md deleted file mode 100644 index 6530da4..0000000 --- a/docs-site/content/api/unref.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: unref ---- - -## Overview - -The `unref` function allows you to safely retrieve the original value from a ref object if the given value is a ref, or it simply returns the value itself if it's not a ref. - -## Usage - -### Unwrapping a Ref - -To safely retrieve the original value from a ref or non-ref value, you can use the `unref` function. - -```ts -import { unref } from 'regor' - -const myValue = /* Your ref or non-ref value here */ - -const unwrappedValue = unref(myValue) -``` - -## Parameters - -- `value`: The value you want to unwrap. It can be a ref object or a non-ref value. - -## Return Value - -- The `unref` function returns the original value if the provided `value` is a ref. If `value` is not a ref, it returns the same `value` itself. - -## Example - -```ts -import { ref, unref } from 'regor' - -const myRef = ref('Hello, Regor!') - -// Unwrapping a ref value -const unwrappedValue = unref(myRef) -console.log(unwrappedValue) // Outputs 'Hello, Regor!' - -const nonRefValue = 'This is not a ref.' - -// Unwrapping a non-ref value (no change) -const sameValue = unref(nonRefValue) -console.log(sameValue) // Outputs 'This is not a ref.' -``` - -## See Also - -- [`ref`](/api/ref) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`observe`](/api/observe) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/unref.mdx b/docs-site/content/api/unref.mdx new file mode 100644 index 0000000..91d3299 --- /dev/null +++ b/docs-site/content/api/unref.mdx @@ -0,0 +1,86 @@ +--- +title: unref +description: "Read one ref layer, or return a non-ref value unchanged." +--- + +unrefReactivity

Read one ref layer, or return a non-ref value unchanged.

+ +## Overview + +The `unref` function allows you to safely retrieve the original value from a ref object if the given value is a ref, or it simply returns the value itself if it's not a ref. + +## Try it live + +
+
Compare deep, copied, and shallow stateLive API
+ +
+ + +
+

Change the name and apply it. Inspect the nested values, ref checks, and flattened snapshot.

+
+ +## Usage + +### Unwrapping a Ref + +To safely retrieve the original value from a ref or non-ref value, you can use the `unref` function. + +```ts +import { unref } from 'regor' + +const myValue = /* Your ref or non-ref value here */ + +const unwrappedValue = unref(myValue) +``` + +## Parameters + +- `value`: The value you want to unwrap. It can be a ref object or a non-ref value. + +## Return Value + +- The `unref` function returns the original value if the provided `value` is a ref. If `value` is not a ref, it returns the same `value` itself. + +## Example + +```ts +import { ref, unref } from 'regor' + +const myRef = ref('Hello, Regor!') + +// Unwrapping a ref value +const unwrappedValue = unref(myRef) +console.log(unwrappedValue) // Outputs 'Hello, Regor!' + +const nonRefValue = 'This is not a ref.' + +// Unwrapping a non-ref value (no change) +const sameValue = unref(nonRefValue) +console.log(sameValue) // Outputs 'This is not a ref.' +``` + +

unref is useful for a value-or-ref input. Use flatten when you need to unwrap a whole nested structure.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/api/useScope.md b/docs-site/content/api/useScope.mdx similarity index 53% rename from docs-site/content/api/useScope.md rename to docs-site/content/api/useScope.mdx index 94843a4..a133c52 100644 --- a/docs-site/content/api/useScope.md +++ b/docs-site/content/api/useScope.mdx @@ -1,13 +1,28 @@ --- title: useScope +description: "Create a context with owned effects and lifecycle cleanup." --- +useScopeLifecycle and Scope

Create a context with owned effects and lifecycle cleanup.

+ ## Overview The `useScope` function allows you to create a scope for an app or composable, enabling you to manage initialization and cleanup tasks specific to that scope. Scopes are useful for organizing and encapsulating logic within your components. Components are always created in scope using `defineComponent` function. +## Try it live + +
+
Setup and cleanup with an ownerLive API
+ +
+ + +
+

Mount the child ticker, then unmount it. The parent keeps totals while the child releases its interval.

+
+ ## Usage ### Creating a Scope @@ -19,13 +34,14 @@ To create a scope for an app or composable, call the `useScope` function and pas import { createApp, defineComponent, html, useScope, onUnmounted, ref, computed, watchEffect } from 'regor' const userRow = defineComponent(html`
`, { - context: () => ({ + context: () => { // Register an onUnmounted callback onUnmounted(() => { // Perform cleanup tasks console.log('Component is unmounted!') }) - }), + return {} + }, }) createApp( @@ -65,6 +81,8 @@ Scopes are especially useful for defining cleanup behavior when a component is u - `context`: The context of the scope that can be used within the component or composable. - `unmount`: A function that, when called, triggers the cleanup tasks registered within the scope. It is automatically being called when the app or component is unmounted. It can be manually caled for custom scopes. +

Use useScope around app setup. A component’s context factory already runs in a component scope.

+ ## Notes - Scopes help you encapsulate and organize component-specific logic, making it easier to manage initialization and cleanup tasks. @@ -73,7 +91,13 @@ Scopes are especially useful for defining cleanup behavior when a component is u ## See Also -- [`onMounted`](/api/onMounted) -- [`onUnmounted`](/api/onUnmounted) + + + [Back to the API list](/api/) + + diff --git a/docs-site/content/api/warningHandler.md b/docs-site/content/api/warningHandler.mdx similarity index 71% rename from docs-site/content/api/warningHandler.md rename to docs-site/content/api/warningHandler.mdx index aa3aeed..db60f4c 100644 --- a/docs-site/content/api/warningHandler.md +++ b/docs-site/content/api/warningHandler.mdx @@ -1,11 +1,18 @@ --- title: warningHandler +description: "Customize Regor’s warning handling and retain a way to restore the previous handler." --- +warningHandlerLogging

Customize Regor’s warning handling and retain a way to restore the previous handler.

+ ## Overview The `warningHandler` is a configuration object in Regor that specifies how warning messages should be handled. Warnings are used to provide developers with information about potential issues or best practices when using the Regor library. +A handler with a restoration path

Install a temporary handler with a matching restore function.

+ + + ## Usage The `warningHandler` object is used to define a function for handling warning messages. By default, it is set to log warning messages to the browser console using `console.warn`. However, you can customize this behavior by providing your own warning handling function. @@ -42,6 +49,8 @@ In a production environment, it is common practice to turn off warning messages This ensures that warnings do not impact the user experience in production while still providing valuable information during development and debugging. +

Install a custom warning policy deliberately, and restore the previous handler when a temporary integration ends.

+ ## Notes - Warnings in Regor are typically used to inform developers about potential issues or best practices related to the usage of the library. They are not errors but serve as helpful hints to improve code quality and maintainability. diff --git a/docs-site/content/api/watchEffect.md b/docs-site/content/api/watchEffect.md deleted file mode 100644 index 7de29f2..0000000 --- a/docs-site/content/api/watchEffect.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: watchEffect ---- - -## Overview - -The `watchEffect` function allows you to create an "effect" that automatically reacts to changes in reactive data, such as ref objects or other observables. This effect is useful for handling side effects, such as updating the UI, in a reactive and efficient manner. - -## Usage - -### Creating Effects - -To create an effect using `watchEffect`, you provide a function that defines the effect. This function will be called immediately and then re-called whenever the reactive data it depends on changes. - -```ts -import { watchEffect, ref } from 'regor' - -const myRef = ref('Hello, Regor!') - -// Create a watch effect -const stopWatching = watchEffect(() => { - console.log('Value:', myRef.value) -}) - -// Later, when the effect is no longer needed, stop it -stopWatching() -``` - -## Parameters - -- `effect`: A function that defines the effect you want to create. This function may optionally receive a callback function (`onCleanup`) as an argument. - -## Return Value - -- The `watchEffect` function returns a `stopWatching` function that allows you to stop the effect when it's no longer needed. Calling `stopWatching` will unsubscribe the effect from the reactive data. - -## Example - -```ts -import { watchEffect, ref } from 'regor' - -const myRef = ref('Hello, Regor!') - -// Create a watch effect that updates the UI -const stopWatching = watchEffect(() => { - console.log('Value:', myRef.value) -}) - -// Later, when the effect is no longer needed, stop it -stopWatching() -``` - -## See Also - -- [`ref`](/api/ref) -- [`useScope`](/api/useScope) -- [`observe`](/api/observe) -- [`observeMany`](/api/observeMany) -- [`isDeepRef`](/api/isDeepRef) -- [`isRef`](/api/isRef) -- [`unref`](/api/unref) -- [`sref`](/api/sref) -- [`flatten`](/api/flatten) -- [`isRaw`](/api/isRaw) -- [`markRaw`](/api/markRaw) -- [`pause`](/api/pause) -- [`resume`](/api/resume) -- [`trigger`](/api/trigger) - -[Back to the API list](/api/) diff --git a/docs-site/content/api/watchEffect.mdx b/docs-site/content/api/watchEffect.mdx new file mode 100644 index 0000000..d4ebb44 --- /dev/null +++ b/docs-site/content/api/watchEffect.mdx @@ -0,0 +1,93 @@ +--- +title: watchEffect +description: "Run an effect immediately, then rerun it when the refs it reads change." +--- + +watchEffectComputed and Effects

Run an effect immediately, then rerun it when the refs it reads change.

+ +## Overview + +The `watchEffect` function allows you to create an "effect" that automatically reacts to changes in reactive data, such as ref objects or other observables. This effect is useful for handling side effects, such as updating the UI, in a reactive and efficient manner. + +## Try it live + +
+
See which reads become dependenciesLive API
+ +
+ + +
+

Change the tracked and silenced values separately. Collect the reads to inspect the dependency count and returned result.

+
+ +## Usage + +### Creating Effects + +To create an effect using `watchEffect`, you provide a function that defines the effect. This function will be called immediately and then re-called whenever the reactive data it depends on changes. + +```ts +import { watchEffect, ref } from 'regor' + +const myRef = ref('Hello, Regor!') + +// Create a watch effect +const stopWatching = watchEffect(() => { + console.log('Value:', myRef.value) +}) + +// Later, when the effect is no longer needed, stop it +stopWatching() +``` + +## Parameters + +- `effect`: A function that defines the effect you want to create. This function may optionally receive a callback function (`onCleanup`) as an argument. + +## Return Value + +- The `watchEffect` function returns a `stopWatching` function that allows you to stop the effect when it's no longer needed. Calling `stopWatching` will unsubscribe the effect from the reactive data. + +## Example + +```ts +import { watchEffect, ref } from 'regor' + +const myRef = ref('Hello, Regor!') + +// Create a watch effect that updates the UI +const stopWatching = watchEffect(() => { + console.log('Value:', myRef.value) +}) + +// Later, when the effect is no longer needed, stop it +stopWatching() +``` + +

Keep unrelated reads outside the effect or wrap them with silence. Use the cleanup callback for resources from an effect run.

+ +## See Also + + + + + +[Back to the API list](/api/) + + diff --git a/docs-site/content/directives/class.md b/docs-site/content/directives/class.mdx similarity index 66% rename from docs-site/content/directives/class.md rename to docs-site/content/directives/class.mdx index a997c00..27727d9 100644 --- a/docs-site/content/directives/class.md +++ b/docs-site/content/directives/class.mdx @@ -1,9 +1,27 @@ --- title: :class Directive +description: "Toggle CSS classes with object, array, or string expressions while retaining static classes." --- The `:class` directive in Regor allows you to dynamically apply CSS classes to HTML elements. It provides a way to bind and update the `class` attribute of an element based on data or expressions. With `:class`, you can create dynamic and responsive class-based styling for your components. + + :classAppearance +

Toggle CSS classes with object, array, or string expressions while retaining static classes.

+
+ +## Try it live + +
+
Give state a visual differenceLive Regor
+ +
+ + +
+

Toggle the two states. The static card class remains while the conditional classes change.

+
+ ## Syntax ```html @@ -70,6 +88,8 @@ The `:class` directive is useful in various scenarios: 4. **Conditional Styling**: You can combine `:class` with `:style` to apply both dynamic styles and classes to elements, providing fine-grained control over the appearance of your components. +

Use conditional classes for meaningful states such as highlighted or muted. Put their visual rules in your stylesheet.

+ ## Notes - The `:class` directive accepts an object, an array, or an expression as its value. In the object form, keys represent class names, and their values determine whether the class should be added (`true`) or removed (`false`). In the array form, each element of the array represents a CSS class name. @@ -83,3 +103,7 @@ The `:class` directive is useful in various scenarios: By using the `:class` directive in your Regor templates, you can create flexible and responsive user interfaces with the ability to toggle, add, or remove classes based on various conditions and user interactions. [Back to the directives](/directives/) + +

Compare classes with inline styles, or return to the directive map.

+ + diff --git a/docs-site/content/directives/context.md b/docs-site/content/directives/context.md deleted file mode 100644 index e45a73f..0000000 --- a/docs-site/content/directives/context.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: :context Directive ---- - -`:context` assigns an object into a component instance context, reactively. -`r-context` is an alias with the same behavior. - -Use it when you want to pass multiple values to a component in one place, including fields that are not declared in `props`. - -## What it does - -```html - - -``` - -In the component, `title` and `theme` become available as component context fields (or update existing ref fields when applicable). -When `pageTitle` or `activeTheme` changes, the component values are updated. - -## When to use `:context` - -Use `:context` for object-style component input. -`r-context` is equivalent and can be used interchangeably. - -Use `:prop-name="value"` or `r-bind:prop-name="value"` (same single-prop binding behavior) when the prop is declared in the component `props` list. - -Use object-form attribute binding (`r-bind="{...}"` or `:="{...}"`) for normal host attribute fallthrough, not for component context assignment. - -## Example - -```html - -``` - -```ts -const UserCard = defineComponent('
...
', { - props: ['userId'], - context: (head) => ({ - userId: head.props.userId, - badge: head.props.badge, - canEdit: head.props.canEdit, - }), -}) -``` - -In this example: - -- `userId` comes from declared prop binding (`:user-id`) -- `badge` and `canEdit` come from `:context` - -[Back to the directives](/directives/) diff --git a/docs-site/content/directives/context.mdx b/docs-site/content/directives/context.mdx new file mode 100644 index 0000000..1b32182 --- /dev/null +++ b/docs-site/content/directives/context.mdx @@ -0,0 +1,78 @@ +--- +title: :context Directive +description: "Pass multiple reactive fields into a component through object-style context input." +--- + +`:context` assigns an object into a component instance context, reactively. +`r-context` is an alias with the same behavior. + +Use it when you want to pass multiple values to a component in one place, including fields that are not declared in `props`. + + + :context / r-contextComposition +

Pass multiple reactive fields into a component through object-style context input.

+
+ +## Try it live + +
+
An object crosses the boundaryLive Regor
+ +
+ + +
+

Edit the parent title and permissions. Object-style input updates the child context.

+
+ +## What it does + +```html + + +``` + +In the component, `title` and `theme` become available as component context fields (or update existing ref fields when applicable). +When `pageTitle` or `activeTheme` changes, the component values are updated. + +## When to use `:context` + +Use `:context` for object-style component input. +`r-context` is equivalent and can be used interchangeably. + +Use `:prop-name="value"` or `r-bind:prop-name="value"` (same single-prop binding behavior) when the prop is declared in the component `props` list. + +Use object-form attribute binding (`r-bind="{...}"` or `:="{...}"`) for normal host attribute fallthrough, not for component context assignment. + +## Example + +```html + +``` + +```ts +const UserCard = defineComponent('
...
', { + props: ['userId'], + context: (head) => ({ + userId: head.props.userId, + badge: head.props.badge, + canEdit: head.props.canEdit, + }), +}) +``` + +In this example: + +- `userId` comes from declared prop binding (`:user-id`) +- `badge` and `canEdit` come from `:context` + +[Back to the directives](/directives/) + +

Use :context for fields in a component context. Object-form r-bind targets host attributes instead.

+ +

Select components dynamically, or return to the directive map.

+ + diff --git a/docs-site/content/directives/demos/bind.ts b/docs-site/content/directives/demos/bind.ts new file mode 100644 index 0000000..596b4a2 --- /dev/null +++ b/docs-site/content/directives/demos/bind.ts @@ -0,0 +1,57 @@ +import { html, ref } from 'regor' + +export function createBind(interactive = false) { + const title = ref('Launch your next idea') + const enabled = ref(true) + const clicks = ref(0) + return { + interactive, + title, + enabled, + clicks, + increment: () => clicks(clicks() + 1), + } +} + +export const bindTemplate = html`
+
+ +
+
+ +
+
+
title
+
{{ title }}
+
+
+
disabled
+
{{ !enabled }}
+
+
+
Clicks
+
{{ clicks }}
+
+
+
+
` diff --git a/docs-site/content/directives/demos/browser.ts b/docs-site/content/directives/demos/browser.ts new file mode 100644 index 0000000..cde0419 --- /dev/null +++ b/docs-site/content/directives/demos/browser.ts @@ -0,0 +1,12 @@ +import { createApp, useScope } from 'regor' +import { directiveExamples } from './examples' + +const element = document.getElementById('directive-demo') +const name = element?.dataset.example +if (element && name && Object.hasOwn(directiveExamples, name)) { + const example = directiveExamples[name as keyof typeof directiveExamples] + createApp( + useScope(() => example.create(true)), + { element, template: example.template }, + ) +} diff --git a/docs-site/content/directives/demos/class.ts b/docs-site/content/directives/demos/class.ts new file mode 100644 index 0000000..d25d3d9 --- /dev/null +++ b/docs-site/content/directives/demos/class.ts @@ -0,0 +1,37 @@ +import { html, ref } from 'regor' + +export function createClass(interactive = false) { + return { interactive, highlighted: ref(true), muted: ref(false) } +} + +export const classTemplate = html`
+
+ +

+ The base class stays. The object expression toggles two additional + classes. +

+
+
+ CLASS LIST / REACTIVEOne card, changing emphasis. +

+ {{ highlighted ? 'is-highlighted' : 'No highlight' }} · {{ muted ? + 'is-muted' : 'Full emphasis' }} +

+
+
` diff --git a/docs-site/content/directives/demos/context.ts b/docs-site/content/directives/demos/context.ts new file mode 100644 index 0000000..56a16ee --- /dev/null +++ b/docs-site/content/directives/demos/context.ts @@ -0,0 +1,45 @@ +import { defineComponent, html, ref } from 'regor' + +export function createContext(interactive = false) { + const ReleaseCard = defineComponent( + html`
+ CHILD CONTEXT / OBJECT INPUT{{ title || 'Untitled release' }} +

+ {{ editable ? 'Editing is available.' : 'This release is read-only.' }} +

+
`, + { + context: () => ({ title: ref(''), editable: ref(false) }), + }, + ) + return { + interactive, + title: ref('Regor release'), + editable: ref(true), + components: { ReleaseCard }, + } +} + +export const contextTemplate = html`
+
+ +
+ +
` diff --git a/docs-site/content/directives/demos/examples.ts b/docs-site/content/directives/demos/examples.ts new file mode 100644 index 0000000..80b32c0 --- /dev/null +++ b/docs-site/content/directives/demos/examples.ts @@ -0,0 +1,33 @@ +import { createText, textTemplate } from './text' +import { createHtml, htmlTemplate } from './html' +import { createBind, bindTemplate } from './bind' +import { createModel, modelTemplate } from './model' +import { createOn, onTemplate } from './on' +import { createShow, showTemplate } from './show' +import { createClass, classTemplate } from './class' +import { createStyle, styleTemplate } from './style' +import { createIf, ifTemplate } from './if' +import { createFor, forTemplate } from './for' +import { createIs, isTemplate } from './is' +import { createContext, contextTemplate } from './context' +import { createRef, refTemplate } from './ref' +import { createPre, preTemplate } from './pre' +import { createTeleport, teleportTemplate } from './teleport' + +export const directiveExamples = { + text: { create: createText, template: textTemplate }, + html: { create: createHtml, template: htmlTemplate }, + bind: { create: createBind, template: bindTemplate }, + model: { create: createModel, template: modelTemplate }, + on: { create: createOn, template: onTemplate }, + show: { create: createShow, template: showTemplate }, + class: { create: createClass, template: classTemplate }, + style: { create: createStyle, template: styleTemplate }, + if: { create: createIf, template: ifTemplate }, + for: { create: createFor, template: forTemplate }, + is: { create: createIs, template: isTemplate }, + context: { create: createContext, template: contextTemplate }, + ref: { create: createRef, template: refTemplate }, + pre: { create: createPre, template: preTemplate }, + teleport: { create: createTeleport, template: teleportTemplate }, +} as const diff --git a/docs-site/content/directives/demos/for.ts b/docs-site/content/directives/demos/for.ts new file mode 100644 index 0000000..90d0509 --- /dev/null +++ b/docs-site/content/directives/demos/for.ts @@ -0,0 +1,49 @@ +import { html, sref } from 'regor' + +const initial = [ + { id: 'design', label: 'Design the interface' }, + { id: 'build', label: 'Connect the state' }, + { id: 'check', label: 'Verify the behavior' }, +] + +export function createFor(interactive = false) { + const rows = sref(initial.map((row) => ({ ...row }))) + return { + interactive, + rows, + reverse: () => rows([...rows()].reverse()), + remove: (id: string) => rows(rows().filter((row) => row.id !== id)), + reset: () => rows(initial.map((row) => ({ ...row }))), + } +} + +export const forTemplate = html`
+
+ +
+
    +
  • +
    + {{ row.label }}key: {{ row.id }} +
    + +
  • +
+

+ The list is empty. Reset it to start again. +

+

+ Reverse the order: stable keys let Regor reuse the existing row elements. +

+
` diff --git a/docs-site/content/directives/demos/html.ts b/docs-site/content/directives/demos/html.ts new file mode 100644 index 0000000..ac7891e --- /dev/null +++ b/docs-site/content/directives/demos/html.ts @@ -0,0 +1,31 @@ +import { html, ref, computed } from 'regor' + +// Only these fixed, trusted strings can reach r-html in this example. +const snippets = { + welcome: 'Welcome aboard. Your workspace is ready.', + update: 'A small update: the next release is in review.', + shortcut: 'Ctrl + K opens search.', +} + +export function createHtml(interactive = false) { + const selected = ref('welcome') + return { interactive, selected, markup: computed(() => snippets[selected()]) } +} + +export const htmlTemplate = html`
+
+ +
+
+ RENDERED HTML +

+
+

+ The preview uses fixed strings. r-html does not sanitize arbitrary content. +

+
` diff --git a/docs-site/content/directives/demos/if.ts b/docs-site/content/directives/demos/if.ts new file mode 100644 index 0000000..cd33272 --- /dev/null +++ b/docs-site/content/directives/demos/if.ts @@ -0,0 +1,37 @@ +import { html, ref } from 'regor' + +export function createIf(interactive = false) { + return { interactive, status: ref('review') } +} + +export const ifTemplate = html`
+
+ +
+
+ R-IF / READYReady to ship. +

All checks passed. The release can move forward.

+
+
+ R-ELSE-IF / REVIEWOne more look. +

The release is waiting for a review.

+
+
+ R-ELSE / BLOCKEDResolve the blocker. +

The release is paused until the issue is fixed.

+
+

+ Exactly one branch is mounted. Switching status replaces it. +

+
` diff --git a/docs-site/content/directives/demos/is.ts b/docs-site/content/directives/demos/is.ts new file mode 100644 index 0000000..5c3e5ab --- /dev/null +++ b/docs-site/content/directives/demos/is.ts @@ -0,0 +1,42 @@ +import { defineComponent, html, ref } from 'regor' + +export function createIs(interactive = false) { + const SummaryCard = defineComponent( + html`
+ SUMMARY COMPONENTRelease 1.0 +

A compact view of the upcoming release.

+
`, + ) + const DetailCard = defineComponent( + html`
+ DETAIL COMPONENTRelease 1.0 +
    +
  • State and templates connected
  • +
  • Keyboard interactions reviewed
  • +
  • Cleanup verified
  • +
+
`, + ) + return { + interactive, + selected: ref('SummaryCard'), + components: { SummaryCard, DetailCard }, + } +} + +export const isTemplate = html`
+
+ +
+
+

+ The selected name resolves to a registered component. Changing it mounts the + other template. +

+
` diff --git a/docs-site/content/directives/demos/model.ts b/docs-site/content/directives/demos/model.ts new file mode 100644 index 0000000..299d64a --- /dev/null +++ b/docs-site/content/directives/demos/model.ts @@ -0,0 +1,78 @@ +import { html, ref } from 'regor' + +export function createModel(interactive = false) { + const name = ref('Ada') + const seats = ref(3) + const email = ref(true) + const plan = ref('Team') + const reset = () => { + name('Ada') + seats(3) + email(true) + plan('Team') + } + return { interactive, name, seats, email, plan, reset } +} + +export const modelTemplate = html`
+
+ + + + +
+
+ FORM STATE / TWO WAYS +
+
+
Name
+
{{ name || 'Not set' }}
+
+
+
Seats
+
{{ seats }}
+
+
+
Plan
+
{{ plan }}
+
+
+
Email
+
{{ email ? 'Enabled' : 'Disabled' }}
+
+
+

Controls update state. Resetting state updates the controls.

+
+
` diff --git a/docs-site/content/directives/demos/on.ts b/docs-site/content/directives/demos/on.ts new file mode 100644 index 0000000..a3e34b1 --- /dev/null +++ b/docs-site/content/directives/demos/on.ts @@ -0,0 +1,35 @@ +import { html, ref } from 'regor' + +export function createOn(interactive = false) { + const message = ref('Ship something useful') + const submissions = ref(0) + const lastMessage = ref('Nothing submitted yet.') + const submit = () => { + submissions(submissions() + 1) + lastMessage(message().trim() || 'An empty message') + } + return { interactive, message, submissions, lastMessage, submit } +} + +export const onTemplate = html`
+
+ +

+ Press Enter or click Submit. .prevent keeps the page in place. No message + is sent. +

+
+
+ SUBMIT EVENT / HANDLED{{ submissions }} +

{{ lastMessage }}

+
+
` diff --git a/docs-site/content/directives/demos/pre.ts b/docs-site/content/directives/demos/pre.ts new file mode 100644 index 0000000..8660f11 --- /dev/null +++ b/docs-site/content/directives/demos/pre.ts @@ -0,0 +1,32 @@ +import { html, ref } from 'regor' + +export function createPre(interactive = false) { + return { interactive, message: ref('This part is reactive.') } +} + +export const preTemplate = html`
+
+ +
+
+
+ NORMAL SUBTREE +

{{ message }}

+
+
+ R-PRE SUBTREE +

{{ message }}

+
+
+

+ The r-pre subtree keeps its literal interpolation syntax. +

+
` diff --git a/docs-site/content/directives/demos/ref.ts b/docs-site/content/directives/demos/ref.ts new file mode 100644 index 0000000..66524ba --- /dev/null +++ b/docs-site/content/directives/demos/ref.ts @@ -0,0 +1,35 @@ +import { html, ref, sref } from 'regor' + +export function createRef(interactive = false) { + const input = sref(null) + const focused = ref(false) + return { + interactive, + input, + focused, + focus: () => input()?.focus(), + onFocus: () => focused(true), + onBlur: () => focused(false), + } +} + +export const refTemplate = html`
+
+ +
+

+ {{ focused ? 'The referenced input has focus.' : 'Click the button to focus + the input directly.' }} +

+
` diff --git a/docs-site/content/directives/demos/show.ts b/docs-site/content/directives/demos/show.ts new file mode 100644 index 0000000..4952b44 --- /dev/null +++ b/docs-site/content/directives/demos/show.ts @@ -0,0 +1,26 @@ +import { html, ref } from 'regor' + +export function createShow(interactive = false) { + const visible = ref(true) + return { interactive, visible, toggle: () => visible(!visible()) } +} + +export const showTemplate = html`
+
+ display: {{ visible ? 'visible' : 'none' }} +
+
+ +
+

+ Edit the draft, hide it, and show it again. The element stays mounted; its + display changes. +

+
` diff --git a/docs-site/content/directives/demos/style.ts b/docs-site/content/directives/demos/style.ts new file mode 100644 index 0000000..8b1403a --- /dev/null +++ b/docs-site/content/directives/demos/style.ts @@ -0,0 +1,40 @@ +import { computed, html, ref } from 'regor' + +export function createStyle(interactive = false) { + const fill = ref(65) + const rounded = ref(true) + const barStyle = computed(() => ({ + width: `${fill()}%`, + borderRadius: rounded() ? '12px' : '0px', + })) + return { interactive, fill, rounded, barStyle } +} + +export const styleTemplate = html`
+
+ +
+
+
{{ fill }}%
+
+

+ A computed style object controls width and borderRadius. +

+
` diff --git a/docs-site/content/directives/demos/teleport.ts b/docs-site/content/directives/demos/teleport.ts new file mode 100644 index 0000000..220ef2e --- /dev/null +++ b/docs-site/content/directives/demos/teleport.ts @@ -0,0 +1,47 @@ +import { html, ref } from 'regor' + +export function createTeleport(interactive = false) { + const active = ref(true) + return { + interactive, + active, + message: ref('Still bound to the source context.'), + toggle: () => active(!active()), + } +} + +export const teleportTemplate = html`
+
+ +
+
+
+ SOURCE / DECLARED HERE +

The message's template starts in this region.

+
+ {{ message }} +
+
+
+ TARGET / RENDERED HERE +
+
+
+

+ The element moves to the target. Its bindings still read the source context. +

+
` diff --git a/docs-site/content/directives/demos/text.ts b/docs-site/content/directives/demos/text.ts new file mode 100644 index 0000000..a944fbf --- /dev/null +++ b/docs-site/content/directives/demos/text.ts @@ -0,0 +1,30 @@ +import { html, ref } from 'regor' + +export function createText(interactive = false) { + return { interactive, message: ref('Hello, Regor.') } +} + +export const textTemplate = html`
+
+ +

+ Try typing <strong>Hello</strong>. It stays text. +

+
+
+ TEXT CONTENT / LIVE +
+
` diff --git a/docs-site/content/directives/index.md b/docs-site/content/directives/index.md deleted file mode 100644 index 40dfb85..0000000 --- a/docs-site/content/directives/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Directives -order: 5 ---- - -Directives are Regor’s runtime template control surface. - -By default, directive names start with `r-`. You can customize the prefix with `RegorConfig`. - -## Core Rules - -1. `r-` directives are explicit full-form syntax. -2. `:` is shorthand for `r-bind`. -3. `@` is shorthand for `r-on`. -4. `.` shorthand binds DOM properties (equivalent to `r-bind.prop`). - -## Binding - -1. [`r-text`](/directives/r-text): text content binding. -2. [`r-html`](/directives/r-html): HTML content binding. -3. [`r-bind`](/directives/r-bind): attributes/properties/object binding. -4. [`r-model`](/directives/r-model): form two-way binding. -5. [`r-on`](/directives/r-on): event binding. -6. [`r-show`](/directives/r-show): conditional visibility. -7. [`:class`](/directives/class): dynamic class binding. -8. [`:style`](/directives/style): dynamic style binding. - -## Control Flow - -1. [`r-if`](/directives/r-if), `r-else-if`, `r-else`: conditional branches. -2. [`r-for`](/directives/r-for): list/object iteration with keying support. - -## Component and Utility - -1. [`:is`](/directives/is): dynamic component selection. -2. [`:context`](/directives/context): component prop object binding. -3. [`:ref`](/directives/ref): element/component references. -4. [`r-pre`](/directives/r-pre): skip compilation for subtree. -5. [`r-teleport`](/directives/r-teleport): move DOM subtree to another target. - -## Important Keying Note - -In `r-for`, both `key="row.id"` and `:key="row.id"` are expression bindings in Regor templates. Both are supported. Nested paths like `a.b.c.d` are supported. - -Use stable keys whenever list identity matters. - -## Recommendation - -Read in this order: - -1. [`r-bind`](/directives/r-bind) -2. [`r-text`](/directives/r-text) -3. [`r-if`](/directives/r-if) -4. [`r-for`](/directives/r-for) -5. [`r-model`](/directives/r-model) diff --git a/docs-site/content/directives/index.mdx b/docs-site/content/directives/index.mdx new file mode 100644 index 0000000..1962515 --- /dev/null +++ b/docs-site/content/directives/index.mdx @@ -0,0 +1,80 @@ +--- +title: Directives +description: "Explore every Regor directive through focused live examples and syntax references." +order: 5 +--- + +Directives are Regor’s runtime template control surface. + +By default, directive names start with `r-`. You can customize the prefix with `RegorConfig`. + +BindingsControl flowComposition

Choose a directive by the behavior you need. Every topic below has a live preview with its actual source.

+ +## Core Rules + +1. `r-` directives are explicit full-form syntax. +2. `:` is shorthand for `r-bind`. +3. `@` is shorthand for `r-on`. +4. `.` shorthand binds DOM properties (equivalent to `r-bind.prop`). + +## Try it live + +
+
From form controls to stateLive Regor
+ +
+ + +
+

A small form brings r-model, event handling, and text bindings together. Open any directive below for a focused example.

+
+ +## Binding + + + r-text

r-text

Bind expressions to textContent and display text without interpreting it as HTML.

Explore r-text
+ r-html

r-html

Render trusted HTML strings and understand the boundary between text and markup.

Explore r-html
+ r-bind / : / .

r-bind

Bind attributes, DOM properties, and object values to reactive expressions.

Explore r-bind
+ r-model

r-model

Connect form controls and writable refs in both directions, with optional conversion modifiers.

Explore r-model
+ r-on / @

r-on

Handle DOM events with methods, expressions, and modifiers such as .prevent and .stop.

Explore r-on
+ r-show

r-show

Toggle visibility through display while keeping the element and its bindings mounted.

Explore r-show
+ :class

:class

Toggle CSS classes with object, array, or string expressions while retaining static classes.

Explore :class
+ :style

:style

Bind inline CSS values to state and computed style objects.

Explore :style
+
+ +## Control Flow + + + r-if / r-else-if / r-else

r-if

Mount one conditional branch at a time and remove the branch that no longer matches.

Explore r-if
+ r-for + :key

r-for + :key

Render reactive collections with stable keys that preserve each item’s identity.

Explore r-for + :key
+
+ +## Component and Utility + + + :is

:is

Select and mount registered components dynamically from a reactive value.

Explore :is
+ :context / r-context

:context

Pass multiple reactive fields into a component through object-style context input.

Explore :context
+ :ref

:ref

Capture element references to focus controls or integrate directly with DOM APIs.

Explore :ref
+ r-pre

r-pre

Leave a subtree uncompiled and preserve literal template syntax.

Explore r-pre
+ r-teleport

r-teleport

Move a subtree to a target selector while preserving its original binding context.

Explore r-teleport
+
+ +

Use stable, unique item identities when a collection can reorder, filter, or remove rows.

+ +## Important Keying Note + +In `r-for`, both `key="row.id"` and `:key="row.id"` are expression bindings in Regor templates. Both are supported. Nested paths like `a.b.c.d` are supported. + +Use stable keys whenever list identity matters. + +## Recommendation + +Read in this order: + +1. [`r-bind`](/directives/r-bind) +2. [`r-text`](/directives/r-text) +3. [`r-if`](/directives/r-if) +4. [`r-for`](/directives/r-for) +5. [`r-model`](/directives/r-model) + + diff --git a/docs-site/content/directives/is.md b/docs-site/content/directives/is.mdx similarity index 61% rename from docs-site/content/directives/is.md rename to docs-site/content/directives/is.mdx index 1a7412f..855c6ca 100644 --- a/docs-site/content/directives/is.md +++ b/docs-site/content/directives/is.mdx @@ -1,9 +1,27 @@ --- title: :is Directive +description: "Select and mount registered components dynamically from a reactive value." --- The `:is` directive in Regor allows you to dynamically render components based on a value or expression. It provides a way to conditionally choose which component to render in a template, enabling you to create dynamic and flexible user interfaces. + + :isComposition +

Select and mount registered components dynamically from a reactive value.

+
+ +## Try it live + +
+
Choose the component to renderLive Regor
+ +
+ + +
+

Switch between summary and detail. Each choice is a separate registered component.

+
+ ## Syntax ```html @@ -36,7 +54,7 @@ import { componentA, componentB } from 'components' const showComponentA = ref(true) const currentComponent = computed(() => - showComponentA ? componentA : componentB, + showComponentA() ? componentA : componentB, ) createApp({ components: { @@ -62,6 +80,8 @@ The `:is` directive is valuable in several scenarios: 4. **Component-Based Routing**: When working with component-based routing libraries, you can use `:is` to render components based on the current route. +

The selected name must resolve to a registered component. Changing it replaces the previous component instance.

+ ## Notes - The `:is` directive expects a component name or variable that represents the component to render. This can be a reference to a component or a dynamically determined component name. @@ -73,3 +93,7 @@ The `:is` directive is valuable in several scenarios: By using the `:is` directive in your Regor templates, you can take advantage of dynamic component rendering to create versatile and interactive web applications. [Back to the directives](/directives/) + +

Pass an object into a component, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-bind.md b/docs-site/content/directives/r-bind.mdx similarity index 51% rename from docs-site/content/directives/r-bind.md rename to docs-site/content/directives/r-bind.mdx index 43ae0a0..650223e 100644 --- a/docs-site/content/directives/r-bind.md +++ b/docs-site/content/directives/r-bind.mdx @@ -1,11 +1,29 @@ --- title: r-bind Directive +description: "Bind attributes, DOM properties, and object values to reactive expressions." --- `r-bind` is Regor’s generic binding directive. It maps to attribute binding by default, with property binding available via shorthand/flag. + + r-bind / : / .Binding +

Bind attributes, DOM properties, and object values to reactive expressions.

+
+ +## Try it live + +
+
Attributes and properties in syncLive Regor
+ +
+ + +
+

Edit the title or disable the button. Inspect its tooltip, accessible name, and disabled property.

+
+ ## Syntax ```html @@ -56,6 +74,8 @@ For template-authored dynamic option keys, Regor uses normalized dynamic markers When dynamic **attribute** key changes, previous attribute is removed and new attribute is set. +

Use :title for an attribute and .disabled for the DOM property. The preview shows both changing from the same context.

+ ## Notes 1. Attribute path handles boolean attributes and `xlink:*` attributes. @@ -78,3 +98,7 @@ When dynamic **attribute** key changes, previous attribute is removed and new at 4. [r-for](/directives/r-for) + +

Bind form state in two directions, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-for.md b/docs-site/content/directives/r-for.mdx similarity index 53% rename from docs-site/content/directives/r-for.md rename to docs-site/content/directives/r-for.mdx index 9d876cc..14453ea 100644 --- a/docs-site/content/directives/r-for.md +++ b/docs-site/content/directives/r-for.mdx @@ -1,9 +1,27 @@ --- title: r-for Directive +description: "Render reactive collections with stable keys that preserve each item’s identity." --- `r-for` renders repeated template instances from arrays, iterables, and object-like values. + + r-for + :keyControl flow +

Render reactive collections with stable keys that preserve each item’s identity.

+
+ +## Try it live + +
+
A list with stable identityLive Regor
+ +
+ + +
+

Reverse the list or remove rows. Keys let surviving items keep their DOM elements.

+
+ ## Usage ```html @@ -107,8 +125,14 @@ const tableRow = defineComponent( 3. Avoid expensive per-row expressions in large lists. 4. Prefer pagination/windowing for very large data sets. +

Use row.id when it is stable and unique. The row position changes when you reorder a list.

+ ## See Also 1. [r-if](/directives/r-if) 2. [r-bind](/directives/r-bind) 3. [r-text](/directives/r-text) + +

Add conditional empty states, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-html.md b/docs-site/content/directives/r-html.mdx similarity index 54% rename from docs-site/content/directives/r-html.md rename to docs-site/content/directives/r-html.mdx index 4311d14..5f41263 100644 --- a/docs-site/content/directives/r-html.md +++ b/docs-site/content/directives/r-html.mdx @@ -1,9 +1,27 @@ --- title: r-html Directive +description: "Render trusted HTML strings and understand the boundary between text and markup." --- The `r-html` directive is used to render HTML content within an HTML element based on the result of an expression. It allows you to dynamically insert and update HTML markup inside an element. + + r-htmlBinding +

Render trusted HTML strings and understand the boundary between text and markup.

+
+ +## Try it live + +
+
Markup, rendered as markupLive Regor
+ +
+ + +
+

Choose a fixed trusted snippet. Strong text, emphasis, and keyboard tags render as HTML.

+
+ ## Syntax ```html @@ -27,6 +45,8 @@ The `r-html` directive is particularly useful when you need to display content w In this example, the HTML content inside the `

` element will be dynamically updated based on the value of the `dynamicHtml` property in your component's data. Any changes to the `dynamicHtml` property will automatically reflect in the rendered HTML content. +

r-html writes innerHTML. It does not sanitize content, and inserted markup is not compiled as a Regor template.

+ ## Notes - The `r-html` directive renders HTML content, including tags and elements. Be cautious when using this directive with user-generated or untrusted content to prevent security vulnerabilities like Cross-Site Scripting (XSS) attacks. @@ -50,3 +70,7 @@ In this example, if the `dynamicHtmlContent` property in your component's data i The `r-html` directive empowers you to create dynamic and interactive user interfaces that incorporate rich HTML content, making your Regor-powered applications more versatile and engaging. [Back to the directives](/directives/) + +

Compare HTML with text, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-if.md b/docs-site/content/directives/r-if.mdx similarity index 68% rename from docs-site/content/directives/r-if.md rename to docs-site/content/directives/r-if.mdx index cd652ac..d94da34 100644 --- a/docs-site/content/directives/r-if.md +++ b/docs-site/content/directives/r-if.mdx @@ -1,9 +1,27 @@ --- title: r-if +description: "Mount one conditional branch at a time and remove the branch that no longer matches." --- In Regor, conditional rendering allows you to control the visibility of elements in your templates based on the evaluation of expressions. You can conditionally render elements, provide alternatives, and create complex conditional structures using the following directives: + + r-if / r-else-if / r-elseControl flow +

Mount one conditional branch at a time and remove the branch that no longer matches.

+
+ +## Try it live + +
+
One condition, one mounted viewLive Regor
+ +
+ + +
+

Switch the release status. Only the matching branch is mounted.

+
+ ## `r-if` Directive The `r-if` directive is used to conditionally render an element based on the truthiness of an expression. It allows you to control whether an element should be displayed or omitted from the rendered output. @@ -97,6 +115,8 @@ To use the `r-else-if` directive, place it after an `r-if` directive or another In this example, different greetings are displayed based on the user's role. The first paragraph is displayed for premium users, the second for regular users, and the third for non-logged-in users. +

Changing branches removes the previous subtree. Use r-show when you want to preserve a mounted element and hide it instead.

+ ## Notes - You can create complex conditional structures by combining `r-if`, `r-else`, and `r-else-if` directives within your templates. @@ -105,3 +125,7 @@ In this example, different greetings are displayed based on the user's role. The Conditional rendering directives in Regor empower you to create dynamic and context-aware user interfaces, improving the user experience of your applications. [Back to the directives](/directives/) + +

Compare mounting with visibility, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-model.md b/docs-site/content/directives/r-model.mdx similarity index 70% rename from docs-site/content/directives/r-model.md rename to docs-site/content/directives/r-model.mdx index 109bab2..bcc43b2 100644 --- a/docs-site/content/directives/r-model.md +++ b/docs-site/content/directives/r-model.mdx @@ -1,9 +1,27 @@ --- title: r-model Directive +description: "Connect form controls and writable refs in both directions, with optional conversion modifiers." --- The `r-model` directive provides two-way data binding for form elements in your Regor components. It allows you to bind the value of form inputs to a component's data, ensuring that changes to the input are reflected in the component's data and vice versa. + + r-modelForms +

Connect form controls and writable refs in both directions, with optional conversion modifiers.

+
+ +## Try it live + +
+
A form and its state, connectedLive Regor
+ +
+ + +
+

Change the controls, then reset from state. Both directions update the same view.

+
+ ## Syntax ```html @@ -92,6 +110,8 @@ In this example, the `r-model` directive is used with a multi-select dropdown. T ## Modifiers +The live preview passes the trim option explicitly as a second expression: `r-model="name, { trim: true }"`. This trims the value written to the ref as you type. + The `r-model` directive supports modifiers to enable additional behavior on the bound element. Modifiers are added to the directive with a dot notation. ### Example with Modifiers @@ -103,17 +123,19 @@ The `r-model` directive supports modifiers to enable additional behavior on the ``` -In this example, the `.trim` modifier is used to trim any leading or trailing whitespace from the input's value before binding it to the `trimmedMessage` property. +The `.trim` modifier trims the text control when it emits `change`. The live preview uses the explicit `trim` option to trim the bound state as you type. #### Available Modifiers -- `.trim`: Removes leading and trailing whitespace from the input's value. +- `.trim`: Removes leading and trailing whitespace from the text control on `change`. Use the explicit `trim` option above to trim the bound value during input. - `.lazy`: Updates the component's data property only when the input element emits the `change` event (useful for input fields that have debounced input events). - `.number`: Converts the input's value to a numeric type (e.g., `Number`) before binding it to the data property. - `.int`: Converts the input's value to an integer type (e.g., `parseInt`) before binding it to the data property. You can use these modifiers individually or combine them to achieve the desired behavior for your form elements. +

Computed values are read-only. Bind r-model to a writable ref, then derive summaries from that state.

+ ## Notes - The `r-model` directive is ideal for creating interactive forms and ensuring that user input is synchronized with your component's data. @@ -129,3 +151,7 @@ You can use these modifiers individually or combine them to achieve the desired The `r-model` directive simplifies the process of creating interactive forms in your Regor-powered applications by enabling two-way data binding between form elements and your component's data properties. It ensures that your forms remain in sync with the underlying data, providing a seamless user experience. [Back to the directives](/directives/) + +

Handle form events, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-on.md b/docs-site/content/directives/r-on.mdx similarity index 69% rename from docs-site/content/directives/r-on.md rename to docs-site/content/directives/r-on.mdx index 39b4196..1ed07d1 100644 --- a/docs-site/content/directives/r-on.md +++ b/docs-site/content/directives/r-on.mdx @@ -1,10 +1,28 @@ --- title: r-on Directive +description: "Handle DOM events with methods, expressions, and modifiers such as .prevent and .stop." --- The `r-on` directive in Regor is used to attach event listeners to HTML elements and invoke specified component methods when those events occur. It provides a way to make your components interactive and responsive to user actions. + + r-on / @Events +

Handle DOM events with methods, expressions, and modifiers such as .prevent and .stop.

+
+ +## Try it live + +
+
Handle a submit without leavingLive Regor
+ +
+ + +
+

Submit by button or keyboard. The local handler updates state and .prevent stops navigation.

+
+ ## Usage The `r-on` directive is typically used in the following format: @@ -28,7 +46,7 @@ You can use the shorthand notation `@` to achieve the same effect as `r-on`. For ### Supported Flags -The `r-on` directive supports various flags that allow you to customize event handling behavior. Flags are added to the event name and are separated by commas. Here are the available flags: +The `r-on` directive supports flags that customize event handling behavior. Add them to the event name with dots, as in `@click.stop.prevent`. Here are the available flags: - `stop`: Stops event propagation, preventing it from bubbling up the DOM tree. - `prevent`: Prevents the default behavior of the event from occurring (e.g., form submission). @@ -94,6 +112,8 @@ You can use object syntax with the `r-on` directive to attach multiple event lis In the above example, the element will have multiple event listeners attached, each invoking a different component method when the specified events occur. +

Use .prevent to stop the default browser action and .stop to stop propagation. They control different parts of an event.

+ ## Notes - The `r-on` directive is a powerful tool for making your components interactive by listening to DOM events. @@ -119,3 +139,7 @@ In the above example, the element will have multiple event listeners attached, e - [r-show Directive](/directives/r-show) [Back to the directives](/directives) + +

Connect your input to state, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-pre.md b/docs-site/content/directives/r-pre.mdx similarity index 59% rename from docs-site/content/directives/r-pre.md rename to docs-site/content/directives/r-pre.mdx index 49a7174..c2f31c9 100644 --- a/docs-site/content/directives/r-pre.md +++ b/docs-site/content/directives/r-pre.mdx @@ -1,9 +1,27 @@ --- title: r-pre Directive +description: "Leave a subtree uncompiled and preserve literal template syntax." --- The `r-pre` directive is a utility directive in Regor that allows you to exclude specific HTML elements from Regor's data binding and templating. This directive is useful when you want to preserve certain parts of your HTML markup as static content that should not be subject to data binding or dynamic updates. + + r-preDOM utilities +

Leave a subtree uncompiled and preserve literal template syntax.

+
+ +## Try it live + +
+
Reactive next to literalLive Regor
+ +
+ + +
+

Edit the message. One subtree updates; the r-pre subtree keeps its literal braces.

+
+ ## Syntax ```html @@ -41,6 +59,8 @@ The `r-pre` directive is helpful in various scenarios, including: 3. **Embedding Third-Party Widgets**: When embedding third-party widgets or components that rely on their own JavaScript, applying `r-pre` ensures that Regor doesn't interfere with the widget's functionality. +

r-pre skips Regor compilation of its subtree. It is useful for literal examples and content owned by another system.

+ ## Notes - Elements marked with `r-pre` will not participate in data binding or template rendering. Therefore, any expressions or variables within those elements will not be evaluated or updated by Regor. @@ -50,3 +70,7 @@ The `r-pre` directive is helpful in various scenarios, including: By using the `r-pre` directive in your Regor templates, you can effectively manage which parts of your HTML are subject to data binding and dynamic updates and which parts remain static and unaltered. This flexibility allows you to create dynamic and interactive user interfaces while preserving the integrity of your existing HTML content. [Back to the directives](/directives/) + +

Bind the text that should update, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-show.md b/docs-site/content/directives/r-show.mdx similarity index 59% rename from docs-site/content/directives/r-show.md rename to docs-site/content/directives/r-show.mdx index 459df60..ad1c569 100644 --- a/docs-site/content/directives/r-show.md +++ b/docs-site/content/directives/r-show.mdx @@ -1,9 +1,27 @@ --- title: r-show Directive +description: "Toggle visibility through display while keeping the element and its bindings mounted." --- The `r-show` directive is used to conditionally display or hide an HTML element based on the truthiness of an expression. It allows you to control the visibility of an element dynamically. + + r-showVisibility +

Toggle visibility through display while keeping the element and its bindings mounted.

+
+ +## Try it live + +
+
Hide a view, keep its DOMLive Regor
+ +
+ + +
+

Edit the local draft, then hide and show it. The same input element remains in the DOM.

+
+ ## Syntax ```html @@ -29,6 +47,8 @@ The `r-show` directive is useful when you want to toggle the visibility of an el In this example, the `

` element will be displayed if the `isContentVisible` property in your component's data is `true`. If `isContentVisible` becomes `false`, the element will be hidden. +

r-show changes display. Use r-if when a subtree should be mounted or removed with the condition.

+ ## Notes - The `r-show` directive operates by toggling the element's `display` CSS property. When the expression evaluates to `true`, the `display` property is set to its default value (usually `"block"` or `"inline"`), making the element visible. When the expression evaluates to `false`, the `display` property is set to `"none"`, hiding the element. @@ -53,3 +73,7 @@ In this example, clicking the "Toggle Visibility" button will trigger the `toggl The `r-show` directive provides a straightforward way to implement conditional visibility in your Regor-powered applications, making it easier to control what content is displayed to users in response to various conditions and interactions. [Back to the directives](/directives/) + +

Compare visibility with conditional mounting, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-teleport.md b/docs-site/content/directives/r-teleport.md deleted file mode 100644 index b5f2be2..0000000 --- a/docs-site/content/directives/r-teleport.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: r-teleport Directive ---- - -The `r-teleport` directive in Regor is a straightforward directive that empowers you to move an element anywhere within your document's DOM structure. This can be especially useful when you need to dynamically relocate elements to different parts of your web page. - -## Usage - -To utilize the `r-teleport` directive, follow this basic syntax: - -```html - -``` - -- `element`: The HTML element you wish to teleport/move. -- `targetSelector`: A selector indicating the destination where you want to place the element. - -## Example - -Here's an example of how you can employ the `r-teleport` directive: - -```html - -
-
This element will be teleported.
-
-``` - -In this example, the content inside the `
` with the ID "my-element" is moved to the element with the ID "destination" using the `r-teleport` directive. - -## Notes - -- The `r-teleport` directive allows you to dynamically reposition elements within the DOM structure, enhancing flexibility and interactivity in your web applications. - -- It works by selecting a target element based on a CSS selector (`targetSelector`) and moving the element to that location in the document. - -- This directive can be particularly handy for creating dynamic UIs and interactive web pages. - -- You can use this directive in combination with other Regor directives and features to create rich and dynamic web applications. - -## See Also - -- [r-bind Directive](/directives/r-bind) -- [r-model Directive](/directives/r-model) -- [r-text Directive](/directives/r-text) -- [r-html Directive](/directives/r-html) -- [r-on Directive](/directives/r-on) -- [r-show Directive](/directives/r-show) - -[Back to the directives](/directives/) diff --git a/docs-site/content/directives/r-teleport.mdx b/docs-site/content/directives/r-teleport.mdx new file mode 100644 index 0000000..baeb6b9 --- /dev/null +++ b/docs-site/content/directives/r-teleport.mdx @@ -0,0 +1,74 @@ +--- +title: r-teleport Directive +description: "Move a subtree to a target selector while preserving its original binding context." +--- + +The `r-teleport` directive in Regor is a straightforward directive that empowers you to move an element anywhere within your document's DOM structure. This can be especially useful when you need to dynamically relocate elements to different parts of your web page. + + + r-teleportDOM utilities +

Move a subtree to a target selector while preserving its original binding context.

+
+ +## Try it live + +
+
Move the DOM, keep the contextLive Regor
+ +
+ + +
+

Edit the source message. It renders in the target region, and unmounting removes it there too.

+
+ +## Usage + +To utilize the `r-teleport` directive, follow this basic syntax: + +```html + +``` + +- `element`: The HTML element you wish to teleport/move. +- `targetSelector`: A selector indicating the destination where you want to place the element. + +## Example + +Here's an example of how you can employ the `r-teleport` directive: + +```html + +
+
This element will be teleported.
+
+``` + +In this example, the outer `
` and its contents move under the element with ID `destination`. Their bindings continue to read the original context. + +

Use a selector that resolves to the intended destination. Moving the DOM does not change which context its bindings read.

+ +## Notes + +- The `r-teleport` directive allows you to dynamically reposition elements within the DOM structure, enhancing flexibility and interactivity in your web applications. + +- It works by selecting a target element based on a CSS selector (`targetSelector`) and moving the element to that location in the document. + +- This directive can be particularly handy for creating dynamic UIs and interactive web pages. + +- You can use this directive in combination with other Regor directives and features to create rich and dynamic web applications. + +## See Also + +- [r-bind Directive](/directives/r-bind) +- [r-model Directive](/directives/r-model) +- [r-text Directive](/directives/r-text) +- [r-html Directive](/directives/r-html) +- [r-on Directive](/directives/r-on) +- [r-show Directive](/directives/r-show) + +[Back to the directives](/directives/) + +

Access elements directly, or return to the directive map.

+ + diff --git a/docs-site/content/directives/r-text.md b/docs-site/content/directives/r-text.md deleted file mode 100644 index c53e414..0000000 --- a/docs-site/content/directives/r-text.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: r-text Directive ---- - -`r-text` binds an expression to an element’s `textContent`. - -It is the safest and most direct way to render text output. - -## Syntax - -```html -

-``` - -## Basic Example - -```html -

-``` - -When `message` changes, the element text updates reactively. - -## Expression Example - -```html -

-``` - -## `r-text` vs `{{ ... }}` - -Both are valid. Prefer `r-text` when: - -1. You want explicit binding at element level. -2. You are optimizing repeated row templates and want predictable binding points. -3. You want to avoid accidental surrounding whitespace behavior from text nodes. - -## Security and Behavior - -1. `r-text` writes plain text, not HTML. -2. HTML tags in values are escaped as text. -3. Use [`r-html`](/directives/r-html) only when you intentionally need HTML rendering. - -## Common Patterns - -```html -
  • - - -
  • -``` - -This is a clear and performant default for list text output. - -## See Also - -1. [r-bind](/directives/r-bind) -2. [r-html](/directives/r-html) -3. [r-for](/directives/r-for) diff --git a/docs-site/content/directives/r-text.mdx b/docs-site/content/directives/r-text.mdx new file mode 100644 index 0000000..aa7e273 --- /dev/null +++ b/docs-site/content/directives/r-text.mdx @@ -0,0 +1,82 @@ +--- +title: r-text Directive +description: "Bind expressions to textContent and display text without interpreting it as HTML." +--- + +`r-text` binds an expression to an element’s `textContent`. + +It is the safest and most direct way to render text output. + + + r-textBinding +

    Bind expressions to textContent and display text without interpreting it as HTML.

    +
    + +## Try it live + +
    +
    Text that follows your inputLive Regor
    + +
    + + +
    +

    Edit the message. The output binds directly to textContent.

    +
    + +## Syntax + +```html +

    +``` + +## Basic Example + +```html +

    +``` + +When `message` changes, the element text updates reactively. + +## Expression Example + +```html +

    +``` + +## `r-text` vs `{{ ... }}` + +Both are valid. Prefer `r-text` when: + +1. You want explicit binding at element level. +2. You are optimizing repeated row templates and want predictable binding points. +3. You want to avoid accidental surrounding whitespace behavior from text nodes. + +

    Choose r-text for plain text. Markup characters are displayed rather than interpreted.

    + +## Security and Behavior + +1. `r-text` writes plain text, not HTML. +2. HTML tags in values are escaped as text. +3. Use [`r-html`](/directives/r-html) only when you intentionally need HTML rendering. + +## Common Patterns + +```html +
  • + + +
  • +``` + +This is a clear and performant default for list text output. + +## See Also + +1. [r-bind](/directives/r-bind) +2. [r-html](/directives/r-html) +3. [r-for](/directives/r-for) + +

    Compare text with HTML, or return to the directive map.

    + + diff --git a/docs-site/content/directives/ref.md b/docs-site/content/directives/ref.mdx similarity index 59% rename from docs-site/content/directives/ref.md rename to docs-site/content/directives/ref.mdx index dbdd326..ede8ff2 100644 --- a/docs-site/content/directives/ref.md +++ b/docs-site/content/directives/ref.mdx @@ -1,9 +1,27 @@ --- title: :ref Directive +description: "Capture element references to focus controls or integrate directly with DOM APIs." --- The `:ref` directive in Regor allows you to create references to HTML elements within your templates. These references enable you to interact with and manipulate specific DOM elements programmatically in your components. + + :refDOM utilities +

    Capture element references to focus controls or integrate directly with DOM APIs.

    +
    + +## Try it live + +
    +
    Reach the DOM when you need itLive Regor
    + +
    + + +
    +

    The button focuses an input through its captured element reference.

    +
    + ## Syntax ```html @@ -51,6 +69,8 @@ The `:ref` directive is useful in various scenarios, including: 3. **Integrating Third-Party Libraries**: When working with third-party libraries or components that require direct access to DOM elements, using `:ref` provides a way to pass those elements to external libraries. +

    A template ref is populated when the element binds and cleared when it is unbound. Check that it exists before using it.

    + ## Notes - The `:ref` directive establishes a reference to the HTML element in the component's data, making it accessible via the specified reference name. @@ -64,3 +84,7 @@ The `:ref` directive is useful in various scenarios, including: By using the `:ref` directive in your Regor templates, you can bridge the gap between your component's JavaScript logic and the HTML elements in your template, enhancing your ability to create dynamic and interactive user interfaces. [Back to the directives](/directives/) + +

    Connect DOM interactions to events, or return to the directive map.

    + + diff --git a/docs-site/content/directives/style.md b/docs-site/content/directives/style.mdx similarity index 64% rename from docs-site/content/directives/style.md rename to docs-site/content/directives/style.mdx index 9767acd..83e634e 100644 --- a/docs-site/content/directives/style.md +++ b/docs-site/content/directives/style.mdx @@ -1,11 +1,29 @@ --- title: :style Directive +description: "Bind inline CSS values to state and computed style objects." --- The `:style` directive in Regor allows you to dynamically apply inline styles to HTML elements. It provides a way to bind and update the `style` attribute of an element based on data or expressions. With `:style`, you can create dynamic and responsive styling for your components. `r-style` is an alias of `:style` and behaves the same way. + + :styleAppearance +

    Bind inline CSS values to state and computed style objects.

    +
    + +## Try it live + +
    +
    Turn state into dimensionsLive Regor
    + +
    + + +
    +

    Change the fill or corner treatment. A computed object drives both inline style properties.

    +
    + ## Syntax ```html @@ -61,6 +79,8 @@ The `:style` directive is useful in various scenarios: 4. **Animation and Transitions**: It's often paired with animation libraries to animate elements by changing their styles over time. +

    Width and borderRadius are data-driven values here. A named CSS class is often clearer for a larger visual state.

    + ## Notes - The `:style` directive accepts an object as its value, where keys represent style properties (in camelCase or hyphenated) and values specify the corresponding style values. You can also use expressions to compute style values dynamically. @@ -74,3 +94,7 @@ The `:style` directive is useful in various scenarios: By using the `:style` directive in your Regor templates, you can create flexible and responsive user interfaces with the ability to adapt and change styles based on various conditions and user interactions. [Back to the directives](/directives/) + +

    Compare styles with classes, or return to the directive map.

    + + diff --git a/docs-site/content/examples/first-app/counter.ts b/docs-site/content/examples/first-app/counter.ts new file mode 100644 index 0000000..704a798 --- /dev/null +++ b/docs-site/content/examples/first-app/counter.ts @@ -0,0 +1,36 @@ +import { html, ref } from 'regor' + +export function createCounter(interactive = false) { + const count = ref(0) + return { + interactive, + count, + increment: () => count(count() + 1), + reset: () => count(0), + } +} + +export const counterTemplate = html`
    +
    + Change state. Watch the DOM. +

    The buttons update a ref. Regor updates the text bound to it.

    +
    + + +
    +
    +
    + YOUR FIRST REF / COUNT + +

    One ref, an event handler, and a text binding.

    +
    +
    ` diff --git a/docs-site/content/examples/first-app/mount.ts b/docs-site/content/examples/first-app/mount.ts new file mode 100644 index 0000000..f9167ed --- /dev/null +++ b/docs-site/content/examples/first-app/mount.ts @@ -0,0 +1,14 @@ +import { createApp, useScope } from 'regor' +import { createCounter, counterTemplate } from './counter' + +const element = document.getElementById('app') +if (element) { + const app = createApp( + useScope(() => createCounter(true)), + { element, template: counterTemplate }, + ) + + // When this root is no longer needed: + // app.unbind() // Stop bindings and listeners, keeping the DOM. + // app.unmount() // Stop bindings and listeners, removing the root. +} diff --git a/docs-site/content/getting-started.md b/docs-site/content/getting-started.md deleted file mode 100644 index 4c6855e..0000000 --- a/docs-site/content/getting-started.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Getting Started -order: 3 ---- - -Regor binds runtime behavior directly to DOM you already have, or to template -content you provide at mount time. - -This means you can start from static HTML, mount only where needed, and scale -to multiple independent runtime islands on the same page. - -## Install - -```sh -yarn add regor -``` - -```sh -npm install regor -``` - -## Quick Start (TypeScript) - -```ts -import { createApp, html, ref } from 'regor' - -const app = createApp( - { - count: ref(0), - inc() { - this.count(this.count() + 1) - }, - }, - { - element: document.querySelector('#app')!, - template: html` -
    - -

    Count:

    -
    - `, - }, -) - -// optional teardown -// app.unbind() -// app.unmount() -``` - -## CDN ESM - -```html -
    - -``` - -## Core Mount Modes - -1. Bind existing markup in place: - -```ts -createApp({ userName: ref('Ada') }, { selector: '#profile-island' }) -``` - -2. Replace root content from template string: - -```ts -createApp( - { title: ref('Home') }, - { - selector: '#app', - template: '

    ', - }, -) -``` - -3. Replace root content from JSON template: - -```ts -createApp( - { label: ref('Save') }, - { - element: document.querySelector('#app')!, - json: { t: 'button', a: { 'r-text': 'label' } }, - }, -) -``` - -## Reactivity Basics - -`ref` for values and deep object conversion: - -```ts -import { ref } from 'regor' - -const count = ref(0) -count(1) -console.log(count()) -``` - -`sref` for shallow object state: - -```ts -import { sref } from 'regor' - -const user = sref({ name: 'Ada', age: 30 }) -user().name = 'Grace' -user({ ...user(), age: 31 }) -``` - -Inside templates, refs are auto-unwrapped, so use `count`, `user.name`, not -`count()` or `.value`. - -## Component Quick Example - -```ts -import { createApp, defineComponent, ref } from 'regor' - -const UserCard = defineComponent('

    ', { - props: ['name'], - context: (head) => ({ - name: head.props.name ?? 'Anonymous', - }), -}) - -createApp({ - components: { UserCard }, - activeName: ref('Ada Lovelace'), -}) -``` - -```html - -``` - -## Template Syntax You Will Use Daily - -1. `r-text="expr"` for text. -2. `:attr="expr"` or `r-bind:attr="expr"` for attributes. -3. `.prop="expr"` or `:prop.prop="expr"` for DOM properties. -4. `@event="handler"` for events. -5. `r-if` / `r-else-if` / `r-else` for conditional branches. -6. `r-for="item, #i in items"` for loops. -7. `:context="{ ... }"` / `r-context="{ ... }"` for object-style component input. -8. `{{ expr }}` and `[[ expr ]]` interpolation (enabled by default). - -## Where To Go Next - -1. [Overview](/overview) -2. [Guide](/guide) -3. [Directives](/directives) -4. [API Reference](/api) -5. [Guide: Mounting](/guide/mounting) diff --git a/docs-site/content/getting-started.mdx b/docs-site/content/getting-started.mdx new file mode 100644 index 0000000..cb5e2c7 --- /dev/null +++ b/docs-site/content/getting-started.mdx @@ -0,0 +1,212 @@ +--- +title: Getting Started +description: "Install Regor, mount your first reactive view, and try it live." +order: 3 +--- + +Regor binds runtime behavior directly to DOM you already have, or to template +content you provide at mount time. + +This means you can start from static HTML, mount only where needed, and scale +to multiple independent runtime islands on the same page. + + + 01 / InstallAdd Regor

    Use your package manager or start with a browser module.

    + 02 / MountChoose a root

    Bind existing HTML or supply a template for your app.

    + 03 / InteractConnect state

    Use refs and events to make your view respond.

    +
    + +## Install + + + + +```sh +npm install regor +``` + + + + +```sh +yarn add regor +``` + + + + +## Quick Start (TypeScript) + +Add a mount target to your HTML, then run your TypeScript entry after that element exists (for example, with a module script). + +```html +
    +``` + +
    +
    Your first reactive viewLive Regor
    + +
    + + +
    +

    Click Increment, then Reset. Open the source tabs to see the state, template, and mount code used by this preview.

    +
    + + + +```ts +import { createApp, html, ref } from 'regor' + +const app = createApp( + { + count: ref(0), + inc() { + this.count(this.count() + 1) + }, + }, + { + element: document.querySelector('#app')!, + template: html` +
    + +

    Count:

    +
    + `, + }, +) + +// optional teardown +// app.unbind() +// app.unmount() +``` + +
    + +

    Regor binds to the element you select. Make sure its selector matches your HTML and that the element is present when createApp runs.

    + +## CDN ESM + +```html +
    + +``` + +## Core Mount Modes + +1. Bind existing markup in place: + +```ts +createApp({ userName: ref('Ada') }, { selector: '#profile-island' }) +``` + +2. Replace root content from template string: + +```ts +createApp( + { title: ref('Home') }, + { + selector: '#app', + template: '

    ', + }, +) +``` + +3. Replace root content from JSON template: + +```ts +createApp( + { label: ref('Save') }, + { + element: document.querySelector('#app')!, + json: { t: 'button', a: { 'r-text': 'label' } }, + }, +) +``` + +## Reactivity Basics + +`ref` for values and deep object conversion: + +```ts +import { ref } from 'regor' + +const count = ref(0) +count(1) +console.log(count()) +``` + +`sref` for shallow object state: + +```ts +import { sref } from 'regor' + +const user = sref({ name: 'Ada', age: 30 }) +user().name = 'Grace' +user({ ...user(), age: 31 }) +``` + +Inside templates, refs are auto-unwrapped, so use `count`, `user.name`, not +`count()` or `.value`. + +

    With sref, editing a plain nested property does not notify bindings by itself. Replace the object, as in the example above, to update the view.

    + +## Component Quick Example + +```ts +import { createApp, defineComponent, ref } from 'regor' + +const UserCard = defineComponent('

    ', { + props: ['name'], + context: (head) => ({ + name: head.props.name ?? 'Anonymous', + }), +}) + +createApp({ + components: { UserCard }, + activeName: ref('Ada Lovelace'), +}) +``` + +```html + +``` + +## Template Syntax You Will Use Daily + +1. `r-text="expr"` for text. +2. `:attr="expr"` or `r-bind:attr="expr"` for attributes. +3. `.prop="expr"` or `:prop.prop="expr"` for DOM properties. +4. `@event="handler"` for events. +5. `r-if` / `r-else-if` / `r-else` for conditional branches. +6. `r-for="item, #i in items"` for loops. +7. `:context="{ ... }"` / `r-context="{ ... }"` for object-style component input. +8. `{{ expr }}` and `[[ expr ]]` interpolation (enabled by default). + +## Where To Go Next + + +

    Overview

    See how Regor connects state, templates, and the DOM.

    Explore overview
    +

    Guide

    Explore the concepts with more live examples.

    Explore guide
    +

    Directives

    Find the bindings for lists, forms, attributes, and events.

    Explore directives
    +

    API Reference

    Look up function signatures and usage details.

    Explore api reference
    +

    Guide: Mounting

    Bind existing markup and compose independent islands.

    Explore guide: mounting
    +
    + + diff --git a/docs-site/content/guide/components.md b/docs-site/content/guide/components.mdx similarity index 86% rename from docs-site/content/guide/components.md rename to docs-site/content/guide/components.mdx index e26de68..a0cf04e 100644 --- a/docs-site/content/guide/components.md +++ b/docs-site/content/guide/components.mdx @@ -1,10 +1,28 @@ --- title: Components +description: "Compose typed components with reactive props, named slots, and explicit context boundaries." order: 30 --- This guide documents how Regor components work in runtime, based on current implementation and tests. + + PropsSlotsComposition +

    Define a reusable view, then decide which state belongs to its parent.

    +
    + +## Try it live + +
    +
    Compose a profile, liveLive Regor
    + +
    + + +
    +

    The parent owns the form. The child receives live props, computes initials, and renders a named slot supplied by the parent.

    +
    + ## Define a Component ```ts @@ -368,6 +386,8 @@ context: (head) => { } ``` +

    Set head.enableSwitch = true when slot expressions should resolve against the parent. The preview uses this for the availability footer.

    + ## Attribute inheritance (`inheritAttrs`) By default, component host attributes are inherited into component output root (`inheritAttrs: true`). @@ -416,3 +436,5 @@ Unmount cleans child component bindings and observers. 5. [TypeScript Guide](/guide/typescript) 6. [Directive: r-for](/directives/r-for) 7. [contextRegistry API](/api/contextRegistry) + + diff --git a/docs-site/content/guide/demos/browser.ts b/docs-site/content/guide/demos/browser.ts new file mode 100644 index 0000000..9880514 --- /dev/null +++ b/docs-site/content/guide/demos/browser.ts @@ -0,0 +1,24 @@ +import { createApp, useScope } from 'regor' +import { createQuote, quoteTemplate } from './quote' +import { createServices, servicesTemplate } from './services' +import { createProfile, profileTemplate } from './profile' +import { createLifecycle, lifecycleTemplate } from './lifecycle' + +// Each guide mounts only its own island. Everything outside the root stays static. +function mount( + id: string, + create: (interactive: boolean) => T, + template: string, +) { + const element = document.getElementById(id) + if (element) + createApp( + useScope(() => create(true)), + { element, template }, + ) +} + +mount('guide-quote', createQuote, quoteTemplate) +mount('guide-services', createServices, servicesTemplate) +mount('guide-profile', createProfile, profileTemplate) +mount('guide-lifecycle', createLifecycle, lifecycleTemplate) diff --git a/docs-site/content/guide/demos/lifecycle.ts b/docs-site/content/guide/demos/lifecycle.ts new file mode 100644 index 0000000..1dc6349 --- /dev/null +++ b/docs-site/content/guide/demos/lifecycle.ts @@ -0,0 +1,61 @@ +import { defineComponent, html, onMounted, onUnmounted, ref } from 'regor' + +export function createLifecycle(interactive = false) { + const active = ref(false) + const toggle = () => active(!active()) + const ticks = ref(0) + const starts = ref(0) + const cleanups = ref(0) + const lastEvent = ref('Ready. Mount the ticker to start its interval.') + const SessionTicker = defineComponent( + html`

    + Interval running +

    `, + { + context: () => { + let timer: ReturnType | undefined + onMounted(() => { + starts(starts() + 1) + lastEvent('onMounted → start interval') + timer = setInterval(() => ticks(ticks() + 1), 500) + }) + onUnmounted(() => { + clearInterval(timer) + cleanups(cleanups() + 1) + lastEvent('onUnmounted → clear interval') + }) + return {} + }, + }, + ) + // No child is mounted during static rendering, so the build creates no timer. + return { + interactive, + active, + toggle, + ticks, + starts, + cleanups, + lastEvent, + components: { SessionTicker }, + } +} + +export const lifecycleTemplate = html`
    +
    + {{ active ? 'Child is mounted' : 'Child is unmounted' }} +
    + +
    +
    {{ ticks }}Total ticks
    +
    {{ starts }}Mounts
    +
    {{ cleanups }}Cleanups
    +
    +

    {{ lastEvent }}

    +

    + Unmount the child: the tick count stops. Remount it: a fresh interval + starts. The parent keeps the totals. +

    +
    ` diff --git a/docs-site/content/guide/demos/profile.ts b/docs-site/content/guide/demos/profile.ts new file mode 100644 index 0000000..8704b64 --- /dev/null +++ b/docs-site/content/guide/demos/profile.ts @@ -0,0 +1,95 @@ +import { + computed, + defineComponent, + html, + ref, + unref, + type RefOrValue, +} from 'regor' + +interface ProfileProps { + name: RefOrValue + role: RefOrValue + compact: RefOrValue +} + +export function createProfile(interactive = false) { + const ProfileCard = defineComponent< + ProfileProps & { initials: RefOrValue } + >( + html`
    + +
    +

    {{ name || 'Your name' }}

    +

    {{ role }}

    +
    +
    +
    `, + { + props: ['name', 'role', 'compact'], + context: (head) => { + head.enableSwitch = true // The named slot reads the parent's context. + return { + ...head.props, + initials: computed( + () => + unref(head.props.name) + .trim() + .split(/\s+/) + .slice(0, 2) + .map((word) => word[0] ?? '') + .join('') + .toUpperCase() || '?', + ), + } + }, + }, + ) + return { + interactive, + name: ref('Ada Lovelace'), + role: ref('Engineer'), + compact: ref(false), + available: ref(true), + components: { ProfileCard }, + } +} + +export const profileTemplate = html`
    +
    + + + + +
    +
    + CHILD COMPONENT / LIVE PROPS + + + +
    +
    ` diff --git a/docs-site/content/guide/demos/quote.ts b/docs-site/content/guide/demos/quote.ts new file mode 100644 index 0000000..f780ce7 --- /dev/null +++ b/docs-site/content/guide/demos/quote.ts @@ -0,0 +1,78 @@ +import { batch, computed, html, ref } from 'regor' + +export function createQuote(interactive = false) { + const quantity = ref(4) + const unitPrice = ref(25) + const discounted = ref(false) + const subtotal = computed(() => quantity() * unitPrice()) + const savings = computed(() => (discounted() ? subtotal() * 0.1 : 0)) + const total = computed(() => subtotal() - savings()) + const money = (value: number) => `$${value.toFixed(2)}` + const reset = () => + batch(() => { + quantity(4) + unitPrice(25) + discounted(false) + }) + return { + interactive, + quantity, + unitPrice, + discounted, + subtotal, + savings, + total, + money, + reset, + } +} + +export const quoteTemplate = html`
    +
    + + + + + + +
    +
    + YOUR TEAM / MONTHLY + {{ money(total) }} +
    +
    +
    Subtotal
    +
    {{ money(subtotal) }}
    +
    +
    +
    Discount
    +
    {{ money(savings) }}
    +
    +
    +

    Two inputs. Three computed values. One connected view.

    +
    +
    ` diff --git a/docs-site/content/guide/demos/services.ts b/docs-site/content/guide/demos/services.ts new file mode 100644 index 0000000..3a937bb --- /dev/null +++ b/docs-site/content/guide/demos/services.ts @@ -0,0 +1,86 @@ +import { computed, html, ref, sref } from 'regor' + +const initialServices = [ + { id: 'api', name: 'Public API', region: 'Frankfurt', healthy: true }, + { id: 'search', name: 'Search index', region: 'Amsterdam', healthy: false }, + { id: 'jobs', name: 'Background jobs', region: 'Frankfurt', healthy: true }, + { id: 'media', name: 'Media delivery', region: 'London', healthy: true }, +] + +export function createServices(interactive = false) { + const query = ref('') + const status = ref('all') + const services = sref(initialServices.map((service) => ({ ...service }))) + const visible = computed(() => + services().filter((service) => { + const matchesText = `${service.name} ${service.region}` + .toLowerCase() + .includes(query().trim().toLowerCase()) + return ( + matchesText && + (status() === 'all' || service.healthy === (status() === 'healthy')) + ) + }), + ) + // The row objects are plain values: replace the shallow ref's array to notify. + const toggle = (id: string) => + services( + services().map((service) => + service.id === id ? { ...service, healthy: !service.healthy } : service, + ), + ) + const reset = () => { + query('') + status('all') + } + return { interactive, query, status, services, visible, toggle, reset } +} + +export const servicesTemplate = html`
    +
    + + +
    +

    + {{ visible.length }} of {{ services.length }} services · illustrative data +

    +
      +
    • +
      + {{ service.name }}{{ service.region }} +
      + +
    • +
    +
    + No matching services. +

    Try a different search or status.

    + +
    +

    + Filter the list, then click a status to change it. Stable keys identify each + row. +

    +
    ` diff --git a/docs-site/content/guide/index.md b/docs-site/content/guide/index.md deleted file mode 100644 index 0467212..0000000 --- a/docs-site/content/guide/index.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Guide -order: 4 ---- - -The Guide explains how Regor behaves in real runtime usage, with patterns that map directly to production code. - -## Guide Map - -1. [Reactivity](/guide/reactivity) - Core primitives (`ref`, `sref`, computed, observers), update semantics, and state design. - -2. [Templates and Expressions](/guide/templates) - Interpolation behavior, parser/evaluator capabilities, and template authoring patterns. - -3. [Components](/guide/components) - Component creation, input channels (`:x`, `r-bind:x`, `:context`, `r-context`), slots, and inherit behavior. - -4. [TypeScript](/guide/typescript) - Strong typing patterns for app contexts, class-based contexts, and `ComponentHead`. - -5. [Lifecycle and Cleanup](/guide/lifecycle-and-cleanup) - Mounted/unmounted hooks, `unmount` vs `unbind`, and `drainUnbind` usage. - -6. [Mounting](/guide/mounting) - Static-first + dynamic islands and existing-markup binding patterns. - -7. [Persisted State](/guide/persisted-state) - `persist(...)` patterns for durable reactive state. - -8. [Performance](/guide/performance) - Benchmark methodology, bottleneck analysis, and optimization workflow. - -9. [Troubleshooting](/guide/troubleshooting) - Symptom -> cause -> fix guide for common runtime issues. - diff --git a/docs-site/content/guide/index.mdx b/docs-site/content/guide/index.mdx new file mode 100644 index 0000000..9982314 --- /dev/null +++ b/docs-site/content/guide/index.mdx @@ -0,0 +1,72 @@ +--- +title: Guide +description: Learn Regor from live examples, then explore the patterns behind reactive interfaces. +order: 4 +--- + +Build your understanding from state to screen. Start with reactivity, templates, and components, then explore the topics your application needs. + +

    Four guides include live previews with their actual source: a computed quote, a service board, a profile component, and a ticker with lifecycle cleanup.

    + +## Guide Map + + + + 01 / Core concepts +

    Reactivity

    +

    Model state with refs, derive values with computed, and coordinate updates.

    + Explore reactivity +
    + + 02 / Core concepts +

    Templates and Expressions

    +

    Connect HTML to state with expressions, keyed lists, events, and form bindings.

    + Explore templates and expressions +
    + + 03 / Core concepts +

    Components

    +

    Compose typed components with reactive props, named slots, and explicit context boundaries.

    + Explore components +
    + + 04 / In practice +

    TypeScript

    +

    Type app contexts, component inputs, and runtime contracts without losing reactive behavior.

    + Explore typescript +
    + + 05 / In practice +

    Lifecycle and Cleanup

    +

    Own timers, listeners, and subscriptions through scoped mount and unmount hooks.

    + Explore lifecycle and cleanup +
    + + 06 / In practice +

    Mounting

    +

    Enhance existing markup or mount independent reactive islands on a static page.

    + Explore mounting +
    + + 07 / In practice +

    Persisted State

    +

    Keep selected reactive preferences across reloads with persist and stable storage keys.

    + Explore persisted state +
    + + 08 / In practice +

    Performance

    +

    Measure DOM workloads, investigate bottlenecks, and verify improvements against a baseline.

    + Explore performance +
    + + 09 / In practice +

    Troubleshooting

    +

    Trace mounting, bindings, component inputs, and cleanup problems from symptom to cause.

    + Explore troubleshooting +
    +
    + + +
    1. Follow Getting started to mount your first app.
    2. Try the reactivity and template previews.
    3. Compose your views with components, then learn how to clean up their resources.
    +
    diff --git a/docs-site/content/guide/lifecycle-and-cleanup.md b/docs-site/content/guide/lifecycle-and-cleanup.mdx similarity index 65% rename from docs-site/content/guide/lifecycle-and-cleanup.md rename to docs-site/content/guide/lifecycle-and-cleanup.mdx index 9278f9f..7ebed6b 100644 --- a/docs-site/content/guide/lifecycle-and-cleanup.md +++ b/docs-site/content/guide/lifecycle-and-cleanup.mdx @@ -1,10 +1,28 @@ --- title: Lifecycle and Cleanup +description: "Own timers, listeners, and subscriptions through scoped mount and unmount hooks." order: 50 --- This page describes Regor lifecycle and teardown behavior from the actual runtime flow. + + MountUnmountCleanup +

    Start resources when their owner mounts. Release them when that owner leaves.

    +
    + +## Try it live + +
    +
    Watch a component come and goLive Regor
    + +
    + + +
    +

    Mount and unmount a child ticker. Its hooks own the interval; the parent retains the tick and cleanup counts.

    +
    + ## Runtime lifecycle order `createApp(...)` runs in this order: @@ -100,6 +118,8 @@ Inside component context, `head.unmount()` is a force-remove tool: Use only when component wants to self-remove its rendered block. +

    Pair intervals with clearInterval, listeners with removeEventListener, and subscriptions with their stop function.

    + ## Practical cleanup patterns 1. Page-level app: @@ -120,3 +140,5 @@ Use only when component wants to self-remove its rendered block. 5. [API: removeNode](/api/removeNode) 6. [API: drainUnbind](/api/drainUnbind) 7. [API: unbind](/api/unbind) + + diff --git a/docs-site/content/guide/mounting.md b/docs-site/content/guide/mounting.mdx similarity index 78% rename from docs-site/content/guide/mounting.md rename to docs-site/content/guide/mounting.mdx index 3a1cf3b..299cbe3 100644 --- a/docs-site/content/guide/mounting.md +++ b/docs-site/content/guide/mounting.mdx @@ -1,5 +1,6 @@ --- title: Mounting +description: "Enhance existing markup or mount independent reactive islands on a static page." order: 60 --- @@ -13,6 +14,11 @@ One common pattern is static-first pages with dynamic islands, but Regor is not In many projects, this can mean mostly static content with selectively mounted dynamic regions. + + Existing HTMLIslandsOwnership +

    Mount only where interaction is needed. Give each app a clear DOM boundary.

    +
    + ## Why this is powerful This architecture gives you: @@ -32,6 +38,8 @@ Examples where selective mounting is ideal: 4. Search/filter controls. 5. Realtime status chips, notifications, dashboards. +

    The live previews in the reactivity, templates, components, and lifecycle guides mount into their own roots. Navigation and the rest of the page stay outside those roots.

    + ## Multi-mount pattern You can mount separate Regor contexts into multiple existing DOM roots: diff --git a/docs-site/content/guide/performance.md b/docs-site/content/guide/performance.mdx similarity index 87% rename from docs-site/content/guide/performance.md rename to docs-site/content/guide/performance.mdx index 1ff92e0..2f77faf 100644 --- a/docs-site/content/guide/performance.md +++ b/docs-site/content/guide/performance.mdx @@ -1,5 +1,6 @@ --- title: Performance +description: "Measure DOM workloads, investigate bottlenecks, and verify improvements against a baseline." order: 80 --- @@ -9,6 +10,11 @@ This guide shows how to measure Regor performance with stable, repeatable workfl 2. Minidom benchmark (engine-only, no paint/layout noise) 3. CPU profiling (find real hotspots before changing code) + + MeasureProfileVerify +

    Measure the interaction that matters before deciding what to optimize.

    +
    + ## Regor Wins Where It Matters In this repo’s benchmark suite, Regor is the update-throughput winner in many real mutation patterns. @@ -74,6 +80,8 @@ Interpretation: Regor shows strong wins on several real mutation patterns. +

    Compare the same workload and environment. A benchmark snapshot is a starting point for investigation, not a prediction for every application.

    + ## Browser DOM Benchmarks Use this when you care about user-visible page performance. diff --git a/docs-site/content/guide/persisted-state.md b/docs-site/content/guide/persisted-state.mdx similarity index 77% rename from docs-site/content/guide/persisted-state.md rename to docs-site/content/guide/persisted-state.mdx index 863b97f..5518e45 100644 --- a/docs-site/content/guide/persisted-state.md +++ b/docs-site/content/guide/persisted-state.mdx @@ -1,5 +1,6 @@ --- title: Persisted State +description: "Keep selected reactive preferences across reloads with persist and stable storage keys." order: 70 --- @@ -9,6 +10,11 @@ order: 70 2. It returns the same ref instance, so it can be used inline in context creation. 3. State is restored from `localStorage` on startup. + + PreferencesStorage keysPersistence +

    Persist deliberate preferences, then use those refs throughout the interface.

    +
    + ## Why it matters For static-first sites with dynamic islands, `persist` lets each island keep user state without extra storage wiring. @@ -95,6 +101,8 @@ const context = { 3. If key is empty, `persist` throws. 4. Updates are synced via reactive observation. +

    Use an application prefix and version when needed. Keep private data and short-lived UI state out of a preferences store.

    + ## Key strategy Use namespaced keys: diff --git a/docs-site/content/guide/reactivity.md b/docs-site/content/guide/reactivity.mdx similarity index 73% rename from docs-site/content/guide/reactivity.md rename to docs-site/content/guide/reactivity.mdx index b1ec014..29b2cd3 100644 --- a/docs-site/content/guide/reactivity.md +++ b/docs-site/content/guide/reactivity.mdx @@ -1,10 +1,28 @@ --- title: Reactivity +description: "Model state with refs, derive values with computed, and coordinate updates." order: 10 --- This page describes Regor reactivity based on actual runtime behavior. + + StateDerived valuesObservers +

    Keep writable state small. Derive the rest with computed values.

    +
    + +## Try it live + +
    +
    A quote that recalculates itselfLive Regor
    + +
    + + +
    +

    Move either slider or apply the discount. The subtotal, savings, and total share the same reactive state.

    +
    + ## Core model 1. A ref is a callable value container (`r()`, `r(newValue)`) with `.value` alias. @@ -66,6 +84,8 @@ Key behavior: 2. Arrays/Map/Set are made reactive via prototype adaptation. 3. `sref(sourceRef)` returns the same ref instance. +

    Choose cref() when you need a copy, or sref() when you want to replace plain values yourself.

    + ## Access and update forms For `ref`, `cref`, and `sref`: @@ -188,3 +208,5 @@ const plain = flatten(state) 1. [API Reference](/api) 2. [Lifecycle and Cleanup](/guide/lifecycle-and-cleanup) 3. [Templates and Expressions](/guide/templates) + + diff --git a/docs-site/content/guide/templates.md b/docs-site/content/guide/templates.mdx similarity index 76% rename from docs-site/content/guide/templates.md rename to docs-site/content/guide/templates.mdx index 7b4dc91..4f38173 100644 --- a/docs-site/content/guide/templates.md +++ b/docs-site/content/guide/templates.mdx @@ -1,10 +1,28 @@ --- title: Templates and Expressions +description: "Connect HTML to state with expressions, keyed lists, events, and form bindings." order: 20 --- This page describes how Regor turns templates into live bindings, and what expression syntax is supported in runtime. + + ExpressionsListsForms +

    The template declares the view. Your context supplies its state and behavior.

    +
    + +## Try it live + +
    +
    A service board that respondsLive Regor
    + +
    + + +
    +

    Search by name or region, filter by status, and change individual services. The list uses r-model, r-if, and a keyed r-for.

    +
    + ## Template Sources Regor accepts templates from multiple sources in `createApp(...)` / `defineComponent(...)`: @@ -105,6 +123,8 @@ Both forms are supported for expression-based keys: Nested paths such as `a.b.c.d` are supported. Use stable domain IDs for predictable updates. +

    Use an item identity such as service.id. A position in a filtered list does not identify the same item over time.

    + ## Practical Patterns 1. Prefer `r-text` for hot repeated rows. @@ -222,3 +242,5 @@ Use these when docs/snippets must display `{{ ... }}` without binding. 2. [Reactivity](/guide/reactivity) 3. [Components](/guide/components) 4. [r-for](/directives/r-for) + + diff --git a/docs-site/content/guide/troubleshooting.md b/docs-site/content/guide/troubleshooting.mdx similarity index 85% rename from docs-site/content/guide/troubleshooting.md rename to docs-site/content/guide/troubleshooting.mdx index c4abe9a..d14f201 100644 --- a/docs-site/content/guide/troubleshooting.md +++ b/docs-site/content/guide/troubleshooting.mdx @@ -1,10 +1,16 @@ --- title: Troubleshooting +description: "Trace mounting, bindings, component inputs, and cleanup problems from symptom to cause." order: 90 --- Use this page as a symptom -> cause -> fix reference based on current Regor runtime behavior. + + ReproduceInspectIsolate +

    Start with the smallest failing interaction. Follow its state from context to DOM.

    +
    + ## Quick Triage Before deep debugging: @@ -169,6 +175,8 @@ Frequent warning types and meaning: 5. Model requires ref / unsupported element: `r-model` target is invalid for current element/source. +

    Keep the mount target, state, and one failing binding. Include the Regor version and browser when sharing the reproduction.

    + ## When Reporting an Issue Include: diff --git a/docs-site/content/guide/typescript.md b/docs-site/content/guide/typescript.mdx similarity index 86% rename from docs-site/content/guide/typescript.md rename to docs-site/content/guide/typescript.mdx index ec58910..1ed9cd2 100644 --- a/docs-site/content/guide/typescript.md +++ b/docs-site/content/guide/typescript.mdx @@ -1,10 +1,16 @@ --- title: TypeScript +description: "Type app contexts, component inputs, and runtime contracts without losing reactive behavior." order: 40 --- Regor has strong TypeScript support across app context, component context, and component head typing. + + ContextsPropsValidation +

    Make state and behavior explicit in your types so the editor can help you compose them.

    +
    + ## Why this matters You can model app and component state with real TypeScript types (interfaces/classes), and keep runtime template syntax concise. @@ -94,6 +100,8 @@ const Card = defineComponent( ``` +

    TypeScript checks your code during development. Use head.validateProps when component inputs also need a runtime contract.

    + ## Typed runtime prop validation with `head.validateProps(...)` `validateProps(...)` is typed from `ComponentHead`, so editor completion can suggest known prop keys while you write the schema. diff --git a/docs-site/content/overview.md b/docs-site/content/overview.md deleted file mode 100644 index 76182c4..0000000 --- a/docs-site/content/overview.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Overview -order: 2 ---- - -Regor is a reactive UI library designed for engineers who want: - -1. Direct control over runtime behavior. -2. A powerful template/directive model. -3. TypeScript-friendly reactivity primitives. -4. Freedom to optimize with plain JavaScript and DOM when needed. - -Regor is intentionally practical. It does not force one rigid rendering architecture for every use case. - -## Architecture Positioning - -Regor is Vue-inspired in directive syntax, but different by architecture. - -1. Regor does not rely on a Virtual DOM layer. -2. Regor can bind existing server-rendered/static markup in place. -3. Regor supports runtime composition and reentrance across already-mounted regions. -4. Regor keeps optimization escape hatches close to plain DOM and JavaScript. - -## Why Teams Choose Regor - -### 1. Runtime flexibility without lock-in - -Regor can bind existing markup and progressively enhance real pages. You can adopt it incrementally instead of rewriting everything. - -### 2. Reactivity that stays explicit - -You get `ref`, `sref`, `computed`, `watchEffect`, `observe`, and batching primitives. State flows are explicit and composable. - -Control APIs like `pause`, `resume`, and `entangle` help you shape update behavior intentionally in complex flows. - -### 3. Directive model with real depth - -Regor supports rich directive workflows: - -1. Conditional rendering (`r-if`, `r-else-if`, `r-else`, `r-show`). -2. List rendering (`r-for` with keys, table use cases, nested structures). -3. Attribute/property/class/style/event binding (`r-bind`, `.prop`, `.camel`, `:class`, `:style`, `@event`). -4. Form binding (`r-model`) and dynamic components (`:is`, `:context`). - -### 4. Excellent fit for mixed environments - -Regor works well when part of your DOM is owned by other systems, or when performance-critical sections need custom handling. - -### 5. TypeScript without framework-only indirection - -Regor uses plain TypeScript code paths for app and component contexts (`createApp`, `ComponentHead`, interfaces/classes). You keep normal TS ergonomics without relying on custom file format compilers. - -## Core Philosophy - -Regor’s philosophy is: - -1. Keep defaults productive. -2. Keep escape hatches available. -3. Keep internals understandable. -4. Keep control in developers’ hands. - -## What Regor Is Not Trying To Be - -Regor is not built around artificial constraints to optimize only one benchmark shape. It is built for real product constraints where integration flexibility matters. - -If your app needs: - -1. Existing-markup binding. -2. Runtime composition. -3. Context flexibility. -4. Controlled optimization paths. - -Regor is a strong fit. - -## Regor vs Vue (Practical Lens) - -1. Vue is a strong default for framework-owned SPA architecture. -2. Regor is a strong default for progressive enhancement and static-first plus dynamic-island architectures. -3. Vue commonly centers build tooling for peak DX/perf in SPA workflows. -4. Regor keeps build-less and CSP-constrained runtime options first-class. -5. Both are capable; pick based on rendering ownership and deployment constraints. - -## Practical Tradeoffs - -Regor favors flexibility and control. In very binding-dense paths, runtime cost can grow with total DOM + binding volume. This is normal for highly dynamic runtime systems. - -The upside is that Regor keeps optimization options open: - -1. Reduce binding density where it matters. -2. Use stable keying and list strategies. -3. Drop to targeted custom logic in hot sections. -4. Keep the rest of the app high-level and maintainable. - -## Recommended Reading Order - -1. [Getting Started](/getting-started) -2. [Guide](/guide) -3. [Directives](/directives) -4. [API Reference](/api) -5. [Performance Guide](/guide/performance) - diff --git a/docs-site/content/overview.mdx b/docs-site/content/overview.mdx new file mode 100644 index 0000000..4370c27 --- /dev/null +++ b/docs-site/content/overview.mdx @@ -0,0 +1,128 @@ +--- +title: Overview +description: "Understand Regor’s reactive state, expressive templates, and direct DOM updates." +order: 2 +--- + +Regor is a reactive UI library designed for engineers who want: + +1. Direct control over runtime behavior. +2. A powerful template/directive model. +3. TypeScript-friendly reactivity primitives. +4. Freedom to optimize with plain JavaScript and DOM when needed. + +Regor is intentionally practical. It does not force one rigid rendering architecture for every use case. + +Reactive stateExpressive templatesDirect DOM updates

    Choose your mount boundary, connect state to markup, and compose the interactions your interface needs.

    + +## Architecture Positioning + +Regor is Vue-inspired in directive syntax, but different by architecture. + +1. Regor does not rely on a Virtual DOM layer. +2. Regor can bind existing server-rendered/static markup in place. +3. Regor supports runtime composition and reentrance across already-mounted regions. +4. Regor keeps optimization escape hatches close to plain DOM and JavaScript. + + + 01 / State

    Refs and computed

    Store writable values and derive the values that depend on them.

    + 02 / Template

    Expressions and directives

    Declare how state appears in HTML and SVG, and how events update it.

    + 03 / View

    The actual DOM

    Regor updates the bound nodes as their reactive dependencies change.

    +
    + +## Why Teams Choose Regor + +### 1. Runtime flexibility without lock-in + +Regor can bind existing markup and progressively enhance real pages. You can adopt it incrementally instead of rewriting everything. + +### 2. Reactivity that stays explicit + +You get `ref`, `sref`, `computed`, `watchEffect`, `observe`, and batching primitives. State flows are explicit and composable. + +Control APIs like `pause`, `resume`, and `entangle` help you shape update behavior intentionally in complex flows. + +### 3. Directive model with real depth + +Regor supports rich directive workflows: + +1. Conditional rendering (`r-if`, `r-else-if`, `r-else`, `r-show`). +2. List rendering (`r-for` with keys, table use cases, nested structures). +3. Attribute/property/class/style/event binding (`r-bind`, `.prop`, `.camel`, `:class`, `:style`, `@event`). +4. Form binding (`r-model`) and dynamic components (`:is`, `:context`). + +### 4. Excellent fit for mixed environments + +Regor works well when part of your DOM is owned by other systems, or when performance-critical sections need custom handling. + +### 5. TypeScript without framework-only indirection + +Regor uses plain TypeScript code paths for app and component contexts (`createApp`, `ComponentHead`, interfaces/classes). You keep normal TS ergonomics without relying on custom file format compilers. + +## See the flow in action + +
    +
    One state model, a connected viewLive Regor
    + +
    + + +
    +

    Inputs update refs. Computed values derive the quote. Template bindings update the displayed totals. Explore reactivity and templates to follow the same example in detail.

    +
    + +## Core Philosophy + +Regor’s philosophy is: + +1. Keep defaults productive. +2. Keep escape hatches available. +3. Keep internals understandable. +4. Keep control in developers’ hands. + +## What Regor Is Not Trying To Be + +Regor is not built around artificial constraints to optimize only one benchmark shape. It is built for real product constraints where integration flexibility matters. + +If your app needs: + +1. Existing-markup binding. +2. Runtime composition. +3. Context flexibility. +4. Controlled optimization paths. + +Regor is a strong fit. + +## Regor vs Vue (Practical Lens) + +1. Vue is a strong default for framework-owned SPA architecture. +2. Regor is a strong default for progressive enhancement and static-first plus dynamic-island architectures. +3. Vue commonly centers build tooling for peak DX/perf in SPA workflows. +4. Regor keeps build-less and CSP-constrained runtime options first-class. +5. Both are capable; pick based on rendering ownership and deployment constraints. + +## Practical Tradeoffs + +

    Decide which region Regor owns, then measure the interactions that matter there. The mounting and performance guides explore these choices.

    + +Regor favors flexibility and control. In very binding-dense paths, runtime cost can grow with total DOM + binding volume. This is normal for highly dynamic runtime systems. + +The upside is that Regor keeps optimization options open: + +1. Reduce binding density where it matters. +2. Use stable keying and list strategies. +3. Drop to targeted custom logic in hot sections. +4. Keep the rest of the app high-level and maintainable. + +## Recommended Reading Order + + +

    Getting Started

    Install Regor and mount your first view.

    Explore getting started
    +

    Guide

    Explore state, templates, components, and cleanup.

    Explore guide
    +

    Directives

    Try every directive with a focused live preview.

    Explore directives
    +

    API Reference

    Look up signatures and practical usage examples.

    Explore api reference
    +

    Performance Guide

    Measure, profile, and verify changes to your interface.

    Explore performance guide
    +
    + + + diff --git a/docs-site/content/siteConfig.json b/docs-site/content/siteConfig.json index bc1c524..a7e6718 100644 --- a/docs-site/content/siteConfig.json +++ b/docs-site/content/siteConfig.json @@ -28,7 +28,7 @@ "maxDepth": 3, "includeIndex": true, "sortBy": "order", - "roots": ["guide", "directives", "api"], + "roots": ["api"], "variant": "spotlight", "class": "spotlight-from-bottom-right" }, diff --git a/docs-site/design/apiComponents.ts b/docs-site/design/apiComponents.ts new file mode 100644 index 0000000..1a70a43 --- /dev/null +++ b/docs-site/design/apiComponents.ts @@ -0,0 +1,13 @@ +import { defineComponent } from 'regor' +import { apiExamples } from '../content/api/demos/examples' + +export function defineApiComponents() { + return Object.fromEntries( + Object.entries(apiExamples).map(([name, example]) => [ + `Api${name[0].toUpperCase()}${name.slice(1)}`, + defineComponent(example.template, { + context: () => example.create(), + }), + ]), + ) +} diff --git a/docs-site/design/apiStyles.ts b/docs-site/design/apiStyles.ts new file mode 100644 index 0000000..3d4a2e4 --- /dev/null +++ b/docs-site/design/apiStyles.ts @@ -0,0 +1,42 @@ +import type { Style } from '@purestack/ts-css' +import type { ThemePalette } from '@purestack/ts-style' + +export function registerApiStyles(root: Style, palette: ThemePalette) { + const t = palette.semanticTone + root.select('.api-jumps').css({ gap: '8px', marginBlock: '24px' }) + root.select('.api-jumps .btn').css({ fontSize: '12px' }) + root.select('.api-map h3').css({ + fontFamily: "'Cascadia Code', Consolas, monospace", + fontSize: '18px', + overflowWrap: 'anywhere', + }) + root.select('.api-comparison').css({ + display: 'grid', + gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', + gap: '12px', + }) + root.select('.api-comparison .directive-card').css({ padding: '16px' }) + root.select('.api-snapshot').css({ + margin: '16px 0 0', + padding: '16px', + borderRadius: '8px', + background: t.neutral.surfaceAlt.rest.bgcolor, + color: t.neutral.text.default, + fontSize: '12px', + lineHeight: '1.7', + whiteSpace: 'pre-wrap', + overflowWrap: 'anywhere', + maxWidth: '100%', + }) + root.select('.api-actions').css({ marginTop: '20px' }) + root.select('.guide-metrics.api-metrics-pair').css({ + gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', + }) + root + .select('.api-comparison p') + .css({ color: t.neutral.text.subtle, fontSize: '12px' }) + root + .media('max-width: 640px') + .select('.api-comparison') + .css({ gridTemplateColumns: 'minmax(0, 1fr)' }) +} diff --git a/docs-site/design/components.ts b/docs-site/design/components.ts index 1a8a61f..c61471d 100644 --- a/docs-site/design/components.ts +++ b/docs-site/design/components.ts @@ -4,6 +4,9 @@ import { createChartModel, } from '../content/examples/chart-model' import { chartTemplate } from '../content/examples/chart-view' +import { defineGuideComponents } from './guideComponents' +import { defineDirectiveComponents } from './directiveComponents' +import { defineApiComponents } from './apiComponents' export interface RegorFeature { number: string @@ -42,6 +45,9 @@ const resourceTemplate = html` export function defineRegorComponents() { return { + ...defineGuideComponents(), + ...defineDirectiveComponents(), + ...defineApiComponents(), SignalChart: defineComponent(chartTemplate, { context: () => createChartModel(), }), diff --git a/docs-site/design/directiveComponents.ts b/docs-site/design/directiveComponents.ts new file mode 100644 index 0000000..aa08b16 --- /dev/null +++ b/docs-site/design/directiveComponents.ts @@ -0,0 +1,13 @@ +import { defineComponent } from 'regor' +import { directiveExamples } from '../content/directives/demos/examples' + +export function defineDirectiveComponents() { + return Object.fromEntries( + Object.entries(directiveExamples).map(([name, example]) => [ + `Directive${name[0].toUpperCase()}${name.slice(1)}`, + defineComponent(example.template, { + context: () => example.create(), + }), + ]), + ) +} diff --git a/docs-site/design/directiveStyles.ts b/docs-site/design/directiveStyles.ts new file mode 100644 index 0000000..501619b --- /dev/null +++ b/docs-site/design/directiveStyles.ts @@ -0,0 +1,117 @@ +import type { Style } from '@purestack/ts-css' +import type { ThemePalette } from '@purestack/ts-style' +import { regorColors } from './skin' + +export function registerDirectiveStyles(root: Style, palette: ThemePalette) { + const t = palette.semanticTone + root + .select('.directive-output') + .css({ + display: 'block', + fontSize: '24px', + fontWeight: '600', + lineHeight: '1.5', + marginTop: '16px', + overflowWrap: 'anywhere', + }) + root + .select('.directive-card') + .css({ + padding: '20px', + marginTop: '20px', + background: t.neutral.surface.rest.bgcolor, + color: t.neutral.text.default, + border: `1px solid ${t.neutral.border.subtle}`, + borderRadius: '10px', + overflowWrap: 'anywhere', + }) + root + .select('.guide-demo--split > .directive-card') + .css({ marginTop: '0', alignSelf: 'center' }) + root + .select('.directive-card > strong') + .css({ display: 'block', fontSize: '18px', marginTop: '12px' }) + root + .select('.directive-card kbd') + .css({ + border: `1px solid ${t.neutral.border.default}`, + borderRadius: '4px', + padding: '2px 6px', + }) + root.select('.directive-values').css({ margin: '18px 0 0' }) + root + .select('.directive-values > div') + .css({ + display: 'flex', + flexWrap: 'wrap', + justifyContent: 'space-between', + gap: '8px 16px', + padding: '8px 0', + borderBottom: `1px solid ${t.neutral.border.subtle}`, + }) + root + .select('.directive-values dt') + .css({ color: t.neutral.text.subtle, fontSize: '12px' }) + root + .select('.directive-values dd') + .css({ margin: '0', fontWeight: '600', overflowWrap: 'anywhere' }) + root + .select('.directive-class-card.is-highlighted') + .css({ + background: t.accent.surface.rest.bgcolor, + borderColor: t.accent.border.default, + }) + root.select('.directive-class-card.is-muted').css({ opacity: '0.55' }) + root + .select('.directive-bar-track') + .css({ + padding: '8px', + borderRadius: '16px', + marginTop: '24px', + background: t.neutral.surfaceAlt.rest.bgcolor, + border: `1px solid ${t.neutral.border.subtle}`, + }) + root + .select('.directive-bar') + .css({ + display: 'flex', + alignItems: 'center', + minHeight: '64px', + minWidth: '40px', + padding: '12px', + fontWeight: '700', + color: regorColors.onSignal, + background: regorColors.signal, + }) + root + .select('.directive-zones') + .css({ + display: 'grid', + gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', + gap: '16px', + }) + root + .select('.directive-literal') + .css({ fontFamily: "'Cascadia Code', Consolas, monospace" }) + root + .select('.directive-portal-message') + .css({ + padding: '16px', + borderRadius: '6px', + background: t.accent.surface.rest.bgcolor, + marginTop: '16px', + overflowWrap: 'anywhere', + }) + root + .select('.guide-step-title') + .css({ + display: 'block', + margin: '12px 0 8px', + fontSize: '20px', + lineHeight: '1.4', + }) + root + .media('max-width: 640px') + .select('.directive-zones') + .css({ gridTemplateColumns: 'minmax(0, 1fr)' }) +} diff --git a/docs-site/design/guideComponents.ts b/docs-site/design/guideComponents.ts new file mode 100644 index 0000000..270e724 --- /dev/null +++ b/docs-site/design/guideComponents.ts @@ -0,0 +1,35 @@ +import { defineComponent } from 'regor' +import { + createCounter, + counterTemplate, +} from '../content/examples/first-app/counter' +import { createQuote, quoteTemplate } from '../content/guide/demos/quote' +import { + createServices, + servicesTemplate, +} from '../content/guide/demos/services' +import { createProfile, profileTemplate } from '../content/guide/demos/profile' +import { + createLifecycle, + lifecycleTemplate, +} from '../content/guide/demos/lifecycle' + +export function defineGuideComponents() { + return { + GettingStartedCounter: defineComponent(counterTemplate, { + context: () => createCounter(), + }), + GuideQuote: defineComponent(quoteTemplate, { + context: () => createQuote(), + }), + GuideServices: defineComponent(servicesTemplate, { + context: () => createServices(), + }), + GuideProfile: defineComponent(profileTemplate, { + context: () => createProfile(), + }), + GuideLifecycle: defineComponent(lifecycleTemplate, { + context: () => createLifecycle(), + }), + } +} diff --git a/docs-site/design/guideStyles.ts b/docs-site/design/guideStyles.ts new file mode 100644 index 0000000..66af4fd --- /dev/null +++ b/docs-site/design/guideStyles.ts @@ -0,0 +1,302 @@ +import type { Style } from '@purestack/ts-css' +import type { ThemePalette } from '@purestack/ts-style' + +export function registerGuideStyles(root: Style, palette: ThemePalette) { + const t = palette.semanticTone + const ink = t.neutral.text.default + const muted = t.neutral.text.subtle + const edge = t.neutral.border.subtle + const accent = t.accent.text.default + root + .select('.guide-map, .guide-orientation, .guide-example, .guide-callout') + .css({ marginBlock: '24px' }) + root.select('.guide-map').css({ gap: '16px' }) + root.select('.guide-map .panel').css({ height: '100%' }) + root.select('.guide-map h3').css({ margin: '12px 0 8px', fontSize: '20px' }) + root.select('.guide-map p').css({ + margin: '0 0 18px', + fontSize: '14px', + lineHeight: '1.7', + color: muted, + }) + root.select('.guide-map a').css({ fontWeight: '600' }) + root.select('.template-doc .guide-map a.btn').css({ color: accent }) + root + .select('.guide-orientation p, .guide-callout p') + .css({ margin: '8px 0 0' }) + root.select('.guide-example').css({ + border: `1px solid ${edge}`, + borderRadius: '14px', + overflow: 'hidden', + }) + root.select('.guide-example-heading').css({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + flexWrap: 'wrap', + gap: '12px', + padding: '20px 24px', + borderBottom: `1px solid ${edge}`, + }) + root + .select('.guide-example-heading strong') + .css({ fontSize: '16px', letterSpacing: '-0.3px' }) + root.select('.guide-example .tabs').css({ margin: '0' }) + root + .select('.guide-example pre') + .css({ maxHeight: '480px', overflow: 'auto' }) + root.select('.guide-example-note').css({ + margin: '0', + padding: '16px 24px', + borderTop: `1px solid ${edge}`, + fontSize: '13px', + color: muted, + }) + root.select('.guide-demo').css({ + padding: '24px', + background: t.neutral.canvas, + color: ink, + fontSize: '14px', + lineHeight: '1.6', + }) + root + .select('.guide-demo, .guide-demo *') + .css({ boxSizing: 'border-box', minWidth: '0' }) + root.select('.guide-demo p').css({ fontSize: '14px', margin: '12px 0 0' }) + root.select('.guide-demo--split').css({ + display: 'grid', + gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)', + gap: '28px', + }) + root.select('.guide-controls').css({ + display: 'flex', + flexDirection: 'column', + alignItems: 'stretch', + gap: '12px', + }) + root.select('.guide-controls > label:not(.guide-check)').css({ + display: 'flex', + justifyContent: 'space-between', + gap: '12px', + fontWeight: '600', + }) + root + .select( + '.guide-demo input:not([type="checkbox"]):not([type="range"]), .guide-demo select', + ) + .css({ + width: '100%', + padding: '10px 12px', + border: `1px solid ${t.neutral.border.default}`, + borderRadius: '6px', + background: t.neutral.surface.rest.bgcolor, + color: ink, + font: 'inherit', + }) + root + .select( + '.guide-demo input[type="range"], .guide-demo input[type="checkbox"]', + ) + .css({ accentColor: accent }) + root + .select('.guide-demo input[type="range"]') + .css({ width: '100%', margin: '2px 0 12px' }) + root.select('.guide-check').css({ + display: 'flex', + alignItems: 'center', + gap: '10px', + fontSize: '13px', + }) + root.select('.guide-demo button').css({ + padding: '9px 14px', + border: `1px solid ${t.neutral.border.default}`, + borderRadius: '6px', + background: t.neutral.surface.rest.bgcolor, + color: ink, + font: 'inherit', + cursor: 'pointer', + alignSelf: 'flex-start', + }) + root.select('.guide-demo button:hover').css({ borderColor: accent }) + root + .select('.guide-demo :is(button, input, select):focus-visible') + .css({ outline: `2px solid ${accent}`, outlineOffset: '3px' }) + root + .select('.guide-demo :is(button, input, select):disabled') + .css({ opacity: '0.55', cursor: 'default' }) + root.select('.guide-readout').css({ + padding: '24px', + background: t.accent.surface.rest.bgcolor, + borderRadius: '10px', + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + }) + root.select('.guide-kicker, .guide-slot-label').css({ + display: 'block', + fontSize: '10px', + fontWeight: '700', + letterSpacing: '1.1px', + color: accent, + }) + root.select('.guide-total').css({ + display: 'block', + fontSize: '42px', + lineHeight: '1.2', + letterSpacing: '-2px', + fontWeight: '700', + margin: '14px 0 20px', + fontVariantNumeric: 'tabular-nums', + }) + root.select('.guide-readout dl').css({ margin: '0' }) + root + .select('.guide-readout dl > div') + .css({ display: 'flex', justifyContent: 'space-between', gap: '12px' }) + root + .select('.guide-readout dd') + .css({ margin: '0', fontVariantNumeric: 'tabular-nums' }) + root + .select('.guide-readout p, .guide-hint') + .css({ color: muted, fontSize: '12px' }) + root.select('.guide-filter').css({ + display: 'grid', + gridTemplateColumns: 'minmax(0, 2fr) minmax(0, 1fr)', + gap: '16px', + }) + root + .select('.guide-filter label') + .css({ display: 'grid', gap: '8px', fontWeight: '600' }) + root.select('.guide-result-count').css({ fontSize: '12px', color: muted }) + root + .select('.guide-service-list') + .css({ listStyle: 'none', padding: '0', margin: '16px 0' }) + root.select('.guide-service-list li').css({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: '12px', + padding: '14px 0', + margin: '0', + borderBottom: `1px solid ${edge}`, + }) + root + .select('.guide-service-list small') + .css({ display: 'block', color: muted, fontSize: '12px' }) + root.select('.guide-service-list button').css({ + display: 'flex', + alignItems: 'center', + gap: '8px', + whiteSpace: 'nowrap', + fontSize: '12px', + alignSelf: 'center', + }) + root.select('.guide-service-list i').css({ + width: '6px', + height: '6px', + borderRadius: '50%', + background: t.warning.text.default, + }) + root.select('.guide-service-list .is-healthy i').css({ background: accent }) + root.select('.guide-empty').css({ padding: '24px 0' }) + root.select('.guide-empty button').css({ marginTop: '12px' }) + root.select('.guide-profile-preview').css({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + gap: '16px', + }) + root.select('.guide-profile').css({ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + gap: '12px', + padding: '24px', + border: `1px solid ${edge}`, + borderRadius: '10px', + background: t.neutral.surface.rest.bgcolor, + }) + root.select('.guide-avatar').css({ + display: 'grid', + placeItems: 'center', + width: '56px', + height: '56px', + flexShrink: '0', + borderRadius: '16px', + background: t.accent.surface.rest.bgcolor, + color: accent, + fontSize: '20px', + fontWeight: '700', + }) + root + .select('.guide-profile h3') + .css({ fontSize: '20px', margin: '0', overflowWrap: 'anywhere' }) + root.select('.guide-profile p').css({ margin: '4px 0 0', color: muted }) + root.select('.guide-profile footer').css({ + width: '100%', + paddingTop: '12px', + borderTop: `1px solid ${edge}`, + fontSize: '12px', + }) + root.select('.guide-slot-label').css({ fontSize: '9px', marginBottom: '4px' }) + root.select('.guide-profile.is-compact').css({ + flexDirection: 'row', + flexWrap: 'wrap', + alignItems: 'center', + padding: '16px', + gap: '10px', + }) + root.select('.guide-profile.is-compact .guide-avatar').css({ + width: '36px', + height: '36px', + borderRadius: '10px', + fontSize: '14px', + }) + root.select('.guide-profile.is-compact h3').css({ fontSize: '16px' }) + root.select('.guide-session-bar').css({ + display: 'flex', + alignItems: 'center', + flexWrap: 'wrap', + gap: '16px', + }) + root + .select('.guide-session-bar > span') + .css({ color: muted, fontSize: '12px' }) + root.select('.guide-ticker').css({ color: accent }) + root.select('.guide-metrics').css({ + display: 'grid', + gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', + gap: '16px', + marginBlock: '24px', + }) + root.select('.guide-metrics > div').css({ + padding: '16px', + borderRadius: '8px', + background: t.accent.surface.rest.bgcolor, + }) + root.select('.guide-metrics output').css({ + display: 'block', + fontSize: '30px', + fontWeight: '700', + fontVariantNumeric: 'tabular-nums', + }) + root.select('.guide-metrics span').css({ fontSize: '12px', color: muted }) + root.select('.guide-event').css({ + borderLeft: `3px solid ${accent}`, + padding: '8px 12px', + background: t.neutral.surface.rest.bgcolor, + overflowWrap: 'anywhere', + }) + root + .media('max-width: 640px') + .select('.guide-demo--split, .guide-filter') + .css({ gridTemplateColumns: 'minmax(0, 1fr)', gap: '20px' }) + root + .media('max-width: 640px') + .select('.guide-demo, .guide-example-heading') + .css({ padding: '18px' }) + root.media('max-width: 640px').select('.guide-metrics').css({ gap: '8px' }) + root + .media('max-width: 640px') + .select('.guide-metrics > div') + .css({ padding: '12px 8px' }) +} diff --git a/docs-site/design/styles.ts b/docs-site/design/styles.ts index a62345b..de0c279 100644 --- a/docs-site/design/styles.ts +++ b/docs-site/design/styles.ts @@ -1,6 +1,9 @@ import { styleBuilder, themes } from '@purestack/ts-style' import { regorColors } from './skin' import { registerChartStyles } from './chartStyles' +import { registerGuideStyles } from './guideStyles' +import { registerDirectiveStyles } from './directiveStyles' +import { registerApiStyles } from './apiStyles' const mono = "'Cascadia Code', 'SFMono-Regular', Consolas, monospace" @@ -8,6 +11,9 @@ export function registerRegorStyles() { themes.forEach((theme, palette) => { const root = styleBuilder.get(theme) registerChartStyles(root, palette) + registerGuideStyles(root, palette) + registerDirectiveStyles(root, palette) + registerApiStyles(root, palette) const t = palette.semanticTone const ink = t.neutral.text.default const muted = t.neutral.text.subtle diff --git a/docs-site/package.json b/docs-site/package.json index 13718da..1c1dccd 100644 --- a/docs-site/package.json +++ b/docs-site/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "scripts": { - "serve": "purestack serve --content ./content", + "serve": "purestack serve --content ./content --port 4400", "build": "purestack build --content ./content --clean", "release": "purestack publish --content ./content" }, From bde32753e8efcfc10f9df7891958f99d4a5decaf Mon Sep 17 00:00:00 2001 From: Ahmed Yasin Koculu Date: Thu, 8 Oct 2026 06:52:44 +0200 Subject: [PATCH 4/6] Deploy and publish scripts. --- docs-site/design/directiveStyles.ts | 158 ++++++++++++---------------- docs-site/package.json | 5 +- 2 files changed, 72 insertions(+), 91 deletions(-) diff --git a/docs-site/design/directiveStyles.ts b/docs-site/design/directiveStyles.ts index 501619b..dac8e55 100644 --- a/docs-site/design/directiveStyles.ts +++ b/docs-site/design/directiveStyles.ts @@ -4,112 +4,92 @@ import { regorColors } from './skin' export function registerDirectiveStyles(root: Style, palette: ThemePalette) { const t = palette.semanticTone - root - .select('.directive-output') - .css({ - display: 'block', - fontSize: '24px', - fontWeight: '600', - lineHeight: '1.5', - marginTop: '16px', - overflowWrap: 'anywhere', - }) - root - .select('.directive-card') - .css({ - padding: '20px', - marginTop: '20px', - background: t.neutral.surface.rest.bgcolor, - color: t.neutral.text.default, - border: `1px solid ${t.neutral.border.subtle}`, - borderRadius: '10px', - overflowWrap: 'anywhere', - }) + root.select('.directive-output').css({ + display: 'block', + fontSize: '24px', + fontWeight: '600', + lineHeight: '1.5', + marginTop: '16px', + overflowWrap: 'anywhere', + }) + root.select('.directive-card').css({ + padding: '20px', + marginTop: '20px', + background: t.neutral.surface.rest.bgcolor, + color: t.neutral.text.default, + border: `1px solid ${t.neutral.border.subtle}`, + borderRadius: '10px', + overflowWrap: 'anywhere', + }) root .select('.guide-demo--split > .directive-card') .css({ marginTop: '0', alignSelf: 'center' }) root .select('.directive-card > strong') .css({ display: 'block', fontSize: '18px', marginTop: '12px' }) - root - .select('.directive-card kbd') - .css({ - border: `1px solid ${t.neutral.border.default}`, - borderRadius: '4px', - padding: '2px 6px', - }) + root.select('.directive-card kbd').css({ + border: `1px solid ${t.neutral.border.default}`, + borderRadius: '4px', + padding: '2px 6px', + }) root.select('.directive-values').css({ margin: '18px 0 0' }) - root - .select('.directive-values > div') - .css({ - display: 'flex', - flexWrap: 'wrap', - justifyContent: 'space-between', - gap: '8px 16px', - padding: '8px 0', - borderBottom: `1px solid ${t.neutral.border.subtle}`, - }) + root.select('.directive-values > div').css({ + display: 'flex', + flexWrap: 'wrap', + justifyContent: 'space-between', + gap: '8px 16px', + padding: '8px 0', + borderBottom: `1px solid ${t.neutral.border.subtle}`, + }) root .select('.directive-values dt') .css({ color: t.neutral.text.subtle, fontSize: '12px' }) root .select('.directive-values dd') .css({ margin: '0', fontWeight: '600', overflowWrap: 'anywhere' }) - root - .select('.directive-class-card.is-highlighted') - .css({ - background: t.accent.surface.rest.bgcolor, - borderColor: t.accent.border.default, - }) + root.select('.directive-class-card.is-highlighted').css({ + background: t.accent.surface.rest.bgcolor, + borderColor: t.accent.border.default, + }) root.select('.directive-class-card.is-muted').css({ opacity: '0.55' }) - root - .select('.directive-bar-track') - .css({ - padding: '8px', - borderRadius: '16px', - marginTop: '24px', - background: t.neutral.surfaceAlt.rest.bgcolor, - border: `1px solid ${t.neutral.border.subtle}`, - }) - root - .select('.directive-bar') - .css({ - display: 'flex', - alignItems: 'center', - minHeight: '64px', - minWidth: '40px', - padding: '12px', - fontWeight: '700', - color: regorColors.onSignal, - background: regorColors.signal, - }) - root - .select('.directive-zones') - .css({ - display: 'grid', - gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', - gap: '16px', - }) + root.select('.directive-bar-track').css({ + padding: '8px', + borderRadius: '16px', + marginTop: '24px', + background: t.neutral.surfaceAlt.rest.bgcolor, + border: `1px solid ${t.neutral.border.subtle}`, + }) + root.select('.directive-bar').css({ + display: 'flex', + alignItems: 'center', + minHeight: '64px', + minWidth: '40px', + padding: '12px', + fontWeight: '700', + color: regorColors.onSignal, + background: regorColors.signal, + }) + root.select('.directive-zones').css({ + display: 'grid', + gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', + gap: '16px', + }) root .select('.directive-literal') .css({ fontFamily: "'Cascadia Code', Consolas, monospace" }) - root - .select('.directive-portal-message') - .css({ - padding: '16px', - borderRadius: '6px', - background: t.accent.surface.rest.bgcolor, - marginTop: '16px', - overflowWrap: 'anywhere', - }) - root - .select('.guide-step-title') - .css({ - display: 'block', - margin: '12px 0 8px', - fontSize: '20px', - lineHeight: '1.4', - }) + root.select('.directive-portal-message').css({ + padding: '16px', + borderRadius: '6px', + background: t.accent.surface.rest.bgcolor, + marginTop: '16px', + overflowWrap: 'anywhere', + }) + root.select('.guide-step-title').css({ + display: 'block', + margin: '12px 0 8px', + fontSize: '20px', + lineHeight: '1.4', + }) root .media('max-width: 640px') .select('.directive-zones') diff --git a/docs-site/package.json b/docs-site/package.json index 1c1dccd..a050059 100644 --- a/docs-site/package.json +++ b/docs-site/package.json @@ -3,9 +3,10 @@ "private": true, "type": "module", "scripts": { - "serve": "purestack serve --content ./content --port 4400", + "serve": "purestack serve --content ./content --port 4400 --clean", "build": "purestack build --content ./content --clean", - "release": "purestack publish --content ./content" + "publish": "purestack publish --content ./content", + "deploy": "pgdeploy deploy --host https://regor.purestack.studio --package ./dist/web --allow-path 'pagefind/*,.ts-ssg/manifest.json'" }, "dependencies": { "@purestack/ts-css": "1.1.7", From dd8740944e06eef290e5dd63785b5bc635d6ce25 Mon Sep 17 00:00:00 2001 From: Ahmed Yasin Koculu Date: Thu, 8 Oct 2026 07:12:10 +0200 Subject: [PATCH 5/6] Customize header. --- docs-site/content/header.mdx | 10 +---- docs-site/design/components.ts | 2 + docs-site/design/styles.ts | 12 ++++-- docs-site/design/topBar.ts | 67 ++++++++++++++++++++++++++++++++++ docs-site/package.json | 1 + docs-site/yarn.lock | 3 +- 6 files changed, 82 insertions(+), 13 deletions(-) create mode 100644 docs-site/design/topBar.ts diff --git a/docs-site/content/header.mdx b/docs-site/content/header.mdx index 24546eb..8282b54 100644 --- a/docs-site/content/header.mdx +++ b/docs-site/content/header.mdx @@ -1,9 +1 @@ - - - + diff --git a/docs-site/design/components.ts b/docs-site/design/components.ts index c61471d..2ed3875 100644 --- a/docs-site/design/components.ts +++ b/docs-site/design/components.ts @@ -7,6 +7,7 @@ import { chartTemplate } from '../content/examples/chart-view' import { defineGuideComponents } from './guideComponents' import { defineDirectiveComponents } from './directiveComponents' import { defineApiComponents } from './apiComponents' +import { defineRegorTopBar } from './topBar' export interface RegorFeature { number: string @@ -45,6 +46,7 @@ const resourceTemplate = html` export function defineRegorComponents() { return { + RegorTopBar: defineRegorTopBar(), ...defineGuideComponents(), ...defineDirectiveComponents(), ...defineApiComponents(), diff --git a/docs-site/design/styles.ts b/docs-site/design/styles.ts index de0c279..79dc7dd 100644 --- a/docs-site/design/styles.ts +++ b/docs-site/design/styles.ts @@ -79,7 +79,12 @@ export function registerRegorStyles() { .select('.regor-topbar .site-logo') .css({ fontWeight: '750', letterSpacing: '-1px' }) root.select('.regor-topbar .site-logo__name').css({ lineHeight: '1.4' }) - root.select('.regor-topbar .topbar__actions').css({ gap: '18px' }) + root.select('.regor-topbar .topbar__controls').css({ gap: '18px' }) + root.select('.regor-topbar .header-nav').css({ + display: 'flex', + alignItems: 'center', + gap: '18px', + }) root.select('.regor-topbar :is(.header-guide,.header-api)').css({ color: muted, fontSize: '13px', @@ -705,12 +710,13 @@ export function registerRegorStyles() { .select('.footer-inner') .css({ alignItems: 'start', flexDirection: 'column' }) mobile.select('.regor-topbar .header-guide').css({ display: 'none' }) - mobile.select('.regor-topbar .topbar__actions').css({ gap: '12px' }) + mobile.select('.regor-topbar .header-nav').css({ gap: '12px' }) + mobile.select('.regor-topbar .topbar__controls').css({ gap: '12px' }) mobile.select('.template-doc .doc-main').css({ paddingTop: '24px' }) mobile.select('.template-doc .doc-content').css({ fontSize: '15px' }) root .media('max-width: 380px') - .select('.regor-topbar .header-api') + .select('.regor-topbar .header-nav') .css({ display: 'none' }) root .media('max-width: 380px') diff --git a/docs-site/design/topBar.ts b/docs-site/design/topBar.ts new file mode 100644 index 0000000..cdf5ec2 --- /dev/null +++ b/docs-site/design/topBar.ts @@ -0,0 +1,67 @@ +import { defineTopBarComponents, type TopBar } from '@purestack/ts-components' +import { defineComponent, html } from 'regor' + +// Based on PureStack 1.1.7's TopBar template, with navigation before the icons. +const topBarTemplate = html` +
    + +
    + + +
    +
    + + + + +
    + + +
    ` + +export function defineRegorTopBar() { + const original = defineTopBarComponents().topBar + return defineComponent(topBarTemplate, { + context: original.context, + props: original.props, + inheritAttrs: original.inheritAttrs, + }) +} diff --git a/docs-site/package.json b/docs-site/package.json index a050059..0cc925e 100644 --- a/docs-site/package.json +++ b/docs-site/package.json @@ -9,6 +9,7 @@ "deploy": "pgdeploy deploy --host https://regor.purestack.studio --package ./dist/web --allow-path 'pagefind/*,.ts-ssg/manifest.json'" }, "dependencies": { + "@purestack/ts-components": "1.1.7", "@purestack/ts-css": "1.1.7", "@purestack/ts-html": "1.1.7", "@purestack/ts-style": "1.1.7", diff --git a/docs-site/yarn.lock b/docs-site/yarn.lock index 32d200b..7cc74d2 100644 --- a/docs-site/yarn.lock +++ b/docs-site/yarn.lock @@ -324,7 +324,7 @@ __metadata: languageName: node linkType: hard -"@purestack/ts-components@npm:^1.1.7": +"@purestack/ts-components@npm:1.1.7, @purestack/ts-components@npm:^1.1.7": version: 1.1.7 resolution: "@purestack/ts-components@npm:1.1.7" dependencies: @@ -1922,6 +1922,7 @@ __metadata: version: 0.0.0-use.local resolution: "regor-doc-site@workspace:." dependencies: + "@purestack/ts-components": "npm:1.1.7" "@purestack/ts-css": "npm:1.1.7" "@purestack/ts-html": "npm:1.1.7" "@purestack/ts-style": "npm:1.1.7" From 2a0a2068fb5005b9e2f07fa58e73f2bf3322ebcb Mon Sep 17 00:00:00 2001 From: Ahmed Yasin Koculu Date: Thu, 8 Oct 2026 07:31:46 +0200 Subject: [PATCH 6/6] Show guide on mobile header. --- docs-site/design/styles.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs-site/design/styles.ts b/docs-site/design/styles.ts index 79dc7dd..4d6a53b 100644 --- a/docs-site/design/styles.ts +++ b/docs-site/design/styles.ts @@ -709,14 +709,13 @@ export function registerRegorStyles() { mobile .select('.footer-inner') .css({ alignItems: 'start', flexDirection: 'column' }) - mobile.select('.regor-topbar .header-guide').css({ display: 'none' }) mobile.select('.regor-topbar .header-nav').css({ gap: '12px' }) mobile.select('.regor-topbar .topbar__controls').css({ gap: '12px' }) mobile.select('.template-doc .doc-main').css({ paddingTop: '24px' }) mobile.select('.template-doc .doc-content').css({ fontSize: '15px' }) root .media('max-width: 380px') - .select('.regor-topbar .header-nav') + .select('.regor-topbar .header-api') .css({ display: 'none' }) root .media('max-width: 380px')