diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 647e18c..2d318e2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,13 +41,16 @@ jobs: - run: pnpm build - # `astro build` exits 0 even when jaamd skips its remark plugins (it only - # logs a warning), so a green build is not evidence that the pipeline ran. - # This asserts on the rendered HTML, which is what would catch Astro - # renaming its default markdown processor out from under us. + # `astro build` exits 0 when jaamd skips its plugins (warning only). + # Asserts on the rendered HTML; catches a renamed markdown processor. - name: Assertions on the built site run: pnpm smoke + # Same assertions on the remark plugins. + - run: pnpm build:unified + - name: Assertions on the unified build + run: pnpm smoke + # `www` pins astro ^7, so the job above never sees a new major. Red here means # the next Astro major needs checking, not that main is broken. astro-latest: @@ -71,3 +74,7 @@ jobs: - name: Assertions against the latest Astro run: pnpm smoke + + - run: pnpm build:unified + - name: Assertions against the latest Astro, on unified + run: pnpm smoke diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d194468..338acc9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -32,6 +32,8 @@ jobs: # working: build the showcase and assert on the HTML it produces. - run: pnpm build - run: pnpm smoke + - run: pnpm build:unified + - run: pnpm smoke - name: Publish working-directory: packages/jaamd diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 114c1d8..1ccd7e7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,8 @@ pnpm install pnpm dev # the showcase, on localhost:4321 pnpm typecheck && pnpm lint pnpm test:slug && pnpm test:themes -pnpm build && pnpm smoke +pnpm build && pnpm smoke # on Sätteri, Astro's default +pnpm build:unified && pnpm smoke # on unified ``` ## Themes diff --git a/README.md b/README.md index d802dfb..2218961 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

- Remark plugins, client-side enhancements and styles as a single Astro integration for Markdown content. + Markdown plugins, client-side enhancements and styles as a single Astro integration for Markdown content.

@@ -42,7 +42,8 @@ Showcase: [jaamd.lancher.dev](https://jaamd.lancher.dev) ```bash pnpm install pnpm dev # the showcase, on localhost:4321 -pnpm build && pnpm smoke +pnpm build && pnpm smoke # on Sätteri, Astro's default +pnpm build:unified && pnpm smoke # on unified ``` Adding a theme is a directory and a manifest entry: see [CONTRIBUTING.md](/CONTRIBUTING.md#themes). diff --git a/eslint.config.js b/eslint.config.js index 8c11903..3aad12b 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -29,6 +29,7 @@ export default tseslint.config( "packages/jaamd/src/paths.ts", "packages/jaamd/src/plugins/**/*.ts", "packages/jaamd/src/themes/index.ts", + "www/astro.config.mjs", "tests/**/*.mjs", "scripts/**/*.mjs", ], diff --git a/package.json b/package.json index 0ae3922..66a4ef5 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "scripts": { "dev": "pnpm --filter www dev", "build": "pnpm --filter www build", + "build:unified": "JAAMD_PROCESSOR=unified pnpm --filter www build", "preview": "pnpm --filter www preview", "typecheck": "tsc --noEmit -p packages/jaamd && pnpm --filter www check", "lint": "eslint .", diff --git a/packages/jaamd/README.md b/packages/jaamd/README.md index e9914d0..31f180b 100644 --- a/packages/jaamd/README.md +++ b/packages/jaamd/README.md @@ -1,6 +1,6 @@

JAAMD

- Just Another Astro Markdown — remark plugins, client-side enhancements and styles as a single Astro integration. + Just Another Astro Markdown — markdown plugins, client-side enhancements and styles as a single Astro integration.

--- @@ -40,7 +40,9 @@ npx astro add @lancher-dev/jaamd | Requirement | Detail | |---|---| -| Astro | `>=7.0.0 <8.0.0` | +| Astro | `^7.3.0` | +| Node | `>=22.12.0` | +| Markdown processor | Sätteri (Astro's default) or `unified()` | | Toolchain | Must compile TypeScript and `.astro` sources | JAAMD is published as source, with no compiled `dist/` and no emitted `.d.ts`. @@ -48,6 +50,15 @@ It works out of the box in any Astro project, but is not consumable from plain Node, a CommonJS build, or a TypeScript project using `"moduleResolution": "node16"`. +### Upgrading from 0.9 + +- jaamd no longer switches the markdown processor. With no configuration you + are on Sätteri. +- Set `markdown.processor: unified()` to stay on unified. +- `markdown.remarkPlugins` and `markdown.rehypePlugins` still work: Astro moves + to unified, jaamd adds its remark plugins. +- Astro `^7.3.0` is required. + ## Setup Add the integration to your Astro config: @@ -74,8 +85,12 @@ import MarkdownContent from "@lancher-dev/jaamd/components"; ``` -The integration registers all remark plugins and injects the stylesheet -automatically. No other configuration is required. +The integration registers its plugins on the configured markdown processor and +injects the stylesheet automatically. No other configuration is required. + +The processor is extended, never replaced: Sätteri gets mdast plugins and the +directive syntax, `unified()` gets the remark plugins. Any other processor is +left alone, with a warning. > [!IMPORTANT] > `` loads the stylesheets for you. If you render markdown @@ -99,7 +114,7 @@ jaamd({ codeTabs: true, // :::code-tabs directive blocks toc: true, // :::toc directive blocks alerts: true, // > [!NOTE] / [!WARNING] blockquote alerts - directive: true, // remark-directive (prerequisite for codeTabs and toc) + directive: true, // `:::` syntax (prerequisite for codeTabs and toc) }, }) ``` @@ -205,7 +220,7 @@ never went through Astro's pipeline (`set:html`, HTML from a CMS). With a sticky header, raise `--jaamd-scroll-margin-top` (default `80px`). > [!NOTE] -> `:::toc` needs `remark-directive`, on by default. With `plugins: { toc: false }` +> `:::toc` needs the directive syntax, on by default. With `plugins: { toc: false }` > the block degrades to a plain `
`: list and links intact, unstyled. ### Spoilers @@ -457,19 +472,43 @@ Add an inline script in `` to prevent a flash of the wrong theme: ## Manual / Advanced Usage -To bypass the integration, register the plugins yourself. Astro's default -markdown processor does not run `markdown.remarkPlugins`, so pass the `unified` -processor from `@astrojs/markdown-remark` explicitly: +To bypass the integration, register the plugins yourself on the processor you +use. On Sätteri, Astro's default: + +```ts +// astro.config.mjs +import { satteri } from "@astrojs/markdown-satteri"; +import { + satteriAlert, + satteriCodeTabs, + satteriToc, + satteriDirectiveFallback, +} from "@lancher-dev/jaamd"; + +export default defineConfig({ + markdown: { + processor: satteri({ + features: { directive: true }, + mdastPlugins: [satteriAlert, satteriCodeTabs, satteriToc, satteriDirectiveFallback], + }), + }, +}); +``` + +`satteriDirectiveFallback` keeps directives no plugin handles, which Sätteri +drops: blocks as a plain `
`, an inline `:name` as typed. Put it last. + +On unified: ```ts // astro.config.mjs import { unified } from "@astrojs/markdown-remark"; -import { remarkCodeTabs, remarkAlert, remarkDirective } from "@lancher-dev/jaamd"; +import { remarkAlert, remarkCodeTabs, remarkDirective, remarkToc } from "@lancher-dev/jaamd"; export default defineConfig({ markdown: { processor: unified({ - remarkPlugins: [remarkAlert, remarkDirective, remarkCodeTabs], + remarkPlugins: [remarkAlert, remarkDirective, remarkCodeTabs, remarkToc], }), }, }); diff --git a/packages/jaamd/index.ts b/packages/jaamd/index.ts index 2335c78..a963b35 100644 --- a/packages/jaamd/index.ts +++ b/packages/jaamd/index.ts @@ -1,34 +1,28 @@ -import * as astroMarkdownRemark from "@astrojs/markdown-remark"; +import type { + MarkdownProcessor, + ShikiConfig, + UnifiedResolvedOptions, +} from "@astrojs/markdown-remark"; +import type { SatteriResolvedOptions } from "@astrojs/markdown-satteri"; import type { AstroIntegration } from "astro"; import remarkDirective from "remark-directive"; import { remarkAlert } from "./src/plugins/remark-alert.js"; import remarkCodeTabs from "./src/plugins/remark-code-tabs.js"; import remarkToc from "./src/plugins/remark-toc.js"; +import { + satteriAlert, + satteriCodeTabs, + satteriDirectiveFallback, + satteriToc, +} from "./src/plugins/satteri.js"; import { paths } from "./src/paths.js"; import { DEFAULT_SELECTOR } from "./src/scripts/utils.js"; -interface MarkdownProcessor { - name: string; - options: { remarkPlugins?: unknown[]; rehypePlugins?: unknown[]; remarkRehype?: unknown }; -} - -// `@astrojs/markdown-remark`'s `.d.ts` doesn't declare these yet, though the runtime exports them. -const { unified, isUnifiedProcessor } = astroMarkdownRemark as unknown as { - unified: (opts?: { remarkPlugins?: unknown[]; rehypePlugins?: unknown[]; remarkRehype?: unknown }) => MarkdownProcessor; - isUnifiedProcessor: (p: unknown) => boolean; -}; - -interface ShikiConfig { - theme?: string; - themes?: { light: string; dark: string }; - defaultColor?: string | false; - wrap?: boolean; -} - -interface MarkdownConfig { - processor?: MarkdownProcessor; - shikiConfig?: ShikiConfig; -} +// Same check as Astro's `isSatteriProcessor` / `isUnifiedProcessor`. +const isSatteri = (p: MarkdownProcessor): p is MarkdownProcessor => + p.name === "satteri"; +const isUnified = (p: MarkdownProcessor): p is MarkdownProcessor => + p.name === "unified"; export interface JaamdOptions { /** @@ -55,7 +49,7 @@ export interface JaamdOptions { noDefault?: boolean; /** - * Granular control over which remark plugins are registered. + * Granular control over which markdown plugins are registered. * All enabled by default. */ plugins?: { @@ -65,12 +59,12 @@ export interface JaamdOptions { toc?: boolean; /** GitHub-style > [!NOTE] / [!WARNING] alerts */ alerts?: boolean; - /** remark-directive (prerequisite for codeTabs and toc) */ + /** `:::` directive syntax (prerequisite for codeTabs and toc) */ directive?: boolean; }; } -/** Registers jaamd's remark plugins and injects its stylesheets. */ +/** Registers jaamd's markdown plugins on the configured processor and injects its stylesheets. */ export default function jaamd(options: JaamdOptions = {}): AstroIntegration { const { selector = DEFAULT_SELECTOR, @@ -84,52 +78,65 @@ export default function jaamd(options: JaamdOptions = {}): AstroIntegration { name: "@lancher-dev/jaamd", hooks: { "astro:config:setup": ({ config, updateConfig, injectScript, logger }) => { - const jaamdRemarkPlugins: unknown[] = []; - if (alerts) jaamdRemarkPlugins.push(remarkAlert); - // directive must come before its consumers - if (directive || codeTabs || toc) jaamdRemarkPlugins.push(remarkDirective); - if (codeTabs) jaamdRemarkPlugins.push(remarkCodeTabs); - if (toc) jaamdRemarkPlugins.push(remarkToc); - - // Astro types these more precisely than jaamd needs; narrowed once to - // the keys the integration touches. - const mergedShikiConfig = { - ...config.markdown?.shikiConfig, - } as unknown as ShikiConfig; - const currentProcessor = config.markdown?.processor as - | MarkdownProcessor - | undefined; + const needsDirective = directive || codeTabs || toc; - const isDualTheme = typeof theme === "object" && !!theme.light && !!theme.dark; + const shikiConfig: ShikiConfig = { ...config.markdown.shikiConfig }; // Dual-theme mode: { light, dark } → Shiki "themes" with CSS variables + const isDualTheme = typeof theme === "object" && !!theme.light && !!theme.dark; if (isDualTheme) { - delete mergedShikiConfig.theme; - mergedShikiConfig.themes = { light: theme.light, dark: theme.dark }; - mergedShikiConfig.defaultColor = false; + delete shikiConfig.theme; + shikiConfig.themes = { light: theme.light, dark: theme.dark } as ShikiConfig["themes"]; + shikiConfig.defaultColor = false; } else { - mergedShikiConfig.theme = typeof theme === "string" ? theme : "github-light"; + shikiConfig.theme = (typeof theme === "string" ? theme : "github-light") as ShikiConfig["theme"]; } - if (mergedShikiConfig.wrap === undefined) mergedShikiConfig.wrap = true; - - const markdownUpdate: MarkdownConfig = { shikiConfig: mergedShikiConfig }; - - // Not public API. On rename jaamd skips its plugins silently; the - // scheduled CI run against latest Astro catches it. - const ASTRO_DEFAULT_PROCESSOR = "satteri"; - - const isUnified = !!currentProcessor && isUnifiedProcessor(currentProcessor); - const isDefault = - !currentProcessor || currentProcessor.name === ASTRO_DEFAULT_PROCESSOR; - - if (!isDefault && !isUnified) { - logger.warn( - `a custom \`markdown.processor\` ("${currentProcessor.name}") is already configured; jaamd's remark plugins (alerts/code-tabs) were not added. Pass them to your processor manually.`, - ); - } else { - const target = isUnified ? currentProcessor : unified(); - const existing: unknown[] = target.options.remarkPlugins ?? []; + shikiConfig.wrap ??= true; + + // Extended in place. New arrays, not unshift: a shared processor + // would stack duplicates across setup runs. + const processor = config.markdown.processor; + let registered: number; + let total: number; + + if (isSatteri(processor)) { + const plugins = [ + ...(alerts ? [satteriAlert] : []), + ...(codeTabs ? [satteriCodeTabs] : []), + ...(toc ? [satteriToc] : []), + ]; + const existing = processor.options.mdastPlugins; + // Entries nest. Factories have no name. + const namesIn = (entry: unknown): string[] => + Array.isArray(entry) + ? entry.flatMap(namesIn) + : entry && typeof entry === "object" && "name" in entry + ? [String(entry.name)] + : []; + const existingNames = new Set(namesIn(existing)); + const missing = plugins.filter((p) => !existingNames.has(p.name)); + + // After the user's plugins. + const fallback = + needsDirective && !existingNames.has(satteriDirectiveFallback.name) + ? [satteriDirectiveFallback] + : []; + + processor.options.mdastPlugins = [...missing, ...existing, ...fallback]; + if (needsDirective) { + processor.options.features = { ...processor.options.features, directive: true }; + } + [registered, total] = [missing.length, plugins.length]; + } else if (isUnified(processor)) { + const plugins = [ + ...(alerts ? [remarkAlert] : []), + // directive must come before its consumers + ...(needsDirective ? [remarkDirective] : []), + ...(codeTabs ? [remarkCodeTabs] : []), + ...(toc ? [remarkToc] : []), + ]; + const existing = processor.options.remarkPlugins; // Registering a plugin twice re-registers its micromark extensions. const nameOf = (p: unknown): string => { @@ -137,17 +144,22 @@ export default function jaamd(options: JaamdOptions = {}): AstroIntegration { return typeof fn === "function" ? fn.name : ""; }; const existingNames = new Set(existing.map(nameOf).filter(Boolean)); - const missing = jaamdRemarkPlugins.filter( + const missing = plugins.filter( (p) => !existing.includes(p) && !existingNames.has(nameOf(p)), ); - // New array, not unshift: the processor can be shared between - // configs; mutating it stacks duplicates across setup runs. - target.options.remarkPlugins = [...missing, ...existing]; - markdownUpdate.processor = target; + processor.options.remarkPlugins = [...missing, ...existing]; + [registered, total] = [missing.length, plugins.length]; + } else { + logger.warn( + `markdown processor "${processor.name}" is neither Sätteri nor unified; jaamd's plugins (alerts/code-tabs/toc) were not added. Pass them to your processor manually.`, + ); + [registered, total] = [0, 0]; + } + if (total > 0) { logger.info( - `markdown processor: ${currentProcessor?.name ?? "none"}, registered ${missing.length}/${jaamdRemarkPlugins.length} remark plugin(s)`, + `markdown processor: ${processor.name}, registered ${registered}/${total} plugin(s)`, ); } @@ -157,7 +169,7 @@ export default function jaamd(options: JaamdOptions = {}): AstroIntegration { // and never reach the Astro compiler. ssr: { noExternal: ["@lancher-dev/jaamd"] }, }, - markdown: markdownUpdate, + markdown: { shikiConfig }, }); // Stylesheets go through "page-ssr". CSS imported from the client "page" @@ -187,7 +199,13 @@ export default function jaamd(options: JaamdOptions = {}): AstroIntegration { }; } -// Named re-exports for users who configure remark manually +// For manual processor setup +export { + satteriAlert, + satteriCodeTabs, + satteriDirectiveFallback, + satteriToc, +} from "./src/plugins/satteri.js"; export { default as remarkCodeTabs } from "./src/plugins/remark-code-tabs.js"; export { default as remarkToc } from "./src/plugins/remark-toc.js"; export { remarkAlert } from "./src/plugins/remark-alert.js"; diff --git a/packages/jaamd/package.json b/packages/jaamd/package.json index 9f8520b..763fd36 100644 --- a/packages/jaamd/package.json +++ b/packages/jaamd/package.json @@ -1,7 +1,7 @@ { "name": "@lancher-dev/jaamd", "version": "0.9.2", - "description": "Add remark plugins, client-side enhancements and styles as a single Astro integration for Markdown content.", + "description": "Add markdown plugins, client-side enhancements and styles as a single Astro integration for Markdown content.", "type": "module", "license": "MIT", "author": "Kasui92 ", @@ -52,17 +52,22 @@ "src", "README.md" ], + "engines": { + "node": ">=22.12.0" + }, "peerDependencies": { - "astro": ">=7.0.0 <8.0.0" + "astro": "^7.3.0" }, "dependencies": { - "@astrojs/markdown-remark": "^7.2.2", + "@astrojs/markdown-remark": "^7.3.0", "remark-directive": "^4.0.0", "unist-util-visit": "^5.0.0" }, "devDependencies": { + "@astrojs/markdown-satteri": "0.4.3", "@types/mdast": "^4.0.4", - "astro": "^7.2.0", + "astro": "^7.3.8", + "satteri": "^0.10.5", "typescript": "^6.0.0", "unified": "^11.0.0" } diff --git a/packages/jaamd/src/plugins/remark-alert.ts b/packages/jaamd/src/plugins/remark-alert.ts index eaf27b9..9c9f7f2 100644 --- a/packages/jaamd/src/plugins/remark-alert.ts +++ b/packages/jaamd/src/plugins/remark-alert.ts @@ -6,9 +6,7 @@ import { visit } from "unist-util-visit"; import type { Root } from "mdast"; - -const alertRegex = /^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]/i; -const alertLegacyRegex = /^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)(\/.*)?]/i; +import { ALERT_LEGACY_MARKER, ALERT_MARKER, alertData, alertTitle } from "./render.js"; export interface RemarkAlertOptions { /** Use legacy title format (allows optional slash-suffix). @default false */ @@ -19,7 +17,7 @@ export interface RemarkAlertOptions { export function remarkAlert(options: RemarkAlertOptions = {}) { const { legacyTitle = false, tagName = "div" } = options; - const marker = legacyTitle ? alertLegacyRegex : alertRegex; + const marker = legacyTitle ? ALERT_LEGACY_MARKER : ALERT_MARKER; return (tree: Root) => { visit(tree, "blockquote", (node: any) => { @@ -48,20 +46,8 @@ export function remarkAlert(options: RemarkAlertOptions = {}) { ); } - node.data = { - hName: tagName, - hProperties: { - className: ["markdown-alert", `markdown-alert-${alertType}`], - dir: "auto", - }, - }; - node.children.unshift({ - type: "paragraph", - children: [getAlertIcon(alertType), { type: "text", value: title }], - data: { - hProperties: { className: "markdown-alert-title", dir: "auto" }, - }, - }); + node.data = alertData(alertType, tagName); + node.children.unshift(alertTitle(alertType, title)); return; } }); @@ -69,37 +55,3 @@ export function remarkAlert(options: RemarkAlertOptions = {}) { } export default remarkAlert; - -function getAlertIcon(type: string): any { - return { - type: "emphasis", - data: { - hName: "svg", - hProperties: { - className: ["octicon"], - viewBox: "0 0 16 16", - width: "16", - height: "16", - ariaHidden: "true", - }, - }, - children: [ - { - type: "emphasis", - data: { hName: "path", hProperties: { d: pathData[type] ?? "" } }, - children: [], - }, - ], - }; -} - -const pathData: Record = { - note: "M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z", - tip: "M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z", - important: - "M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z", - warning: - "M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z", - caution: - "M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z", -}; diff --git a/packages/jaamd/src/plugins/remark-code-tabs.ts b/packages/jaamd/src/plugins/remark-code-tabs.ts index b94d06c..650c202 100644 --- a/packages/jaamd/src/plugins/remark-code-tabs.ts +++ b/packages/jaamd/src/plugins/remark-code-tabs.ts @@ -1,7 +1,7 @@ import { visit } from "unist-util-visit"; import type { Plugin } from "unified"; import type { Root } from "mdast"; -import { escapeHtml } from "./utils.js"; +import { codeTabLabel, codeTabsHtml } from "./render.js"; /** * Tabbed code blocks: a `:::code-tabs` container wrapping fenced blocks. @@ -24,48 +24,21 @@ const remarkCodeTabs: Plugin<[], Root> = () => { ); if (codeNodes.length === 0) return; - const group = `jaamd-tabs-${groupIndex++}`; - const tabId = (i: number) => `${group}-tab-${i}`; - const panelId = (i: number) => `${group}-panel-${i}`; - - const labels: string[] = codeNodes.map( - (cn: any, i: number) => cn.meta || cn.lang || `Tab ${i + 1}`, + const html = codeTabsHtml( + `jaamd-tabs-${groupIndex++}`, + codeNodes.map(codeTabLabel), ); - const buttons = labels - .map((label, i) => { - const selected = i === 0; - return ( - `` - ); - }) - .join(""); - - const openHtml = - `
` + - `
${buttons}
`; - - const replacement: any[] = [{ type: "html", value: openHtml }]; + const replacement: any[] = [{ type: "html", value: html.open }]; codeNodes.forEach((codeNode: any, i: number) => { - replacement.push({ - type: "html", - value: - `
`, - }); + replacement.push({ type: "html", value: html.panelOpen(i) }); // Strip meta so Shiki doesn't render it as a title annotation replacement.push({ ...codeNode, meta: null }); - replacement.push({ type: "html", value: `
` }); + replacement.push({ type: "html", value: html.panelClose }); }); - replacement.push({ type: "html", value: `
` }); + replacement.push({ type: "html", value: html.close }); parent.children.splice(index, 1, ...replacement); return index + replacement.length; diff --git a/packages/jaamd/src/plugins/remark-toc.ts b/packages/jaamd/src/plugins/remark-toc.ts index 710482b..3a94090 100644 --- a/packages/jaamd/src/plugins/remark-toc.ts +++ b/packages/jaamd/src/plugins/remark-toc.ts @@ -1,9 +1,7 @@ import { visit } from "unist-util-visit"; import type { Plugin } from "unified"; import type { Root } from "mdast"; -import { escapeHtml } from "./utils.js"; - -const DEFAULT_LABEL = "Table of contents"; +import { TOC_CLOSE_HTML, tocOpenHtml } from "./render.js"; /** Plain text of a label paragraph. */ function textOf(node: any): string { @@ -40,21 +38,11 @@ const remarkToc: Plugin<[], Root> = () => { if (children.length === 0) return; - // A

, not a heading: keeps it out of getHeadings(). - const titleHtml = label - ? `

${escapeHtml(label)}

` - : ""; - const replacement: any[] = [ - { - type: "html", - value: - `` }, + { type: "html", value: TOC_CLOSE_HTML }, ]; parent.children.splice(index, 1, ...replacement); diff --git a/packages/jaamd/src/plugins/render.ts b/packages/jaamd/src/plugins/render.ts new file mode 100644 index 0000000..db27ef2 --- /dev/null +++ b/packages/jaamd/src/plugins/render.ts @@ -0,0 +1,114 @@ +/** Markup shared by the remark and Sätteri plugins. */ + +import { escapeHtml } from "./utils.js"; + +export const ALERT_MARKER = /^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]/i; +export const ALERT_LEGACY_MARKER = /^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)(\/.*)?]/i; + +export const DEFAULT_TOC_LABEL = "Table of contents"; + +/** Blockquote `data` for the alert wrapper. */ +export function alertData(alertType: string, tagName = "div") { + return { + hName: tagName, + hProperties: { + className: ["markdown-alert", `markdown-alert-${alertType}`], + dir: "auto", + }, + }; +} + +/** Title paragraph: icon plus label. */ +export function alertTitle(alertType: string, title: string): any { + return { + type: "paragraph", + children: [alertIcon(alertType), { type: "text", value: title }], + data: { + hProperties: { className: "markdown-alert-title", dir: "auto" }, + }, + }; +} + +function alertIcon(type: string): any { + return { + type: "emphasis", + data: { + hName: "svg", + hProperties: { + className: ["octicon"], + viewBox: "0 0 16 16", + width: "16", + height: "16", + ariaHidden: "true", + }, + }, + children: [ + { + type: "emphasis", + data: { hName: "path", hProperties: { d: pathData[type] ?? "" } }, + children: [], + }, + ], + }; +} + +/** Tab label: meta, then language, then "Tab N". */ +export function codeTabLabel(code: { meta?: string | null; lang?: string | null }, i: number): string { + return code.meta || code.lang || `Tab ${i + 1}`; +} + +/** HTML around the code blocks of one `:::code-tabs` group. */ +export function codeTabsHtml(group: string, labels: string[]) { + const tabId = (i: number) => `${group}-tab-${i}`; + const panelId = (i: number) => `${group}-panel-${i}`; + + const buttons = labels + .map((label, i) => { + const selected = i === 0; + return ( + `` + ); + }) + .join(""); + + return { + open: + `
` + + `
${buttons}
`, + panelOpen: (i: number) => + `
`, + panelClose: `
`, + close: `
`, + }; +} + +/** Opening of the TOC landmark. The title is a

: out of getHeadings(). */ +export function tocOpenHtml(label: string): string { + const titleHtml = label + ? `

${escapeHtml(label)}

` + : ""; + return ( + ``; + +const pathData: Record = { + note: "M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z", + tip: "M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z", + important: + "M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z", + warning: + "M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z", + caution: + "M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z", +}; diff --git a/packages/jaamd/src/plugins/satteri.ts b/packages/jaamd/src/plugins/satteri.ts new file mode 100644 index 0000000..9d726e6 --- /dev/null +++ b/packages/jaamd/src/plugins/satteri.ts @@ -0,0 +1,133 @@ +/** Sätteri mdast plugins. `:::` blocks require `features.directive`. */ + +import type { MdastPluginDefinition, MdastVisitorContext } from "satteri"; +import { + ALERT_MARKER, + TOC_CLOSE_HTML, + alertData, + alertTitle, + codeTabLabel, + codeTabsHtml, + tocOpenHtml, +} from "./render.js"; + +/** GitHub-style `> [!NOTE]` alerts. */ +export const satteriAlert: MdastPluginDefinition = { + name: "jaamd-alert", + blockquote(node, ctx) { + for (const paragraph of node.children) { + if (paragraph.type !== "paragraph") continue; + + const [first, second] = paragraph.children; + const match = first?.type === "text" ? first.value.match(ALERT_MARKER) : null; + if (!first || first.type !== "text" || !match) continue; + + const alertType = match[1].toLowerCase(); + + if (first.value.includes("\n")) { + ctx.setProperty( + first, + "value", + first.value.replace(ALERT_MARKER, "").replace(/^\n+/, ""), + ); + } else { + // Marker is the whole first line: drop it and the following break. + ctx.removeNode(first); + if (second?.type === "break") ctx.removeNode(second); + } + + ctx.setProperty(node, "data", alertData(alertType)); + ctx.prependChild(node, alertTitle(alertType, alertType.toUpperCase())); + return; + } + }, +}; + +// Group counter per document, keyed on its data bag. +const tabGroups = new WeakMap(); + +/** `:::code-tabs` container wrapping fenced blocks. */ +export const satteriCodeTabs: MdastPluginDefinition = { + name: "jaamd-code-tabs", + containerDirective(node, ctx) { + if (node.name !== "code-tabs") return; + + const codeNodes = node.children.filter((child) => child.type === "code"); + if (codeNodes.length === 0) return; + + const groupIndex = tabGroups.get(ctx.data) ?? 0; + tabGroups.set(ctx.data, groupIndex + 1); + + const html = codeTabsHtml( + `jaamd-tabs-${groupIndex}`, + codeNodes.map(codeTabLabel), + ); + + ctx.replaceNode(node, [ + { type: "html", value: html.open }, + ...codeNodes.flatMap((codeNode, i) => [ + { type: "html" as const, value: html.panelOpen(i) }, + // Strip meta so Shiki doesn't render it as a title annotation + { ...codeNode, meta: null }, + { type: "html" as const, value: html.panelClose }, + ]), + { type: "html", value: html.close }, + ]); + }, +}; + +/** `:::toc` container: the author's list, wrapped in a landmark. */ +export const satteriToc: MdastPluginDefinition = { + name: "jaamd-toc", + containerDirective(node, ctx) { + if (node.name !== "toc") return; + + const children = [...node.children]; + + // `[label]` arrives as a flagged paragraph. + const first = children[0]; + const label = + first?.type === "paragraph" && first.data?.directiveLabel === true + ? ctx.textContent(children.shift()!).trim() + : ""; + + if (children.length === 0) return; + + ctx.replaceNode(node, [ + { type: "html", value: tocOpenHtml(label) }, + // Left as mdast: the list renders normally. + ...children, + { type: "html", value: TOC_CLOSE_HTML }, + ]); + }, +}; + +/** + * Keeps directives no plugin claimed, which Sätteri drops with their content. + * Blocks become a plain `
`, an inline `:name` its source text. + */ +export const satteriDirectiveFallback: MdastPluginDefinition = { + name: "jaamd-directive-fallback", + options: { position: true }, + containerDirective: keepAsDiv, + leafDirective: keepAsDiv, + textDirective(node, ctx) { + if (isClaimed(node)) return; + const { start, end } = node.position ?? {}; + if (start?.offset === undefined || end?.offset === undefined) return; + ctx.replaceNode(node, { type: "text", value: ctx.source.slice(start.offset, end.offset) }); + }, +}; + +function isClaimed(node: { data?: object | null }): boolean { + return !!node.data && "hName" in node.data; +} + +type BlockDirective = Parameters< + NonNullable +>[0]; + +function keepAsDiv(node: BlockDirective, ctx: MdastVisitorContext): void { + if (isClaimed(node)) return; + ctx.setProperty(node, "data", { ...node.data, hName: "div" }); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d60a674..6da31ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 10.10.0 eslint-plugin-astro: specifier: ^3.1.0 - version: 3.1.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0)(typescript@6.0.3))(eslint@10.10.0)(typescript-eslint@8.69.0(eslint@10.10.0)(typescript@6.0.3)) + version: 3.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@typescript-eslint/parser@8.69.0(eslint@10.10.0)(typescript@6.0.3))(eslint@10.10.0)(typescript-eslint@8.69.0(eslint@10.10.0)(typescript@6.0.3)) github-slugger: specifier: ^2.0.0 version: 2.0.0 @@ -39,8 +39,8 @@ importers: packages/jaamd: dependencies: '@astrojs/markdown-remark': - specifier: ^7.2.2 - version: 7.3.0 + specifier: ^7.3.0 + version: 7.3.2 remark-directive: specifier: ^4.0.0 version: 4.0.0 @@ -48,12 +48,18 @@ importers: specifier: ^5.0.0 version: 5.1.0 devDependencies: + '@astrojs/markdown-satteri': + specifier: 0.4.3 + version: 0.4.3 '@types/mdast': specifier: ^4.0.4 version: 4.0.4 astro: - specifier: ^7.2.0 - version: 7.3.1(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(yaml@2.9.0) + specifier: ^7.3.8 + version: 7.3.8(@astrojs/markdown-remark@7.3.2)(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.1) + satteri: + specifier: ^0.10.5 + version: 0.10.5 typescript: specifier: ^6.0.0 version: 6.0.3 @@ -67,12 +73,15 @@ importers: specifier: workspace:* version: link:../packages/jaamd astro: - specifier: ^7.2.0 - version: 7.3.1(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(yaml@2.9.0) + specifier: ^7.3.8 + version: 7.3.8(@astrojs/markdown-remark@7.3.2)(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.1) devDependencies: '@astrojs/check': specifier: ^0.9.10 version: 0.9.10(prettier@3.9.6)(typescript@6.0.3) + '@astrojs/markdown-remark': + specifier: ^7.3.2 + version: 7.3.2 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -85,18 +94,36 @@ packages: peerDependencies: typescript: ^5.0.0 || ^6.0.0 + '@astrojs/compiler-binding-android-arm64@0.5.1': + resolution: {integrity: sha512-nMb2nMIJtcWLNH+fV75Enmi+jp4tIOYOfsv4XtpgdOWkqc9P4uSSdK5u1xb340AzrXo5V18SxLl/nc3vcqtamQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@astrojs/compiler-binding-darwin-arm64@0.4.0': resolution: {integrity: sha512-ZVUwHundaQyFNjE6uoa0usaC0WOCitDCLS/4mdb4rOiJXwVUuKJBMxI5WMzXLWmamsXtK/Z//ifLXvV5Yeh4Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@astrojs/compiler-binding-darwin-arm64@0.5.1': + resolution: {integrity: sha512-5k4+nZ/WRt+dcVow4z7rBuI7iv9A58h/uQ91YJe1PrTivbcCkq3u2Ynx/AZJwII4CsZawBCeGpojkFjutZBhBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@astrojs/compiler-binding-darwin-x64@0.4.0': resolution: {integrity: sha512-FI6G8AY8u6fR1SI/QRR5yGMwtvZwP34CDmZpZ5HwJGa50UM1VISTLhqkhV4a476pmgd25X1Aur2dqw6hUnrlKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@astrojs/compiler-binding-darwin-x64@0.5.1': + resolution: {integrity: sha512-0Buw+YST9Ff2EqQyhRMQujuFq/dijLw3zXWhsvI0dJ2pGrT38iVoxTEca2eBX/PfhlwkVWSRJEKO5gMqKHyeHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@astrojs/compiler-binding-linux-arm64-gnu@0.4.0': resolution: {integrity: sha512-lB9gLFJK7m82EnjaU8nlRBEfcwGNeHidW3sSjODTUjMNaoewVuUz9fwwdY5M4jiSXIqWLH3yl6TX8FTDKA74Sw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -104,6 +131,13 @@ packages: os: [linux] libc: [glibc] + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.1': + resolution: {integrity: sha512-x5LRpyCoMKuu3INr18cn42YhwSOaRpp9b5Ny3eJJ/sWVeejC16Zeshu1JlvlSmEZACLeWxU5JM0RX6T6nI+YyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@astrojs/compiler-binding-linux-arm64-musl@0.4.0': resolution: {integrity: sha512-HPbvWqbxFxyaoQJhLxCaSjtYBx9KBo7JGVzEFZCmMl968a2PsSH0UfiODYgYPXofTOIsIH2aoCcrHXML0IA3ig==} engines: {node: ^20.19.0 || >=22.12.0} @@ -111,6 +145,13 @@ packages: os: [linux] libc: [musl] + '@astrojs/compiler-binding-linux-arm64-musl@0.5.1': + resolution: {integrity: sha512-mL7tQEuDk3rGfaKmrO63nw6WBy1TPVioQGmVyjcAr+C+a/k3SVMYBytNSMqH9mZPT/Swj30JaZ2N842Z1NnOEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@astrojs/compiler-binding-linux-x64-gnu@0.4.0': resolution: {integrity: sha512-tQKolMxoJ/+0AmLWm1PmJ/i+z3i10ZU1bNuVjEDulCf48azEMtUNjTZgHJ5MPtpYRNc7dlETr8QujUfduzoC7Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -118,6 +159,13 @@ packages: os: [linux] libc: [glibc] + '@astrojs/compiler-binding-linux-x64-gnu@0.5.1': + resolution: {integrity: sha512-uLGc9jtxwiDe4cQyhNPQim4ECiB/YzbWlXssfLAv8r374kArfTwBHjwR2+j+XVyF71yCx5mF9YNRclRqdNBgeg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@astrojs/compiler-binding-linux-x64-musl@0.4.0': resolution: {integrity: sha512-5v5YymudsxMHp3NBLCS8BUlu5CRqeLtWD9cKS/4nIhIEHCbpz9okmVV6I0HWqmBAPhWYcDa3vw/vltYPrOQCTA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -125,36 +173,68 @@ packages: os: [linux] libc: [musl] + '@astrojs/compiler-binding-linux-x64-musl@0.5.1': + resolution: {integrity: sha512-G0cywinaQUc8v1MrytvYKUX7svTDMmYtOCZfxjwKPbJi59zIqM+Ll0rWgO0GQWLZH3XoPYo19ZwlP3Xt9ep9YA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@astrojs/compiler-binding-wasm32-wasi@0.4.0': resolution: {integrity: sha512-m/phuH3x3PREvv1OnkM44NoPh4MatUadix1fB1u5SvMLCyDTUZykDJbKnWf1cjnYmHdlB8HcjTjl6JrCqAIXcw==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@astrojs/compiler-binding-wasm32-wasi@0.5.1': + resolution: {integrity: sha512-yMhLL8asmLydoAdnEZxAw6eLfNDs3YJl6jqn0pjPt6zrb2U5qIDLnii4/twThpIFODKkQ6YDpBRTOz/vSfZCxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@astrojs/compiler-binding-win32-arm64-msvc@0.4.0': resolution: {integrity: sha512-B9zYf3okEY83kM8gydlpH2BHP00w4ifxPqlYlWrgTwuD6wnkrJDCwBlgy1q31cERjCJRXN1lrE2VmkLvFjv/6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.1': + resolution: {integrity: sha512-aClIG6poFt3Wf/bZykrEAX2nAnKvBHW6RXiKUa69QjBtWH0/FOlOAjnFcxRNlhej2AMWNYFx0o+LGjwMcH8P7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@astrojs/compiler-binding-win32-x64-msvc@0.4.0': resolution: {integrity: sha512-zB0Nrv0dGc0zZWPGDRmmETTPhDRqyZjAjk+gWMlVrJX5U89obpB3VUUE1ZiHxOCN5LQojeLK6O8L/dnoHolvNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@astrojs/compiler-binding-win32-x64-msvc@0.5.1': + resolution: {integrity: sha512-/E6uBCagY70YpWqssBC+/FuniNSloeQPRgj7l3LDWiqjxIyTLnIgX1sTt18FU7jrigetpSnC9cHAM6b6IxSgPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@astrojs/compiler-binding@0.4.0': resolution: {integrity: sha512-x2RjDUuWfwLNtc3mjAdSRInwqh/rqbLar9cm/5FOMbHvmYZB7yfKewzSclAxWjIZsypJDXv1lhaP2WG+P8TK3g==} engines: {node: ^20.19.0 || >=22.12.0} + '@astrojs/compiler-binding@0.5.1': + resolution: {integrity: sha512-oczyolLUl9mNrtuBuNjuvn5thpHrFLXAHAWGTRg0JDHQ8cGVsVeFekOu2uSoQGgainJIi+A3/9m0DyYwz3Nlnw==} + engines: {node: ^20.19.0 || >=22.12.0} + '@astrojs/compiler-rs@0.4.0': resolution: {integrity: sha512-koVikeon1kreEy+/JzLQRy3vzHHQVOjycs4degg4vFufKApZOwMZvSSAEztYNhmcQVfNVsVZZI4cEge3cexAbQ==} engines: {node: '>=22.12.0'} + '@astrojs/compiler-rs@0.5.1': + resolution: {integrity: sha512-1k1acnX7DepIiea9U9/Y+d1hdAFfylu1ZQQkkYgRSwBOBAsXInolyZuh/2tax+83vu/A+hOYP6P3+265RvMTvw==} + engines: {node: '>=22.12.0'} + '@astrojs/compiler@2.13.1': resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} - '@astrojs/internal-helpers@0.11.0': - resolution: {integrity: sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==} + '@astrojs/internal-helpers@0.12.0': + resolution: {integrity: sha512-pKPuwCDtO0L7zgmt1JGd9X4Aes1+0SX3IEBSqBNPHsScYdPMlfmed3Y7DTbXyF7E+8ylnb563o/0OzGQPOFehw==} '@astrojs/language-server@2.16.16': resolution: {integrity: sha512-KuS17AOOqH/M5mHXPmKvtp8L+NNteARC7Xjf395+9R9dtJOBndqdStwU4V+OKzYZpgZ+hliV13knzx/oMtFl7Q==} @@ -168,11 +248,11 @@ packages: prettier-plugin-astro: optional: true - '@astrojs/markdown-remark@7.3.0': - resolution: {integrity: sha512-mRwn2W2PKkOj8XEAiD3b9RIF4qq6FKB6U4c98GxFLkEJH7uA6ZZv8TiqVjJSPMANLb1NtwBTgkY+KO4mTXnT/Q==} + '@astrojs/markdown-remark@7.3.2': + resolution: {integrity: sha512-ubszw8SVEI4OHR5Y+0jTbkmzG8xatrW47iAkQNqH7wUM1bky7DOnr51FGgoUdXt/fmKpUl7sRRX9talmU64Y+g==} - '@astrojs/markdown-satteri@0.4.0': - resolution: {integrity: sha512-wykOOW9KsUVcZweOpY/CeXpdKcCKZy6fQbdcteWFuI75+sQCiqxYM7VKsGa5b+aGl3cYQscFY37rsbbyal5MRw==} + '@astrojs/markdown-satteri@0.4.3': + resolution: {integrity: sha512-PFbEHPnwUlLvpXd7RXrrKM+j12akF4bG+DSuNuoN+3eiwjOwp4HaPi+QQdbkBV7QEYXmzyKca50OJsmGxhNIUA==} '@astrojs/prism@4.0.2': resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==} @@ -261,12 +341,12 @@ packages: resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==} engines: {node: '>=18'} - '@clack/core@1.4.3': - resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} engines: {node: '>= 20.12.0'} - '@clack/prompts@1.7.0': - resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} engines: {node: '>= 20.12.0'} '@emmetio/abbreviation@2.3.3': @@ -293,6 +373,9 @@ packages: '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} @@ -302,6 +385,9 @@ packages: '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} @@ -701,104 +787,111 @@ packages: '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + '@napi-rs/wasm-runtime@1.2.5': + resolution: {integrity: sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} - '@oxc-project/types@0.148.0': - resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} + '@oxc-project/types@0.153.0': + resolution: {integrity: sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==} - '@rolldown/binding-android-arm-eabi@1.2.7': - resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==} + '@rolldown/binding-android-arm-eabi@1.2.13': + resolution: {integrity: sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.7': - resolution: {integrity: sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==} + '@rolldown/binding-android-arm64@1.2.13': + resolution: {integrity: sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.7': - resolution: {integrity: sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==} + '@rolldown/binding-darwin-arm64@1.2.13': + resolution: {integrity: sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.7': - resolution: {integrity: sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==} + '@rolldown/binding-darwin-x64@1.2.13': + resolution: {integrity: sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.7': - resolution: {integrity: sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==} + '@rolldown/binding-freebsd-x64@1.2.13': + resolution: {integrity: sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.7': - resolution: {integrity: sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.13': + resolution: {integrity: sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.7': - resolution: {integrity: sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==} + '@rolldown/binding-linux-arm64-gnu@1.2.13': + resolution: {integrity: sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.7': - resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==} + '@rolldown/binding-linux-arm64-musl@1.2.13': + resolution: {integrity: sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.7': - resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.13': + resolution: {integrity: sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.7': - resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==} + '@rolldown/binding-linux-s390x-gnu@1.2.13': + resolution: {integrity: sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.7': - resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==} + '@rolldown/binding-linux-x64-gnu@1.2.13': + resolution: {integrity: sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.7': - resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==} + '@rolldown/binding-linux-x64-musl@1.2.13': + resolution: {integrity: sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.7': - resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==} + '@rolldown/binding-openharmony-arm64@1.2.13': + resolution: {integrity: sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.7': - resolution: {integrity: sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==} + '@rolldown/binding-win32-arm64-msvc@1.2.13': + resolution: {integrity: sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.7': - resolution: {integrity: sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==} + '@rolldown/binding-win32-x64-msvc@1.2.13': + resolution: {integrity: sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -996,8 +1089,8 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - am-i-vibing@0.4.0: - resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==} + am-i-vibing@0.5.0: + resolution: {integrity: sha512-KLcsDhqf1XRrJmJr+9I/C0EX2K+sGrAGZFgkmd84c8TJO9zJBu+/kFInjazu1KfJWFhWDKdRWkpBzEs7s35DVA==} hasBin: true ansi-regex@6.3.0: @@ -1012,9 +1105,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -1030,8 +1120,8 @@ packages: resolution: {integrity: sha512-lS5qlx401Q1ZUhQ44XQnM4uT2qI6hA0H+vstrd841xGVxunFOs0ut3DWJGYHK1l7mxRxQdDi1j53pfE7/AyGlA==} engines: {node: ^22.22.3 || ^24.16.0 || >=26.3.0} - astro@7.3.1: - resolution: {integrity: sha512-A/bJYHtc6n0UAdROY9W948fW6lX0pnUA+JWKW+IGCXRyDIGN2MsXC0OlS8onZGJjr+sv8htemwOc9W5PBRXCkw==} + astro@7.3.8: + resolution: {integrity: sha512-LHzDHSaV+YzZiR3EFndDYTLLeNeuMtP1qX1FLcCNUUHOCqTTIWPczy2UV3zpA5VqvJe5cWZolqM9Z8JFqR2i9w==} engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true peerDependencies: @@ -1177,8 +1267,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devalue@5.9.2: - resolution: {integrity: sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w==} + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1218,8 +1308,8 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - es-module-lexer@2.3.2: - resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + es-module-lexer@3.0.3: + resolution: {integrity: sha512-yWGe1O/j+almnV4hOYrmZo8u58JdnmXEMneRQAYkWtqSiT86yoMIEKF4rpqEDj52tbYl3xceBD3DQIBwcsC9Pw==} esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -1362,8 +1452,8 @@ packages: file-entry-cache@11.1.5: resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} - find-proc@0.1.0: - resolution: {integrity: sha512-OaOpEYv2PiQ7SQ5LIrl+deA1XaWcxEjnpM6VuWXTUvn+teIXxeFTLDmu18/zDQpFmHN4o3oDBX+BT0AGwEhemg==} + find-proc@0.2.0: + resolution: {integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==} engines: {node: ^20.19.0 || >=22.12.0} find-up@5.0.0: @@ -1400,8 +1490,8 @@ packages: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} - get-tsconfig@5.0.0-beta.4: - resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} engines: {node: '>=20.20.0'} github-slugger@2.0.0: @@ -1523,10 +1613,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - js-yaml@4.3.2: - resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} - hasBin: true - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -1638,11 +1724,11 @@ packages: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} - magic-string@1.2.3: - resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} + magic-string@1.4.3: + resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} - magicast@0.5.4: - resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} @@ -1838,6 +1924,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1861,8 +1952,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - obug@2.1.4: - resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} engines: {node: '>=12.20.0'} ofetch@1.5.1: @@ -1885,8 +1976,8 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@7.3.2: - resolution: {integrity: sha512-Ll0w3fU24vYpXoZmjjZIee6bJQDgG0oAyo1PdmFYI8UDwJJddaHAypxIH9avUu+t+lSsAwKVsb1jDCMIIChliw==} + p-limit@7.3.3: + resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} engines: {node: '>=20'} p-locate@5.0.0: @@ -1946,6 +2037,10 @@ packages: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.30: + resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2064,8 +2159,8 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - rolldown@1.2.7: - resolution: {integrity: sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==} + rolldown@1.2.13: + resolution: {integrity: sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2109,10 +2204,18 @@ packages: resolution: {integrity: sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==} engines: {node: '>= 18'} + smol-toml@1.9.1: + resolution: {integrity: sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ==} + engines: {node: '>= 18'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} + source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} @@ -2149,8 +2252,8 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - tinyclip@0.1.15: - resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==} + tinyclip@1.0.3: + resolution: {integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==} engines: {node: ^16.14.0 || >= 17.3.0} tinyexec@1.3.1: @@ -2318,6 +2421,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + verkit@0.5.0: + resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} + engines: {node: '>=18.12.0'} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -2327,13 +2434,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.2.2: - resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} + vite@8.3.4: + resolution: {integrity: sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.4.0 || ^0.5.0 + '@vitejs/devtools': ^0.7.1 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -2517,6 +2624,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@22.0.0: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} @@ -2533,8 +2645,8 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - zod@4.5.4: - resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -2552,62 +2664,73 @@ snapshots: - prettier - prettier-plugin-astro + '@astrojs/compiler-binding-android-arm64@0.5.1': + optional: true + '@astrojs/compiler-binding-darwin-arm64@0.4.0': optional: true + '@astrojs/compiler-binding-darwin-arm64@0.5.1': + optional: true + '@astrojs/compiler-binding-darwin-x64@0.4.0': optional: true + '@astrojs/compiler-binding-darwin-x64@0.5.1': + optional: true + '@astrojs/compiler-binding-linux-arm64-gnu@0.4.0': optional: true + '@astrojs/compiler-binding-linux-arm64-gnu@0.5.1': + optional: true + '@astrojs/compiler-binding-linux-arm64-musl@0.4.0': optional: true + '@astrojs/compiler-binding-linux-arm64-musl@0.5.1': + optional: true + '@astrojs/compiler-binding-linux-x64-gnu@0.4.0': optional: true + '@astrojs/compiler-binding-linux-x64-gnu@0.5.1': + optional: true + '@astrojs/compiler-binding-linux-x64-musl@0.4.0': optional: true - '@astrojs/compiler-binding-wasm32-wasi@0.4.0': + '@astrojs/compiler-binding-linux-x64-musl@0.5.1': + optional: true + + '@astrojs/compiler-binding-wasm32-wasi@0.4.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': dependencies: - '@napi-rs/wasm-runtime': 1.2.3 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' optional: true - '@astrojs/compiler-binding-wasm32-wasi@0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)': + '@astrojs/compiler-binding-wasm32-wasi@0.5.1': dependencies: - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) optional: true '@astrojs/compiler-binding-win32-arm64-msvc@0.4.0': optional: true + '@astrojs/compiler-binding-win32-arm64-msvc@0.5.1': + optional: true + '@astrojs/compiler-binding-win32-x64-msvc@0.4.0': optional: true - '@astrojs/compiler-binding@0.4.0': - optionalDependencies: - '@astrojs/compiler-binding-darwin-arm64': 0.4.0 - '@astrojs/compiler-binding-darwin-x64': 0.4.0 - '@astrojs/compiler-binding-linux-arm64-gnu': 0.4.0 - '@astrojs/compiler-binding-linux-arm64-musl': 0.4.0 - '@astrojs/compiler-binding-linux-x64-gnu': 0.4.0 - '@astrojs/compiler-binding-linux-x64-musl': 0.4.0 - '@astrojs/compiler-binding-wasm32-wasi': 0.4.0 - '@astrojs/compiler-binding-win32-arm64-msvc': 0.4.0 - '@astrojs/compiler-binding-win32-x64-msvc': 0.4.0 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@astrojs/compiler-binding-win32-x64-msvc@0.5.1': + optional: true - '@astrojs/compiler-binding@0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)': + '@astrojs/compiler-binding@0.4.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': optionalDependencies: '@astrojs/compiler-binding-darwin-arm64': 0.4.0 '@astrojs/compiler-binding-darwin-x64': 0.4.0 @@ -2615,39 +2738,49 @@ snapshots: '@astrojs/compiler-binding-linux-arm64-musl': 0.4.0 '@astrojs/compiler-binding-linux-x64-gnu': 0.4.0 '@astrojs/compiler-binding-linux-x64-musl': 0.4.0 - '@astrojs/compiler-binding-wasm32-wasi': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3) + '@astrojs/compiler-binding-wasm32-wasi': 0.4.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) '@astrojs/compiler-binding-win32-arm64-msvc': 0.4.0 '@astrojs/compiler-binding-win32-x64-msvc': 0.4.0 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - '@astrojs/compiler-rs@0.4.0': - dependencies: - '@astrojs/compiler-binding': 0.4.0 + '@astrojs/compiler-binding@0.5.1': + optionalDependencies: + '@astrojs/compiler-binding-android-arm64': 0.5.1 + '@astrojs/compiler-binding-darwin-arm64': 0.5.1 + '@astrojs/compiler-binding-darwin-x64': 0.5.1 + '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.1 + '@astrojs/compiler-binding-linux-arm64-musl': 0.5.1 + '@astrojs/compiler-binding-linux-x64-gnu': 0.5.1 + '@astrojs/compiler-binding-linux-x64-musl': 0.5.1 + '@astrojs/compiler-binding-wasm32-wasi': 0.5.1 + '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.1 + '@astrojs/compiler-binding-win32-x64-msvc': 0.5.1 + + '@astrojs/compiler-rs@0.4.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + '@astrojs/compiler-binding': 0.4.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - '@astrojs/compiler-rs@0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)': + '@astrojs/compiler-rs@0.5.1': dependencies: - '@astrojs/compiler-binding': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@astrojs/compiler-binding': 0.5.1 '@astrojs/compiler@2.13.1': {} - '@astrojs/internal-helpers@0.11.0': + '@astrojs/internal-helpers@0.12.0': dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - js-yaml: 4.3.2 picomatch: 4.0.7 retext-smartypants: 6.2.0 shiki: 4.4.3 smol-toml: 1.8.0 unified: 11.0.5 + yaml: 2.9.1 '@astrojs/language-server@2.16.16(prettier@3.9.6)(typescript@6.0.3)': dependencies: @@ -2674,9 +2807,9 @@ snapshots: transitivePeerDependencies: - typescript - '@astrojs/markdown-remark@7.3.0': + '@astrojs/markdown-remark@7.3.2': dependencies: - '@astrojs/internal-helpers': 0.11.0 + '@astrojs/internal-helpers': 0.12.0 '@astrojs/prism': 4.0.2 '@mdx-js/mdx': 3.1.1 acorn: 8.18.0 @@ -2701,9 +2834,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/markdown-satteri@0.4.0': + '@astrojs/markdown-satteri@0.4.3': dependencies: - '@astrojs/internal-helpers': 0.11.0 + '@astrojs/internal-helpers': 0.12.0 '@astrojs/prism': 4.0.2 github-slugger: 2.0.0 satteri: 0.10.5 @@ -2758,7 +2891,7 @@ snapshots: dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true '@bruits/satteri-win32-arm64-msvc@0.10.5': @@ -2783,14 +2916,14 @@ snapshots: dependencies: fontkitten: 1.0.3 - '@clack/core@1.4.3': + '@clack/core@1.5.1': dependencies: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@1.7.0': + '@clack/prompts@1.8.1': dependencies: - '@clack/core': 1.4.3 + '@clack/core': 1.5.1 fast-string-width: 3.0.2 fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 @@ -2824,6 +2957,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 @@ -2839,6 +2978,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.28.2': optional: true @@ -3114,72 +3258,74 @@ snapshots: transitivePeerDependencies: - supports-color - '@napi-rs/wasm-runtime@1.2.3': + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 '@tybys/wasm-util': 0.10.3 optional: true - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 '@tybys/wasm-util': 0.10.3 optional: true - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)': + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': dependencies: - '@emnapi/core': 1.11.1 + '@emnapi/core': 1.11.3 '@emnapi/runtime': 1.11.3 '@tybys/wasm-util': 0.10.3 optional: true '@oslojs/encoding@1.1.0': {} - '@oxc-project/types@0.148.0': {} + '@oxc-project/types@0.153.0': {} - '@rolldown/binding-android-arm-eabi@1.2.7': + '@rolldown/binding-android-arm-eabi@1.2.13': optional: true - '@rolldown/binding-android-arm64@1.2.7': + '@rolldown/binding-android-arm64@1.2.13': optional: true - '@rolldown/binding-darwin-arm64@1.2.7': + '@rolldown/binding-darwin-arm64@1.2.13': optional: true - '@rolldown/binding-darwin-x64@1.2.7': + '@rolldown/binding-darwin-x64@1.2.13': optional: true - '@rolldown/binding-freebsd-x64@1.2.7': + '@rolldown/binding-freebsd-x64@1.2.13': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.7': + '@rolldown/binding-linux-arm-gnueabihf@1.2.13': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.7': + '@rolldown/binding-linux-arm64-gnu@1.2.13': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.7': + '@rolldown/binding-linux-arm64-musl@1.2.13': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.7': + '@rolldown/binding-linux-ppc64-gnu@1.2.13': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.7': + '@rolldown/binding-linux-s390x-gnu@1.2.13': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.7': + '@rolldown/binding-linux-x64-gnu@1.2.13': optional: true - '@rolldown/binding-linux-x64-musl@1.2.7': + '@rolldown/binding-linux-x64-musl@1.2.13': optional: true - '@rolldown/binding-openharmony-arm64@1.2.7': + '@rolldown/binding-openharmony-arm64@1.2.13': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.7': + '@rolldown/binding-win32-arm64-msvc@1.2.13': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.7': + '@rolldown/binding-win32-x64-msvc@1.2.13': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -3438,7 +3584,7 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - am-i-vibing@0.4.0: + am-i-vibing@0.5.0: dependencies: process-ancestry: 0.1.0 @@ -3451,17 +3597,15 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 - argparse@2.0.1: {} - aria-query@5.3.2: {} array-iterate@2.0.1: {} astring@1.9.0: {} - astro-eslint-parser@3.1.0: + astro-eslint-parser@3.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3): dependencies: - '@astrojs/compiler-rs': 0.4.0 + '@astrojs/compiler-rs': 0.4.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) '@typescript-eslint/scope-manager': 8.69.0 '@typescript-eslint/types': 8.69.0 debug: 4.4.3 @@ -3475,63 +3619,62 @@ snapshots: - '@emnapi/runtime' - supports-color - astro@7.3.1(@astrojs/markdown-remark@7.3.0)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(yaml@2.9.0): + astro@7.3.8(@astrojs/markdown-remark@7.3.2)(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.1): dependencies: - '@astrojs/compiler-rs': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3) - '@astrojs/internal-helpers': 0.11.0 - '@astrojs/markdown-satteri': 0.4.0 + '@astrojs/compiler-rs': 0.5.1 + '@astrojs/internal-helpers': 0.12.0 + '@astrojs/markdown-satteri': 0.4.3 '@astrojs/telemetry': 3.3.3 '@capsizecss/unpack': 4.0.1 - '@clack/prompts': 1.7.0 + '@clack/prompts': 1.8.1 '@oslojs/encoding': 1.1.0 - am-i-vibing: 0.4.0 + am-i-vibing: 0.5.0 aria-query: 5.3.2 axobject-query: 4.1.0 ci-info: 4.4.0 clsx: 2.1.1 common-ancestor-path: 2.0.0 cookie: 2.0.1 - devalue: 5.9.2 + devalue: 5.9.4 diff: 9.0.0 dset: 3.1.4 - es-module-lexer: 2.3.2 - esbuild: 0.28.2 - find-proc: 0.1.0 + es-module-lexer: 3.0.3 + find-proc: 0.2.0 flattie: 1.1.1 fontace: 0.4.1 - get-tsconfig: 5.0.0-beta.4 + get-tsconfig: 5.0.0-beta.6 github-slugger: 2.0.0 html-escaper: 3.0.3 http-cache-semantics: 4.2.0 - js-yaml: 4.3.2 jsonc-parser: 3.3.1 - magic-string: 1.2.3 - magicast: 0.5.4 + magic-string: 1.4.3 + magicast: 0.5.5 mrmime: 2.0.1 neotraverse: 1.0.1 - obug: 2.1.4 - p-limit: 7.3.2 + obug: 3.0.0 + p-limit: 7.3.3 p-queue: 9.3.3 package-manager-detector: 1.8.0 piccolore: 0.1.3 picomatch: 4.0.7 - semver: 7.8.5 + rolldown: 1.2.13 shiki: 4.4.3 - smol-toml: 1.8.0 + smol-toml: 1.9.1 svgo: 4.1.0 - tinyclip: 0.1.15 + tinyclip: 1.0.3 tinyexec: 1.3.1 tinyglobby: 0.2.17 ultrahtml: 1.7.0 unifont: 0.7.5 unstorage: 1.17.5 - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.0) - vitefu: 1.1.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.0)) + verkit: 0.5.0 + vite: 8.3.4(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@8.3.4(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.1)) xxhash-wasm: 1.1.0 yargs-parser: 22.0.0 - zod: 4.5.4 + zod: 4.6.7 optionalDependencies: - '@astrojs/markdown-remark': 7.3.0 + '@astrojs/markdown-remark': 7.3.2 sharp: 0.35.4(@types/node@24.13.3) transitivePeerDependencies: - '@azure/app-configuration' @@ -3542,8 +3685,6 @@ snapshots: - '@azure/storage-blob' - '@capacitor/preferences' - '@deno/kv' - - '@emnapi/core' - - '@emnapi/runtime' - '@netlify/blobs' - '@planetscale/database' - '@types/node' @@ -3554,6 +3695,7 @@ snapshots: - '@vitejs/devtools' - aws4fetch - db0 + - esbuild - idb-keyval - ioredis - jiti @@ -3681,7 +3823,7 @@ snapshots: detect-libc@2.1.2: {} - devalue@5.9.2: {} + devalue@5.9.4: {} devlop@1.1.0: dependencies: @@ -3720,7 +3862,7 @@ snapshots: entities@6.0.1: {} - es-module-lexer@2.3.2: {} + es-module-lexer@3.0.3: {} esast-util-from-estree@2.0.0: dependencies: @@ -3764,6 +3906,7 @@ snapshots: '@esbuild/win32-arm64': 0.28.2 '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 + optional: true escalade@3.2.0: {} @@ -3771,12 +3914,12 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-plugin-astro@3.1.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0)(typescript@6.0.3))(eslint@10.10.0)(typescript-eslint@8.69.0(eslint@10.10.0)(typescript@6.0.3)): + eslint-plugin-astro@3.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@typescript-eslint/parser@8.69.0(eslint@10.10.0)(typescript@6.0.3))(eslint@10.10.0)(typescript-eslint@8.69.0(eslint@10.10.0)(typescript@6.0.3)): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0) '@jridgewell/sourcemap-codec': 1.6.0 '@typescript-eslint/types': 8.69.0 - astro-eslint-parser: 3.1.0 + astro-eslint-parser: 3.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) eslint: 10.10.0 espree: 11.2.0 globals: 17.12.0 @@ -3917,7 +4060,7 @@ snapshots: dependencies: flat-cache: 6.1.23 - find-proc@0.1.0: {} + find-proc@0.2.0: {} find-up@5.0.0: dependencies: @@ -3949,7 +4092,7 @@ snapshots: get-east-asian-width@1.6.0: {} - get-tsconfig@5.0.0-beta.4: + get-tsconfig@5.0.0-beta.6: dependencies: resolve-pkg-maps: 1.0.0 @@ -4148,10 +4291,6 @@ snapshots: isexe@2.0.0: {} - js-yaml@4.3.2: - dependencies: - argparse: 2.0.1 - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -4230,11 +4369,11 @@ snapshots: lru-cache@11.5.2: {} - magic-string@1.2.3: + magic-string@1.4.3: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 - magicast@0.5.4: + magicast@0.5.5: dependencies: '@babel/parser': 7.29.8 '@babel/types': 7.29.8 @@ -4717,6 +4856,8 @@ snapshots: nanoid@3.3.18: {} + nanoid@3.3.20: {} + natural-compare@1.4.0: {} neotraverse@1.0.1: {} @@ -4735,7 +4876,7 @@ snapshots: dependencies: boolbase: 1.0.0 - obug@2.1.4: {} + obug@3.0.0: {} ofetch@1.5.1: dependencies: @@ -4766,7 +4907,7 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@7.3.2: + p-limit@7.3.3: dependencies: yocto-queue: 1.2.2 @@ -4831,6 +4972,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.30: + dependencies: + nanoid: 3.3.20 + picocolors: 1.1.1 + source-map-js: 1.2.2 + prelude-ls@1.2.1: {} prettier@3.9.6: {} @@ -5002,26 +5149,26 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - rolldown@1.2.7: + rolldown@1.2.13: dependencies: - '@oxc-project/types': 0.148.0 + '@oxc-project/types': 0.153.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.7 - '@rolldown/binding-android-arm64': 1.2.7 - '@rolldown/binding-darwin-arm64': 1.2.7 - '@rolldown/binding-darwin-x64': 1.2.7 - '@rolldown/binding-freebsd-x64': 1.2.7 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.7 - '@rolldown/binding-linux-arm64-gnu': 1.2.7 - '@rolldown/binding-linux-arm64-musl': 1.2.7 - '@rolldown/binding-linux-ppc64-gnu': 1.2.7 - '@rolldown/binding-linux-s390x-gnu': 1.2.7 - '@rolldown/binding-linux-x64-gnu': 1.2.7 - '@rolldown/binding-linux-x64-musl': 1.2.7 - '@rolldown/binding-openharmony-arm64': 1.2.7 - '@rolldown/binding-win32-arm64-msvc': 1.2.7 - '@rolldown/binding-win32-x64-msvc': 1.2.7 + '@rolldown/binding-android-arm-eabi': 1.2.13 + '@rolldown/binding-android-arm64': 1.2.13 + '@rolldown/binding-darwin-arm64': 1.2.13 + '@rolldown/binding-darwin-x64': 1.2.13 + '@rolldown/binding-freebsd-x64': 1.2.13 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.13 + '@rolldown/binding-linux-arm64-gnu': 1.2.13 + '@rolldown/binding-linux-arm64-musl': 1.2.13 + '@rolldown/binding-linux-ppc64-gnu': 1.2.13 + '@rolldown/binding-linux-s390x-gnu': 1.2.13 + '@rolldown/binding-linux-x64-gnu': 1.2.13 + '@rolldown/binding-linux-x64-musl': 1.2.13 + '@rolldown/binding-openharmony-arm64': 1.2.13 + '@rolldown/binding-win32-arm64-msvc': 1.2.13 + '@rolldown/binding-win32-x64-msvc': 1.2.13 satteri@0.10.5: dependencies: @@ -5099,8 +5246,12 @@ snapshots: smol-toml@1.8.0: {} + smol-toml@1.9.1: {} + source-map-js@1.2.1: {} + source-map-js@1.2.2: {} + source-map@0.7.6: {} space-separated-tokens@2.0.2: {} @@ -5145,7 +5296,7 @@ snapshots: tiny-inflate@1.0.3: {} - tinyclip@0.1.15: {} + tinyclip@1.0.3: {} tinyexec@1.3.1: {} @@ -5277,6 +5428,8 @@ snapshots: util-deprecate@1.0.2: {} + verkit@0.5.0: {} + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -5292,22 +5445,22 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.0): + vite@8.3.4(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 - postcss: 8.5.28 - rolldown: 1.2.7 + postcss: 8.5.30 + rolldown: 1.2.13 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.13.3 esbuild: 0.28.2 fsevents: 2.3.3 - yaml: 2.9.0 + yaml: 2.9.1 - vitefu@1.1.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.0)): + vitefu@1.1.3(vite@8.3.4(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.1)): optionalDependencies: - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.0) + vite: 8.3.4(@types/node@24.13.3)(esbuild@0.28.2)(yaml@2.9.1) volar-service-css@0.0.71(@volar/language-service@2.4.28): dependencies: @@ -5452,6 +5605,8 @@ snapshots: yaml@2.9.0: {} + yaml@2.9.1: {} + yargs-parser@22.0.0: {} yargs@18.1.0: @@ -5467,6 +5622,6 @@ snapshots: yocto-queue@1.2.2: {} - zod@4.5.4: {} + zod@4.6.7: {} zwitch@2.0.4: {} diff --git a/www/astro.config.mjs b/www/astro.config.mjs index b910cd3..377d44b 100644 --- a/www/astro.config.mjs +++ b/www/astro.config.mjs @@ -1,4 +1,5 @@ import { defineConfig, fontProviders } from "astro/config"; +import { unified } from "@astrojs/markdown-remark"; import jaamd from "@lancher-dev/jaamd"; import { shikiThemes } from "./src/themes.ts"; @@ -18,8 +19,12 @@ const shikiMultiTheme = { }, }; +// `pnpm build:unified` builds on unified. Default: Sätteri. +const onUnified = process.env.JAAMD_PROCESSOR === "unified"; + export default defineConfig({ site: "https://jaamd.lancher.dev", + ...(onUnified ? { markdown: { processor: unified() } } : {}), integrations: [ jaamd({ theme: { light: "github-light", dark: "one-dark-pro" } }), shikiMultiTheme, diff --git a/www/package.json b/www/package.json index 0c6bc83..7ba65e1 100644 --- a/www/package.json +++ b/www/package.json @@ -11,10 +11,11 @@ }, "dependencies": { "@lancher-dev/jaamd": "workspace:*", - "astro": "^7.2.0" + "astro": "^7.3.8" }, "devDependencies": { "@astrojs/check": "^0.9.10", + "@astrojs/markdown-remark": "^7.3.2", "typescript": "^6.0.3" } }