From 9850fcefa70c427c50ba23adc746da29fda3226c Mon Sep 17 00:00:00 2001 From: Michael Jolley Date: Fri, 31 Jul 2026 12:11:26 -0500 Subject: [PATCH 01/99] Add the v2 theme engine, design system and Astro baseline Phase 0 and Phase 1 of the v2 rebuild. Baseline - pnpm is now the one package manager. package-lock.json removed, packageManager and engines pinned. - netlify.toml moved from public/ to the repo root, where Netlify actually reads it. It was previously copied into dist/ and ignored, so the bbb.dev host rule and the /posts/ and /brain-dump/ catch alls have not been running. The catch alls now live at the end of public/_redirects so the specific rules win. - Netlify adapter and Preact added. The Preact integration is pinned to the 4.x line because 5.x depends on Vite 7 and uses Vite 7 plugin filter syntax, which Astro 5.17 (Vite 6) silently ignores, leaving astro:preact:opts unresolved. - twitch.ts guarded. An empty or errored Twitch response took the whole site build down rather than hiding one panel. Theme engine - scripts/gen-themes.mjs is a real build step wired to prebuild. It reads real VS Code themes through shiki, resolves each to the token contract, runs the contrast guard against all three surfaces and the hue guard that keeps Warning from collapsing into Error, and exits non zero if any theme fails. - It emits three artifacts that agree with each other: themes.css, the picker list, and Expressive Code theme definitions built from the resolved tokens rather than the originals. Without the third, chrome would pass AA while code blocks quietly failed it. - The audit now also covers all six syntax tokens, which the design phase script did not check. All sixteen themes still pass at 4.5:1 or better. - Expressive Code config moved to ec.config.mjs because themeCssSelector is a function and the Code component needs serializable options. Its own syntax contrast pass is disabled so the generator stays the single guard. - Verified in a browser across all sixteen themes: every code block background equals bg-inset exactly, and every rendered syntax color is one of the generated tokens. Design system - app.css ported as one global stylesheet. The single literal color in it, a hardcoded black drop shadow, now derives from the page background so it works under light themes. - Base layout, masthead, footer and wordmark built from the mockups. The theme picker is a Preact island hydrating on idle, reading the generated list so it cannot drift. It hides itself without script rather than showing a dead control. - src/config/site.ts holds topics, reserved slugs, severities and the Start here list, because the content submodule is read only from here. - tests/contrast.test.mjs reparses themes.css with its own WCAG implementation, deliberately not the generator's, so it is a check rather than a restatement. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f3070fc6-4aa5-412a-9dfe-0d0037c9684a --- .gitattributes | 6 + .gitignore | 1 + astro.config.mjs | 31 +- ec.config.mjs | 43 + netlify.toml | 24 + package-lock.json | 5349 --------------------- package.json | 19 +- pnpm-lock.yaml | 5996 +++++++++++++++++++++++- public/_redirects | 11 + public/netlify.toml | 18 - scripts/gen-themes.mjs | 399 ++ src/components/Mark.astro | 27 + src/components/Masthead.astro | 45 + src/components/SiteFooter.astro | 44 + src/components/Wordmark.astro | 8 + src/components/islands/ThemePicker.tsx | 111 + src/config/site.ts | 192 + src/layouts/Base.astro | 101 + src/lib/ec-themes.generated.mjs | 2390 ++++++++++ src/lib/themes.generated.ts | 112 + src/pages/kitchen-sink.astro | 103 + src/scripts/twitch.ts | 16 +- src/styles/app.css | 981 ++++ src/styles/themes.css | 338 ++ tests/contrast.test.mjs | 153 + 25 files changed, 10875 insertions(+), 5643 deletions(-) create mode 100644 .gitattributes create mode 100644 ec.config.mjs create mode 100644 netlify.toml delete mode 100644 package-lock.json delete mode 100644 public/netlify.toml create mode 100644 scripts/gen-themes.mjs create mode 100644 src/components/Mark.astro create mode 100644 src/components/Masthead.astro create mode 100644 src/components/SiteFooter.astro create mode 100644 src/components/Wordmark.astro create mode 100644 src/components/islands/ThemePicker.tsx create mode 100644 src/config/site.ts create mode 100644 src/layouts/Base.astro create mode 100644 src/lib/ec-themes.generated.mjs create mode 100644 src/lib/themes.generated.ts create mode 100644 src/pages/kitchen-sink.astro create mode 100644 src/styles/app.css create mode 100644 src/styles/themes.css create mode 100644 tests/contrast.test.mjs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f08aff5 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# Generated artifacts are committed so CI can regenerate them and diff. That only works +# if the checked out bytes match what the generator writes, so these stay LF on every +# platform regardless of core.autocrlf. +src/styles/themes.css text eol=lf +src/lib/themes.generated.ts text eol=lf +src/lib/ec-themes.generated.mjs text eol=lf diff --git a/.gitignore b/.gitignore index 16d54bb..6fe587a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # build output dist/ +.netlify/ # generated types .astro/ diff --git a/astro.config.mjs b/astro.config.mjs index 0ee0d4d..5c258a8 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -2,34 +2,25 @@ import { defineConfig } from 'astro/config'; import expressiveCode from 'astro-expressive-code'; import sitemap from '@astrojs/sitemap'; +import preact from '@astrojs/preact'; +import netlify from '@astrojs/netlify'; // https://astro.build/config export default defineConfig({ site: 'https://baldbeardedbuilder.com', trailingSlash: 'always', + output: 'static', + adapter: netlify(), devToolbar: { enabled: false }, integrations: [ - expressiveCode({ - themes: ['laserwave'], - styleOverrides: { - frames: { - tooltipSuccessBackground: '#9333ea' - }, - uiFontFamily: 'inherit', - codeCopyButtonBackground: 'transparent', - codeCopyButtonBorder: 'none', - codeCopyButtonBorderColor: 'transparent', - codeCopyButtonHoverBackground: 'rgba(147, 51, 234, 0.2)', - codeCopyButtonActiveBackground: 'rgba(147, 51, 234, 0.3)', - codeCopyButtonHoverOrFocusBackground: 'rgba(147, 51, 234, 0.2)' - }, - frames: { - showCopyToClipboardButton: true, - copyButtonTooltipText: 'Copy this snippet' - } - }), - sitemap() + // Options live in ec.config.mjs. See the comment at the top of that file. + expressiveCode(), + preact({ compat: false }), + sitemap({ + // Profiles are noindex by decision 14, so they stay out of the sitemap too. + filter: (page) => !page.includes('/builders/') + }) ] }); diff --git a/ec.config.mjs b/ec.config.mjs new file mode 100644 index 0000000..dd0bdbd --- /dev/null +++ b/ec.config.mjs @@ -0,0 +1,43 @@ +import { defineEcConfig } from 'astro-expressive-code'; +import ecThemes from './src/lib/ec-themes.generated.mjs'; + +/* + Expressive Code lives here rather than in astro.config.mjs because themeCssSelector is + a function, and the component needs the whole options object to survive a JSON + round trip. A separate config file is how Expressive Code supports that. + + The themes are generated by scripts/gen-themes.mjs from the same resolved, contrast + guarded tokens that produce themes.css. Feeding it the original VS Code themes instead + would leave code blocks below AA while the chrome around them passed. +*/ +export default defineEcConfig({ + themes: ecThemes, + // All sixteen themes are emitted at once and scoped to the same [data-theme] attribute + // the chrome switches on. That is what keeps a code block matching the panel it sits in + // when a reader changes theme, with no rebuild and no flash. + themeCssSelector: (theme) => `[data-theme="${theme.name}"]`, + // Without this the first theme gets promoted to a media query default and wins over the + // scoped blocks. + useDarkModeMediaQuery: false, + /* + Expressive Code runs its own contrast pass over syntax colors, which would push the + generated tokens somewhere other than where the guard put them and leave inline code + in prose a different shade to the same token inside a block. The generator already + clears 4.5 to 1 against all three surfaces, not just the code background, so this + hands the job to the one guard that sees the whole picture. + */ + minSyntaxHighlightingColorContrast: 0, + styleOverrides: { + uiFontFamily: 'var(--mono)', + codeFontFamily: 'var(--mono)', + codeFontSize: '0.8125rem', + codeLineHeight: '1.7', + borderColor: 'var(--line)', + borderRadius: 'var(--r)', + borderWidth: '1px' + }, + frames: { + showCopyToClipboardButton: true, + copyButtonTooltipText: 'Copy this snippet' + } +}); diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..5fafdc3 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,24 @@ +# Netlify only reads this file from the repository root or the configured base +# directory. It used to live in public/, where it was copied into dist/ and never +# read, so none of these rules were running. +# +# Content redirects are not written here. They are generated into public/_redirects +# by scripts/gen-redirects.mjs, because netlify.toml rules are evaluated before +# _redirects rules, and a wildcard here would shadow the specific per item rules the +# generator emits. Only rules that _redirects cannot express belong in this file. + +[build] + command = "pnpm build" + publish = "dist" + +[build.environment] + NODE_VERSION = "24" + PNPM_VERSION = "9" + +# Short links. bbb.dev fronts the shorturls table through a Supabase edge function. +# Host matching is not expressible in _redirects, so it stays here. +[[redirects]] + from = "https://bbb.dev/*" + to = "https://bvyerlczpakdlfvybkev.supabase.co/functions/v1/redirect?path=:splat" + status = 301 + force = true diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index dcfba18..0000000 --- a/package-lock.json +++ /dev/null @@ -1,5349 +0,0 @@ -{ - "name": "baldbeardedbuilder.com", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "baldbeardedbuilder.com", - "version": "0.0.1", - "dependencies": { - "@astrojs/rss": "^4.0.15", - "@astrojs/sitemap": "^3.7.0", - "astro": "^5.17.1", - "astro-expressive-code": "^0.41.6", - "marked": "^17.0.1" - } - }, - "node_modules/@astrojs/compiler": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", - "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", - "license": "MIT" - }, - "node_modules/@astrojs/internal-helpers": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", - "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", - "license": "MIT" - }, - "node_modules/@astrojs/markdown-remark": { - "version": "6.3.10", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", - "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.7.5", - "@astrojs/prism": "3.3.0", - "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.3", - "hast-util-to-text": "^4.0.2", - "import-meta-resolve": "^4.2.0", - "js-yaml": "^4.1.1", - "mdast-util-definitions": "^6.0.0", - "rehype-raw": "^7.0.0", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remark-smartypants": "^3.0.2", - "shiki": "^3.19.0", - "smol-toml": "^1.5.2", - "unified": "^11.0.5", - "unist-util-remove-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "unist-util-visit-parents": "^6.0.2", - "vfile": "^6.0.3" - } - }, - "node_modules/@astrojs/prism": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", - "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", - "license": "MIT", - "dependencies": { - "prismjs": "^1.30.0" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - } - }, - "node_modules/@astrojs/rss": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@astrojs/rss/-/rss-4.0.15.tgz", - "integrity": "sha512-uXO/k6AhRkIDXmRoc6xQpoPZrimQNUmS43X4+60yunfuMNHtSRN5e/FiSi7NApcZqmugSMc5+cJi8ovqgO+qIg==", - "license": "MIT", - "dependencies": { - "fast-xml-parser": "^5.3.3", - "piccolore": "^0.1.3" - } - }, - "node_modules/@astrojs/sitemap": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.0.tgz", - "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", - "license": "MIT", - "dependencies": { - "sitemap": "^8.0.2", - "stream-replace-string": "^2.0.0", - "zod": "^3.25.76" - } - }, - "node_modules/@astrojs/telemetry": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", - "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", - "license": "MIT", - "dependencies": { - "ci-info": "^4.2.0", - "debug": "^4.4.0", - "dlv": "^1.1.3", - "dset": "^3.1.4", - "is-docker": "^3.0.0", - "is-wsl": "^3.1.0", - "which-pm-runs": "^1.1.0" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@capsizecss/unpack": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", - "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", - "license": "MIT", - "dependencies": { - "fontkitten": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", - "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@expressive-code/core": { - "version": "0.41.6", - "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.6.tgz", - "integrity": "sha512-FvJQP+hG0jWi/FLBSmvHInDqWR7jNANp9PUDjdMqSshHb0y7sxx3vHuoOr6SgXjWw+MGLqorZyPQ0aAlHEok6g==", - "license": "MIT", - "dependencies": { - "@ctrl/tinycolor": "^4.0.4", - "hast-util-select": "^6.0.2", - "hast-util-to-html": "^9.0.1", - "hast-util-to-text": "^4.0.1", - "hastscript": "^9.0.0", - "postcss": "^8.4.38", - "postcss-nested": "^6.0.1", - "unist-util-visit": "^5.0.0", - "unist-util-visit-parents": "^6.0.1" - } - }, - "node_modules/@expressive-code/plugin-frames": { - "version": "0.41.6", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.6.tgz", - "integrity": "sha512-d+hkSYXIQot6fmYnOmWAM+7TNWRv/dhfjMsNq+mIZz8Tb4mPHOcgcfZeEM5dV9TDL0ioQNvtcqQNuzA1sRPjxg==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.41.6" - } - }, - "node_modules/@expressive-code/plugin-shiki": { - "version": "0.41.6", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.6.tgz", - "integrity": "sha512-Y6zmKBmsIUtWTzdefqlzm/h9Zz0Rc4gNdt2GTIH7fhHH2I9+lDYCa27BDwuBhjqcos6uK81Aca9dLUC4wzN+ng==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.41.6", - "shiki": "^3.2.2" - } - }, - "node_modules/@expressive-code/plugin-text-markers": { - "version": "0.41.6", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.6.tgz", - "integrity": "sha512-PBFa1wGyYzRExMDzBmAWC6/kdfG1oLn4pLpBeTfIRrALPjcGA/59HP3e7q9J0Smk4pC7U+lWkA2LHR8FYV8U7Q==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.41.6" - } - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@oslojs/encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", - "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.22.0.tgz", - "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.22.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.22.0.tgz", - "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.22.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", - "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.22.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/langs": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", - "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.22.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", - "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.22.0" - } - }, - "node_modules/@shikijs/types": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", - "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "license": "MIT" - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/nlcst": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", - "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/node": { - "version": "25.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", - "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/astro": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.17.1.tgz", - "integrity": "sha512-oD3tlxTaVWGq/Wfbqk6gxzVRz98xa/rYlpe+gU2jXJMSD01k6sEDL01ZlT8mVSYB/rMgnvIOfiQQ3BbLdN237A==", - "license": "MIT", - "dependencies": { - "@astrojs/compiler": "^2.13.0", - "@astrojs/internal-helpers": "0.7.5", - "@astrojs/markdown-remark": "6.3.10", - "@astrojs/telemetry": "3.3.0", - "@capsizecss/unpack": "^4.0.0", - "@oslojs/encoding": "^1.1.0", - "@rollup/pluginutils": "^5.3.0", - "acorn": "^8.15.0", - "aria-query": "^5.3.2", - "axobject-query": "^4.1.0", - "boxen": "8.0.1", - "ci-info": "^4.3.1", - "clsx": "^2.1.1", - "common-ancestor-path": "^1.0.1", - "cookie": "^1.1.1", - "cssesc": "^3.0.0", - "debug": "^4.4.3", - "deterministic-object-hash": "^2.0.2", - "devalue": "^5.6.2", - "diff": "^8.0.3", - "dlv": "^1.1.3", - "dset": "^3.1.4", - "es-module-lexer": "^1.7.0", - "esbuild": "^0.25.0", - "estree-walker": "^3.0.3", - "flattie": "^1.1.1", - "fontace": "~0.4.0", - "github-slugger": "^2.0.0", - "html-escaper": "3.0.3", - "http-cache-semantics": "^4.2.0", - "import-meta-resolve": "^4.2.0", - "js-yaml": "^4.1.1", - "magic-string": "^0.30.21", - "magicast": "^0.5.1", - "mrmime": "^2.0.1", - "neotraverse": "^0.6.18", - "p-limit": "^6.2.0", - "p-queue": "^8.1.1", - "package-manager-detector": "^1.6.0", - "piccolore": "^0.1.3", - "picomatch": "^4.0.3", - "prompts": "^2.4.2", - "rehype": "^13.0.2", - "semver": "^7.7.3", - "shiki": "^3.21.0", - "smol-toml": "^1.6.0", - "svgo": "^4.0.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tsconfck": "^3.1.6", - "ultrahtml": "^1.6.0", - "unifont": "~0.7.3", - "unist-util-visit": "^5.0.0", - "unstorage": "^1.17.4", - "vfile": "^6.0.3", - "vite": "^6.4.1", - "vitefu": "^1.1.1", - "xxhash-wasm": "^1.1.0", - "yargs-parser": "^21.1.1", - "yocto-spinner": "^0.2.3", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.25.1", - "zod-to-ts": "^1.2.0" - }, - "bin": { - "astro": "astro.js" - }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/astrodotbuild" - }, - "optionalDependencies": { - "sharp": "^0.34.0" - } - }, - "node_modules/astro-expressive-code": { - "version": "0.41.6", - "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.6.tgz", - "integrity": "sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw==", - "license": "MIT", - "dependencies": { - "rehype-expressive-code": "^0.41.6" - }, - "peerDependencies": { - "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/base-64": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", - "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", - "license": "MIT" - }, - "node_modules/bcp-47-match": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", - "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/boxen": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", - "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^8.0.0", - "chalk": "^5.3.0", - "cli-boxes": "^3.0.0", - "string-width": "^7.2.0", - "type-fest": "^4.21.0", - "widest-line": "^5.0.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "license": "ISC" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cookie-es": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", - "license": "MIT" - }, - "node_modules/crossws": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", - "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", - "license": "MIT", - "dependencies": { - "uncrypto": "^0.1.3" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-selector-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", - "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/deterministic-object-hash": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", - "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", - "license": "MIT", - "dependencies": { - "base-64": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/devalue": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", - "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", - "license": "MIT" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/diff": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", - "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/direction": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", - "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", - "license": "MIT", - "bin": { - "direction": "cli.js" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dset": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", - "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, - "node_modules/expressive-code": { - "version": "0.41.6", - "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.6.tgz", - "integrity": "sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.41.6", - "@expressive-code/plugin-frames": "^0.41.6", - "@expressive-code/plugin-shiki": "^0.41.6", - "@expressive-code/plugin-text-markers": "^0.41.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.4.tgz", - "integrity": "sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/flattie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", - "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/fontace": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.0.tgz", - "integrity": "sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg==", - "license": "MIT", - "dependencies": { - "fontkitten": "^1.0.0" - } - }, - "node_modules/fontkitten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.2.tgz", - "integrity": "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==", - "license": "MIT", - "dependencies": { - "tiny-inflate": "^1.0.3" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "license": "ISC" - }, - "node_modules/h3": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz", - "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", - "license": "MIT", - "dependencies": { - "cookie-es": "^1.2.2", - "crossws": "^0.3.5", - "defu": "^6.1.4", - "destr": "^2.0.5", - "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.4", - "radix3": "^1.1.2", - "ufo": "^1.6.3", - "uncrypto": "^0.1.3" - } - }, - "node_modules/hast-util-from-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-has-property": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", - "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-select": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", - "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "bcp-47-match": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "css-selector-parser": "^3.0.0", - "devlop": "^1.0.0", - "direction": "^2.0.0", - "hast-util-has-property": "^3.0.0", - "hast-util-to-string": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "nth-check": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-string": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", - "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "license": "MIT" - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/iron-webcrypto": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", - "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/brc-dd" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/magicast": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", - "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "source-map-js": "^1.2.1" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.1.tgz", - "integrity": "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/mdast-util-definitions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", - "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", - "license": "CC0-1.0" - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/neotraverse": { - "version": "0.6.18", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", - "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/nlcst-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", - "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "license": "MIT" - }, - "node_modules/node-mock-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", - "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/ofetch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", - "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", - "license": "MIT", - "dependencies": { - "destr": "^2.0.5", - "node-fetch-native": "^1.6.7", - "ufo": "^1.6.1" - } - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "license": "MIT" - }, - "node_modules/oniguruma-parser": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", - "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", - "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", - "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.1", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/p-limit": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", - "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", - "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "license": "MIT" - }, - "node_modules/parse-latin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", - "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "@types/unist": "^3.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-modify-children": "^4.0.0", - "unist-util-visit-children": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/piccolore": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", - "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", - "license": "ISC" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" - }, - "node_modules/rehype": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", - "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-expressive-code": { - "version": "0.41.6", - "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.6.tgz", - "integrity": "sha512-aBMX8kxPtjmDSFUdZlAWJkMvsQ4ZMASfee90JWIAV8tweltXLzkWC3q++43ToTelI8ac5iC0B3/S/Cl4Ql1y2g==", - "license": "MIT", - "dependencies": { - "expressive-code": "^0.41.6" - } - }, - "node_modules/rehype-parse": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-stringify": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", - "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-smartypants": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", - "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", - "license": "MIT", - "dependencies": { - "retext": "^9.0.0", - "retext-smartypants": "^6.0.0", - "unified": "^11.0.4", - "unist-util-visit": "^5.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", - "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "retext-latin": "^4.0.0", - "retext-stringify": "^4.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-latin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", - "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "parse-latin": "^7.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-smartypants": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", - "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-stringify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", - "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/shiki": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.22.0.tgz", - "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", - "license": "MIT", - "dependencies": { - "@shikijs/core": "3.22.0", - "@shikijs/engine-javascript": "3.22.0", - "@shikijs/engine-oniguruma": "3.22.0", - "@shikijs/langs": "3.22.0", - "@shikijs/themes": "3.22.0", - "@shikijs/types": "3.22.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/sitemap": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.2.tgz", - "integrity": "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==", - "license": "MIT", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.4.1" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" - }, - "node_modules/smol-toml": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", - "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stream-replace-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", - "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", - "license": "MIT" - }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/svgo": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", - "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", - "license": "MIT", - "dependencies": { - "commander": "^11.1.0", - "css-select": "^5.1.0", - "css-tree": "^3.0.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.1.1", - "sax": "^1.4.1" - }, - "bin": { - "svgo": "bin/svgo.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tsconfck": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", - "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "license": "MIT" - }, - "node_modules/ultrahtml": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", - "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", - "license": "MIT" - }, - "node_modules/uncrypto": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unifont": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.3.tgz", - "integrity": "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==", - "license": "MIT", - "dependencies": { - "css-tree": "^3.1.0", - "ofetch": "^1.5.1", - "ohash": "^2.0.11" - } - }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-modify-children": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", - "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "array-iterate": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-children": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", - "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unstorage": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", - "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", - "license": "MIT", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^5.0.0", - "destr": "^2.0.5", - "h3": "^1.15.5", - "lru-cache": "^11.2.0", - "node-fetch-native": "^1.6.7", - "ofetch": "^1.5.1", - "ufo": "^1.6.3" - }, - "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 || ^7 || ^8", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1 || ^2 || ^3", - "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/functions": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { - "optional": true - } - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "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" - }, - "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 - } - } - }, - "node_modules/vitefu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", - "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", - "license": "MIT", - "dependencies": { - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/xxhash-wasm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", - "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", - "license": "MIT" - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yocto-spinner": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", - "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", - "license": "MIT", - "dependencies": { - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": ">=18.19" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" - } - }, - "node_modules/zod-to-ts": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", - "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", - "peerDependencies": { - "typescript": "^4.9.4 || ^5.0.2", - "zod": "^3" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json index de6b00a..aed45dc 100644 --- a/package.json +++ b/package.json @@ -2,17 +2,32 @@ "name": "baldbeardedbuilder.com", "type": "module", "version": "0.0.1", + "packageManager": "pnpm@9.1.1", + "engines": { + "node": ">=22" + }, "scripts": { - "dev": "astro dev", + "dev": "pnpm themes && astro dev", "build": "astro build", + "prebuild": "pnpm themes", "preview": "astro preview", + "themes": "node scripts/gen-themes.mjs", + "themes:check": "pnpm themes && git diff --exit-code src/styles/themes.css src/lib/themes.generated.ts src/lib/ec-themes.generated.mjs", + "test": "node --test \"tests/**/*.test.mjs\"", + "check": "astro check", "astro": "astro" }, "dependencies": { + "@astrojs/netlify": "^6.6.5", + "@astrojs/preact": "^4.1.3", "@astrojs/rss": "^4.0.15", "@astrojs/sitemap": "^3.7.0", "astro": "^5.17.1", "astro-expressive-code": "^0.41.6", - "marked": "^17.0.1" + "marked": "^17.0.1", + "preact": "^10.29.7" + }, + "devDependencies": { + "shiki": "^3.22.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d43e93..f3d9da7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,12 @@ importers: .: dependencies: + '@astrojs/netlify': + specifier: ^6.6.5 + version: 6.6.5(astro@5.17.1(@netlify/blobs@10.7.11)(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.9.0))(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(yaml@2.9.0) + '@astrojs/preact': + specifier: ^4.1.3 + version: 4.1.3(@babel/core@7.29.7)(jiti@2.7.0)(lightningcss@1.33.0)(preact@10.29.7(preact-render-to-string@6.7.0))(rollup@4.57.1)(yaml@2.9.0) '@astrojs/rss': specifier: ^4.0.15 version: 4.0.15 @@ -16,13 +22,20 @@ importers: version: 3.7.0 astro: specifier: ^5.17.1 - version: 5.17.1(rollup@4.57.1)(typescript@5.9.3) + version: 5.17.1(@netlify/blobs@10.7.11)(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.9.0) astro-expressive-code: specifier: ^0.41.6 - version: 0.41.6(astro@5.17.1(rollup@4.57.1)(typescript@5.9.3)) + version: 0.41.6(astro@5.17.1(@netlify/blobs@10.7.11)(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.9.0)) marked: specifier: ^17.0.1 version: 17.0.1 + preact: + specifier: ^10.29.7 + version: 10.29.7(preact-render-to-string@6.7.0) + devDependencies: + shiki: + specifier: ^3.22.0 + version: 3.22.0 packages: @@ -32,9 +45,23 @@ packages: '@astrojs/internal-helpers@0.7.5': resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} + '@astrojs/internal-helpers@0.7.6': + resolution: {integrity: sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==} + '@astrojs/markdown-remark@6.3.10': resolution: {integrity: sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==} + '@astrojs/netlify@6.6.5': + resolution: {integrity: sha512-TE3GABF144NxJ/A8jUSzKlSRzaraPKaBba+3bY93XA8ejhTXoraqHdYSWnp/PvfMWYZnbHtEaW/GgKlE20h+EA==} + peerDependencies: + astro: ^5.7.0 + + '@astrojs/preact@4.1.3': + resolution: {integrity: sha512-Ph416wbgyumkmYr7erZ83l/d+LXdZethlHRRCbgoKEn8wo3Rkq13shKFp0QYXYSDYxVaA6UBdkdimeowy/lMLQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + preact: ^10.6.5 + '@astrojs/prism@3.3.0': resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} @@ -49,190 +76,460 @@ packages: resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + '@astrojs/underscore-redirects@1.0.0': + resolution: {integrity: sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.29.7': + resolution: {integrity: sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.29.7': + resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + '@capsizecss/unpack@4.0.0': resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} engines: {node: '>=18'} + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + '@ctrl/tinycolor@4.2.0': resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} engines: {node: '>=14'} + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@dependents/detective-less@5.0.3': + resolution: {integrity: sha512-v6oD9Ukp+N7V4n6p5I/+mM5fIohSfkrDSGlFm5w/pYmchvbk+sMIHsLxrFJ5Lnujewj1BzWL0K84d88lwZAMQA==} + engines: {node: '>=18'} + + '@electric-sql/pglite@0.3.16': + resolution: {integrity: sha512-mZkZfOd9OqTMHsK+1cje8OSzfAQcpD7JmILXTl5ahdempjUDdmg4euf1biDex5/LfQIDJ3gvCu6qDgdnDxfJmA==} + '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@envelop/instrumentation@1.0.0': + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@expressive-code/core@0.41.6': resolution: {integrity: sha512-FvJQP+hG0jWi/FLBSmvHInDqWR7jNANp9PUDjdMqSshHb0y7sxx3vHuoOr6SgXjWw+MGLqorZyPQ0aAlHEok6g==} @@ -245,6 +542,16 @@ packages: '@expressive-code/plugin-text-markers@0.41.6': resolution: {integrity: sha512-PBFa1wGyYzRExMDzBmAWC6/kdfG1oLn4pLpBeTfIRrALPjcGA/59HP3e7q9J0Smk4pC7U+lWkA2LHR8FYV8U7Q==} + '@fastify/accept-negotiator@2.0.1': + resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} @@ -382,12 +689,280 @@ packages: cpu: [x64] os: [win32] + '@import-maps/resolve@2.0.0': + resolution: {integrity: sha512-RwzRTpmrrS6Q1ZhQExwuxJGK1Wqhv4stt+OF2JzS+uawewpwNyU7EJL1WpBex7aDiiGLs4FsXGkfUBdYuX7xiQ==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + + '@netlify/ai@0.4.4': + resolution: {integrity: sha512-bv89TwwLba2Fxiji2xIaolejd8qXqZNb5GZqqv1EKfYPNrVcgK2b8gSCH1cjVVxHN7rmhzxwmolbIx7ikZik0A==} + engines: {node: '>=20.6.1'} + + '@netlify/api@15.1.0': + resolution: {integrity: sha512-JhnBtwAzy6pMv0hepMZn8qWbU9a+aeujJ9roXU4lVmXaIBnfl6Icso2TyVJgVCqoLwGw122Yh0RW5KdvPDFpBA==} + engines: {node: '>=22.12.0'} + + '@netlify/binary-info@1.0.0': + resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} + + '@netlify/blobs@10.7.11': + resolution: {integrity: sha512-jnP4KAWP10GEynBk1GOaHBBnL1pF03sL3sQM5h9q+zJdedvCMV8zS3iTHzhm3B1zG4h8pDqDgOnUP8GqRDAXnA==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/cache@3.4.9': + resolution: {integrity: sha512-tuvkgL4jqdZl8Fh0KntyDAUP/cxvoSuCnKIqYpT8kpiyRiNsP+LqRLPIZ12JYQh5rZzqYhLLEueZjXKczgLCHw==} + engines: {node: '>=20.6.1'} + + '@netlify/config@25.1.1': + resolution: {integrity: sha512-ppIKwtUklP9KiXKvSZ7bllCETPzuBTNVwyJ+wfBBzgJ3opEyibI3cFCipjPmF/9u/yh3UKN7a9m2Py2HaGBgjg==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@netlify/database-dev@0.10.1': + resolution: {integrity: sha512-kHLdS6r45TsDiS5aBrHUmzqPvoaWQEUZnaZeMwnIrLMwX8f2bIa6YAMOJJYJhyKm2drVo3C/T92/lJ5iGV/VBQ==} + engines: {node: '>=20.6.1'} + + '@netlify/dev-utils@4.4.7': + resolution: {integrity: sha512-etfUY5SyraYG+i4msfVnWuFEkia6XLxeoe8Hh5uGO6QJ4OAQT4EmesXjulsI0/7EozMxdiANGnf2AAshn+2jpQ==} + engines: {node: ^18.14.0 || >=20} + + '@netlify/dev@4.18.11': + resolution: {integrity: sha512-lpNAv5S6Prkcm41ShIuZY9r+BvSArRNz9+Khc3jRZWcGG6fPL4YY3QI+3GR5nToxcT0RsU1Gz41Ejv+au7oHAg==} + engines: {node: '>=20.6.1'} + + '@netlify/edge-bundler@15.1.1': + resolution: {integrity: sha512-AcXFVXGWwksF87pCPNiRJ912R/+GebrL2i+e0X1YmR6Z0YegcfMUxMPqp/JLbp0iw4GNqlFd7RuRTMa6COLKFA==} + engines: {node: '>=22.12.0'} + + '@netlify/edge-functions-bootstrap@2.16.0': + resolution: {integrity: sha512-v8QQihSbBHj3JxtJsHoepXALpNumD9M7egHoc8z62FYl5it34dWczkaJoFFopEyhiBVKi4K/n0ZYpdzwfujd6g==} + + '@netlify/edge-functions-dev@1.0.23': + resolution: {integrity: sha512-Lz7jO1qaD0B0NGgA4SpJno2tvVvgxZS1QF6MRJ6+NAwDuPD/4CWw/D6fJBJENDiGzOPZ/yrURtVmgfQ26XQmxA==} + engines: {node: '>=20.6.1'} + + '@netlify/edge-functions@3.0.8': + resolution: {integrity: sha512-ml1oCDsRTTRmZS2nUj8XRD1b6+foEiZT3lPk7qQ4nv/jnxylHJ20ooPzPDH+cJmGjXFrMeR14/91W1o6D2ftBg==} + engines: {node: '>=18.0.0'} + + '@netlify/functions-dev@1.3.3': + resolution: {integrity: sha512-wa4bPuVg9vaUSdWL5GNJkQ2Xqjjmml0H7xeQN+38uiRDLWj4FuIFY+eniS7w6dC8EyzFBaTlBUJ4cAWmPWMsHQ==} + engines: {node: '>=20.6.1'} + + '@netlify/functions@5.3.0': + resolution: {integrity: sha512-FP+xCoZMkMOUsKa4UdG/oiK/2md1/TxuXvqqieaMVMgDbFFMaHI8h0oHCViUY73kPbKV6HyzayaSXGYXKpBSoQ==} + engines: {node: '>=18.0.0'} + + '@netlify/headers-parser@10.1.0': + resolution: {integrity: sha512-77hO29DpV8bIvLcf5zgJ9oXtnh1Oa1KgSMlotlH848nU84ZDjV2qA46SiYiSpZQEc3YGqWis0EF6IAnMfYCRtA==} + engines: {node: '>=22.12.0'} + + '@netlify/headers@2.1.12': + resolution: {integrity: sha512-I8OCmYI7c8AplqcOBW6EFzFSZr4HTUN6bTNT/raxVG9AYMENUo+YBgNBnMOnXq/OwUZP3sAEwbVZX/+j1afgQw==} + engines: {node: '>=20.6.1'} + + '@netlify/images@1.3.11': + resolution: {integrity: sha512-Hk/c0FcvGgcQl0cTiXYFTBH2Sdt2ghx2pcaL2kOTvvH5HRlbKOQdxo3v6vepqbHFS/CwvgPJCxiz3x3yD96Lmw==} + engines: {node: '>=20.6.1'} + + '@netlify/open-api@2.57.0': + resolution: {integrity: sha512-hgJrSxfzr7ShaVACGr17Ci3a7Y7vO+a75Fwn9fNe2+1aIbVx4aVSLP3cv9Vv9yfy1JbW563AwcveBq9lr9KKzA==} + engines: {node: '>=14.8.0'} + + '@netlify/otel@6.0.5': + resolution: {integrity: sha512-FUnQsG+xp5gljmHZgrBgGLYKmKYQlGvrao6gtKenJSPCYTMzsYB9PbFfjIoEvwS+o8DxuWDrHlRDDGU3o9ObhQ==} + engines: {node: ^18.14.0 || >=20.6.1} + + '@netlify/redirect-parser@16.1.0': + resolution: {integrity: sha512-05MOUSBr7t8RFmBCx9kPRV9L7RfJ6yH7rSDz0//i3d6Ws3VsgZFuggfOjD/J4ZmjCY+9tIGSkUNM40qKNv0yLA==} + engines: {node: '>=22.12.0'} + + '@netlify/redirects@3.1.14': + resolution: {integrity: sha512-TR9LiRPep1RU+EXR1LfOY3ZMTnZucujvnAGA5YHw2kLHoiY5RvdMZZuBM0wKH03WzJ2NZaClASQhTvyAU9nmYg==} + engines: {node: '>=20.6.1'} + + '@netlify/runtime-utils@2.3.0': + resolution: {integrity: sha512-cW8weDvsKV7zfia2m5EcBy6KILGoPD+eYZ3qWNGnIo05DGF28goPES0xKSDkNYgAF/2rRSIhie2qcBhbGVgSRg==} + engines: {node: ^18.14.0 || >=20} + + '@netlify/runtime@4.1.27': + resolution: {integrity: sha512-fKtqARPQsJ1azAKNziSjteSIE73Zo/QAUsaBQnVfzD8cSsLAp2/D6wLMZVA/2kKxTRZ1IOmeLwBNWRA1iDUrTg==} + engines: {node: '>=20.6.1'} + + '@netlify/serverless-functions-api@2.16.0': + resolution: {integrity: sha512-yomP0pYRWPREiAuQbLghz9YbMb2+Mkmk1DMjyXVbIyrJ8QZhEtGcYQWAyl6cgki5CVqnOXvfIrRdLSf8bvxJCA==} + engines: {node: '>=18.0.0'} + + '@netlify/static@3.1.11': + resolution: {integrity: sha512-38bV5jRVMAUie3dCsdgtivHlrsQuLBy9uz9EYXCheVUlOMaO4U16OCGKfCVFw0CML6JtPBuyaRdA9ASvJ+E7ug==} + engines: {node: '>=20.6.1'} + + '@netlify/types@2.8.0': + resolution: {integrity: sha512-8/g0Pt6y6wXj5Ia5eeYLiXhRfWeqZXGXpGFeCiiQdUOem+FPtXdA4+YdGxqzWc7D0AvptKSO01KGeeVWHSu8Kg==} + engines: {node: ^18.14.0 || >=20} + + '@netlify/vite-plugin@2.12.9': + resolution: {integrity: sha512-6c4OpF5EINlGU2ogxWhBdGQJcKUoupdns5AJnghcHw3q/32LqFDxvX4Gq6vR+Dgx6y4MCiVMyT9wgh2dpeCHDw==} + engines: {node: ^20.6.1 || >=22} + peerDependencies: + vite: ^5 || ^6 || ^7 || ^8 + + '@netlify/zip-it-and-ship-it@15.3.0': + resolution: {integrity: sha512-m8lUq1kbzwC3Npapp2dZVUM5PZuFJTimLPqeUdbEDnMF2VHlNJP+Of8BZC4gWFr0kI/X0Ip9/Ce5IBXeeC9AAg==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@opentelemetry/api-logs@0.220.0': + resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.8.0': + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.9.0': + resolution: {integrity: sha512-OQ0vzvbZBiUhjqLnUaoNfYmP8553Crr3aggB4y0ZUi815mZ7idpdJXQmoKdeBKJelYttoBlLSSHubmyw3wvX4w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.8.0': + resolution: {integrity: sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.9.0': + resolution: {integrity: sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation@0.220.0': + resolution: {integrity: sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.9.0': + resolution: {integrity: sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.9.0': + resolution: {integrity: sha512-cp9zmTl62R8PJrpvFcmc8N2JQU/xfa0S+61q511Nji+QxCfZ8Ifvg7H27G8cANe4crg4RTrWsVvanHiXjSp6ag==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.9.0': + resolution: {integrity: sha512-ec9a7ps37huy5itYk0MalaZdSLlM6AXWp/FhtEjgMpp5leEGojBDvAl/UWttQnkMZOvFHKzRESn8TD3yKTF5nQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.9.0': + resolution: {integrity: sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@parcel/watcher-wasm@2.6.0': + resolution: {integrity: sha512-dtjbDxKSDPQ8AmA+pS4OFaHE1FKrjtGpLGBxw85uKFkRorjNbvDM/aFPgqosu40wprbp1xw2ZSxIKqghCUHe2w==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@preact/preset-vite@2.10.6': + resolution: {integrity: sha512-ZZ5RIT2ZVXg8UxRA8VZpoT8CdpDG7RFIqOT4bELqNBp85+HKvQBbgmh3gsoW1UOQXx26TLe+ZRNKI7q281Kckw==} + peerDependencies: + '@babel/core': 7.x + vite: 2.x || 3.x || 4.x || 5.x || 6.x || 7.x || 8.x + + '@preact/signals-core@1.14.4': + resolution: {integrity: sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==} + + '@preact/signals@2.10.1': + resolution: {integrity: sha512-fJfOJ2F6vYiZ7G8ANy/fUDQgPxurE0YS+C+g1cGHxT7b/xLBmvqChu4O2DwuwdS9ywyQ6B3ytBQba/8BJ3V+WQ==} + peerDependencies: + preact: '>= 10.25.0 || >=11.0.0-0' + + '@prefresh/babel-plugin@0.5.3': + resolution: {integrity: sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==} + + '@prefresh/core@1.5.10': + resolution: {integrity: sha512-7yPTFbG56sutaFu8krp3B4a200KOFUvrtlllKWRuLjsYXo9UUucHOZRcer+gtgMkFTpv6ob8TGcTwA32bSwa1w==} + peerDependencies: + preact: ^10.0.0 || ^11.0.0-0 + + '@prefresh/utils@1.2.1': + resolution: {integrity: sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==} + + '@prefresh/vite@2.4.12': + resolution: {integrity: sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==} + peerDependencies: + preact: ^10.4.0 || ^11.0.0-0 + vite: '>=2.0.0' + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -543,14 +1118,22 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@sveltejs/acorn-typescript@1.0.11': + resolution: {integrity: sha512-LFuZUkjJ9iF7JZye/aG5XM0SFcQ5VyL0oVX4WJ9dc0Va3R3s0OauX1BESVCb+YN/ol8TAfqGDDAQsTG627Y5kw==} + peerDependencies: + acorn: ^8.9.0 + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -564,20 +1147,128 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vercel/nft@0.29.4': + resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} + engines: {node: '>=18'} + hasBin: true + + '@vercel/nft@0.30.4': + resolution: {integrity: sha512-wE6eAGSXScra60N2l6jWvNtVK0m+sh873CpfZW4KI2v8EHuUQp+mSEi4T+IcdPCSEDgCdAS/7bizbhQlkjzrSA==} + engines: {node: '>=18'} + hasBin: true + + '@vue/compiler-core@3.5.40': + resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==} + + '@vue/compiler-dom@3.5.40': + resolution: {integrity: sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==} + + '@vue/compiler-sfc@3.5.40': + resolution: {integrity: sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==} + + '@vue/compiler-ssr@3.5.40': + resolution: {integrity: sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==} + + '@vue/shared@3.5.40': + resolution: {integrity: sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==} + + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.13': + resolution: {integrity: sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.8.6': + resolution: {integrity: sha512-BDMdYFcerLQkwA2RTldxOqRCs6ZQD1S7UgP3pUdGUkcbgTrP/V5ko77ZkCww9DHmC4lpoYuwigGfQYj285gMvA==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/server@0.11.0': + resolution: {integrity: sha512-VSdkwnJRr8Yv9UgB2aXB3VUPWwd6Oqnn0hycFwhg9pZgWxJXb7JmhsiXe9tmpMwjHFxli12PGcz9aI63YYloGQ==} + engines: {node: '>=18.0.0'} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-errors@3.0.0: + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} + peerDependencies: + ajv: ^8.0.1 + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -589,14 +1280,30 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -607,9 +1314,25 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + ast-module-types@6.0.2: + resolution: {integrity: sha512-6KuK/7nZ/2Qh7sGuVEiwxjCxzTY2Pdb5mTo5z1e6/J8BA0tvjR7G8vQJKrQMTqwmnA3UPEyKIFX4YUS1DO1Hvw==} + engines: {node: '>=18'} + astro-expressive-code@0.41.6: resolution: {integrity: sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw==} peerDependencies: @@ -620,19 +1343,110 @@ packages: engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + atomically@2.1.1: + resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + babel-plugin-transform-hook-names@1.0.2: + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} + peerDependencies: + '@babel/core': ^7.12.10 + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.4: + resolution: {integrity: sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} + + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.6: + resolution: {integrity: sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==} + base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.11.9: + resolution: {integrity: sha512-cp447VUsGS07+n1Dqf7YSQ8maeJrjEhaDxTm1ZefbqDtypHBC5GzGMQbklR6IPR13Y8OAJRHZWEMtZipJLCttg==} + engines: {node: '>=6.0.0'} + hasBin: true + bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -640,13 +1454,67 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -660,42 +1528,146 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} + + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-name@2.1.1: + resolution: {integrity: sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + copy-file@11.1.0: + resolution: {integrity: sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==} + engines: {node: '>=18'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crossws@0.4.10: + resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==} + peerDependencies: + srvx: '>=0.11.5' + peerDependenciesMeta: + srvx: + optional: true + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} @@ -719,10 +1691,29 @@ packages: engines: {node: '>=4'} hasBin: true + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + csso@5.0.5: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -732,12 +1723,38 @@ packages: supports-color: optional: true + decache@4.6.2: + resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -749,10 +1766,56 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + detective-amd@6.1.0: + resolution: {integrity: sha512-fmI6LGMvotqd49QaA3ZYw+q0aGp2yXmMjzIuY6fH9j9YFIXY/73yDhMwhX9cPbhWd+AH06NH1Di/LKOuCH0Ubg==} + engines: {node: '>=18'} + hasBin: true + + detective-cjs@6.1.1: + resolution: {integrity: sha512-pSh7mkCKEtLlmANqLu3KDFS3NV8Hx41jy/JF1/gAWOgU+Uo5QTkeI1tWNP4dWGo4L0E9j18Ez9EPsTleautKqA==} + engines: {node: '>=18'} + + detective-es6@5.0.2: + resolution: {integrity: sha512-+qHHGYhjupiVs4rnIpI9nZ5B130A4AmE35ZX1w33hb46vcZ7T3jfDbvmPw0FhWtMHn5BS5HHu7ZtnZ53bMcXZA==} + engines: {node: '>=18'} + + detective-postcss@8.0.4: + resolution: {integrity: sha512-DZ7M/hWPZyr17ZUdoQ+TVXaPj70mYr4XXrAE+GeJbca44haCvZgb191L/jLJmFYewhxRJuBd4lUtNSu986TXag==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4.47 + + detective-sass@6.0.2: + resolution: {integrity: sha512-i3xpXHDKS0qI2aFW4asQ7fqlPK00ndOVZELvQapFJCaF0VxYmsNWtd0AmvXbTLMk7bfO5VdIeorhY9KfmHVoVA==} + engines: {node: '>=18'} + + detective-scss@5.0.2: + resolution: {integrity: sha512-9JOEMZ8pDh3ShXmftq7hoQqqJsClaGgxo1hghfCeFlmKf5TC/Twtwb0PAaK8dXwpg9Z0uCmEYSrCxO+kel2eEg==} + engines: {node: '>=18'} + + detective-stylus@5.0.1: + resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} + engines: {node: '>=18'} + + detective-typescript@14.1.2: + resolution: {integrity: sha512-bIeEn0eVi/JRsE1YizBR2ilnMlWRAIBJJ6kXCKNFxEEWhUcEY3R6I3KYIAy48ieURbD1hcb3Ebvl8AqeoPMSzg==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 || ^6.0.2 + + detective-vue2@2.3.0: + resolution: {integrity: sha512-3gwbZPqVTm9sL9XdZsgEJ7x4x99O853VVZHapQAiEkGuMJMpFPjHDrecSgfqnS5JW3FJfYXesLZGvUOibjn49g==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 || ^6.0.2 + deterministic-object-hash@2.0.2: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} + dettle@1.0.5: + resolution: {integrity: sha512-ZVyjhAJ7sCe1PNXEGveObOH9AC8QvMga3HJIghHawtG7mE4K5pW9nz/vDGAr/U7a3LWgdOzEE7ac9MURnyfaTA==} + devalue@5.6.2: resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} @@ -783,16 +1846,50 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + electron-to-chromium@1.5.399: + resolution: {integrity: sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -801,50 +1898,203 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} + engines: {node: '>= 0.4'} + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + expressive-code@0.41.6: resolution: {integrity: sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-xml-parser@5.3.4: - resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} hasBin: true - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} + hasBin: true + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@6.1.0: + resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} + engines: {node: '>=18'} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + fontace@0.4.1: resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} @@ -852,21 +2102,141 @@ packages: resolution: {integrity: sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==} engines: {node: '>=20'} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-amd-module-type@6.0.2: + resolution: {integrity: sha512-7zShVYAYtMnj9S65CfN+hvpBCByfuB1OY8xID01nZEzXTZbx4YyysAfi+nMl95JSR6odt4q8TCj2W63KAoyVLQ==} + engines: {node: '>=18'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + + get-port@7.2.0: + resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} + engines: {node: '>=16'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@1.15.5: resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -906,6 +2276,14 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} @@ -915,157 +2293,558 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + image-meta@0.2.2: + resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==} + + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + + import-in-the-middle@3.3.2: + resolution: {integrity: sha512-jTd2FfOgOWOdgjkHuk/1Ms8VKFXkPs15ymYBETw1sAOrO/dY3XeGVRWir9qBbw7pXr0T2eTFwfCZ+N02HmiNGA==} + engines: {node: '>=18'} + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ipx@3.1.1: + resolution: {integrity: sha512-7Xnt54Dco7uYkfdAw0r2vCly3z0rSaVhEXMzPvl3FndsTVm5p26j+PO+gyinkYmcsEUvX2Rh7OGK7KzYWRu6BA==} + hasBin: true + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} hasBin: true - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true + is-network-error@1.3.2: + resolution: {integrity: sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==} + engines: {node: '>=16'} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - lru-cache@11.2.5: - resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} - engines: {node: 20 || >=22} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} - magicast@0.5.1: - resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} - marked@17.0.1: - resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} - engines: {node: '>= 20'} - hasBin: true + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} - mdast-util-definitions@6.0.0: - resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} - mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + is-url-superb@4.0.0: + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} - mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} - micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + js-image-generator@1.0.4: + resolution: {integrity: sha512-ckb7kyVojGAnArouVR+5lBIuwU1fcrn7E/YYSd0FK7oIngAkMmRvHASLro9Zt5SQdWToaI66NybG+OGxPw/HlQ==} - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + junk@4.0.1: + resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} + engines: {node: '>=12.20'} - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} - micromark-util-combine-extensions@2.0.1: + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + lambda-local@2.2.0: + resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} + engines: {node: '>=8'} + hasBin: true + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + listhen@1.10.1: + resolution: {integrity: sha512-6nt/86SkqUQSLW1ofz8MxC6RhRMqOl3ONISe6qqvJ3xj09aJWQx6DhgSZpugs3PX4PXdOas/WD6A9jx6J2N19A==} + hasBin: true + peerDependencies: + '@parcel/watcher': ^2.5.6 + peerDependenciesMeta: + '@parcel/watcher': + optional: true + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + + map-obj@5.0.2: + resolution: {integrity: sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@17.0.1: + resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} micromark-util-decode-numeric-character-reference@2.0.2: @@ -1101,6 +2880,53 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + module-definition@6.0.2: + resolution: {integrity: sha512-SvAU3lB0+Yjbq55yHY3wkRZBOh+fhU1SnIF3IFbTewv6mtAh7yUT8ACHAJ2mGIJ7tCes2QuCL/cl6m0JSZ/ArA==} + engines: {node: '>=18'} + hasBin: true + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -1113,59 +2939,233 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} + netlify-redirector@0.5.0: + resolution: {integrity: sha512-4zdzIP+6muqPCuE8avnrgDJ6KW/2+UpHTRcTbMXCIRxiRmyrX+IZ4WSJGZdHPWF3WmQpXpy603XxecZ9iygN7w==} + nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} + engines: {node: '>= 0.4'} + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.4.0: + resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} + + node-source-walk@7.0.2: + resolution: {integrity: sha512-71kFFjYaSshDTA8/a2HiTYPLdASWjLJxUyJxGE+ffxU+KhxSBtM9kiLUX+R2yooFdSFKMFpi4n3PFtDy6qXv8A==} + engines: {node: '>=18'} + + node-stream-zip@1.16.0: + resolution: {integrity: sha512-ObaRrRoR8T68wF6suxHd7R4XQNamij6ZQHrwG7Dx1D2zeHcDNLsIOBcWrIwtDm7AsCXBguaPHgXhcjxDa2szrg==} + engines: {node: '>=0.12.0'} + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + omit.js@2.0.2: + resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - oniguruma-to-es@4.3.4: - resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} + engines: {node: '>= 0.4'} + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} p-limit@6.2.0: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@7.0.6: + resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} + engines: {node: '>=18'} + p-queue@8.1.1: resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} engines: {node: '>=18'} + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + p-timeout@6.1.4: resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} engines: {node: '>=14.16'} + p-wait-for@5.0.2: + resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} + engines: {node: '>=12'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-imports@2.2.1: + resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==} + engines: {node: '>= 18'} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + pg-gateway@0.3.0-beta.4: + resolution: {integrity: sha512-CTjsM7Z+0Nx2/dyZ6r8zRsc3f9FScoD5UAOlfUx1Fdv/JOIWvRbF7gou6l6vP+uypXQVoYPgw8xZDXgMGvBa4Q==} + piccolore@0.1.3: resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} @@ -1180,6 +3180,17 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + picoquery@2.5.0: + resolution: {integrity: sha512-j1kgOFxtaCyoFCkpoYG2Oj3OdGakadO7HZ7o5CqyRazlmBekKhbDoUnNnXASE07xSY4nDImWZkrZv7toSxMi/g==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -1190,14 +3201,49 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-values-parser@6.0.2: + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + + postcss@8.5.25: + resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + preact-render-to-string@6.7.0: + resolution: {integrity: sha512-Z4WR8fmLMRpdYqJ9i7vrlXSsSrxVJydwrkEXHapexfARbWfGb7vGcnvNQnIzN0cXciMVOlz/XLoiMCi9gUsy9Q==} + peerDependencies: + preact: '>=10 || >= 11.0.0-0' + + preact@10.29.7: + resolution: {integrity: sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==} + peerDependencies: + preact-render-to-string: '>=5' + peerDependenciesMeta: + preact-render-to-string: + optional: true + + precinct@12.3.2: + resolution: {integrity: sha512-JbJevI1K80z8e/WIyDt/4vUN/4qcfBSKKqOjJA4mosPPPb7zODKRJQV7YN7apVWN3k58nZYm/vEsLgEGYmnxwg==} + engines: {node: '>=18'} + hasBin: true + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -1205,13 +3251,52 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -1221,6 +3306,10 @@ packages: regex@6.1.0: resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + rehype-expressive-code@0.41.6: resolution: {integrity: sha512-aBMX8kxPtjmDSFUdZlAWJkMvsQ4ZMASfee90JWIAV8tweltXLzkWC3q++43ToTelI8ac5iC0B3/S/Cl4Ql1y2g==} @@ -1252,6 +3341,33 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + + require-package-name@2.0.1: + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} + hasBin: true + retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -1264,27 +3380,107 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rollup@4.57.1: resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + sax@1.4.4: resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} engines: {node: '>=11.0.0'} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + shiki@3.22.0: resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-code-frame@1.3.0: + resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -1293,6 +3489,9 @@ packages: engines: {node: '>=14.0.0', npm: '>=6.0.0'} hasBin: true + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + smol-toml@1.6.0: resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} @@ -1301,20 +3500,82 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stack-trace@1.0.0: + resolution: {integrity: sha512-H6D7134xi6qONvh7ZHKgviXf+rd3vhGBSvebPZCaUkd8zvQ+7PtDw6CljPTe4cXWNf2IKZGNqw6VJXSb9IgBpA==} + engines: {node: '>=20.0.0'} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -1326,17 +3587,55 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strnum@2.1.2: resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + svgo@4.0.0: resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} engines: {node: '>=16'} hasBin: true + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} + engines: {node: '>=18'} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinyclip@0.1.15: + resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -1345,12 +3644,46 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tomlify-j0.4@3.0.0: + resolution: {integrity: sha512-2Ulkc8T7mXJ2l0W476YC/A209PR38Nw8PuaCNtk9uI3t1zzFdGQeWYGQvmj2PZkVvRC/Yoi4xQKMRnWc/N29tQ==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -1368,6 +3701,22 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -1376,12 +3725,27 @@ packages: ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ulid@3.0.2: + resolution: {integrity: sha512-yu26mwteFYzBAot7KVMqFGCVpsF6g8wXfJzQUHvu1no3+rRRSFcSV2nKeYvNPLD2J4b08jYBDhHUjeH0ygIl9w==} + hasBin: true + ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -1415,6 +3779,10 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + unixify@1.0.0: + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} + unstorage@1.17.4: resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} peerDependencies: @@ -1477,9 +3845,35 @@ packages: uploadthing: optional: true + untun@0.2.2: + resolution: {integrity: sha512-+NnOJcSiEtYsVgJmXUzQbJeRAFXJC4yPJYuh6kF9B0Rm6zunXcs/3GZOTllyocSbUDIxD6Bj7e/4ATw7sph1Sw==} + hasBin: true + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uqr@0.1.3: + resolution: {integrity: sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA==} + + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -1489,6 +3883,11 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-prerender-plugin@0.5.13: + resolution: {integrity: sha512-IKSpYkzDBsKAxa05naRbj7GvNVMSdww/Z/E89oO3xndz+gWnOBOKOAbEXv7qDhktY/j3vHgJmoV1pPzqU2tx9g==} + peerDependencies: + vite: 5.x || 6.x || 7.x || 8.x + vite@6.4.1: resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -1540,25 +3939,106 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} @@ -1571,6 +4051,13 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod-to-json-schema@3.25.1: resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: @@ -1585,6 +4072,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -1594,6 +4084,8 @@ snapshots: '@astrojs/internal-helpers@0.7.5': {} + '@astrojs/internal-helpers@0.7.6': {} + '@astrojs/markdown-remark@6.3.10': dependencies: '@astrojs/internal-helpers': 0.7.5 @@ -1620,135 +4112,439 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/prism@3.3.0': - dependencies: - prismjs: 1.30.0 - - '@astrojs/rss@4.0.15': - dependencies: - fast-xml-parser: 5.3.4 - piccolore: 0.1.3 - - '@astrojs/sitemap@3.7.0': - dependencies: - sitemap: 8.0.2 - stream-replace-string: 2.0.0 - zod: 3.25.76 - - '@astrojs/telemetry@3.3.0': + '@astrojs/netlify@6.6.5(astro@5.17.1(@netlify/blobs@10.7.11)(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.9.0))(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(yaml@2.9.0)': dependencies: - ci-info: 4.4.0 - debug: 4.4.3 - dlv: 1.1.3 - dset: 3.1.4 - is-docker: 3.0.0 - is-wsl: 3.1.0 - which-pm-runs: 1.1.0 + '@astrojs/internal-helpers': 0.7.6 + '@astrojs/underscore-redirects': 1.0.0 + '@netlify/blobs': 10.7.11 + '@netlify/functions': 5.3.0 + '@netlify/vite-plugin': 2.12.9(rollup@4.57.1)(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) + '@vercel/nft': 0.30.4(rollup@4.57.1) + astro: 5.17.1(@netlify/blobs@10.7.11)(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.9.0) + esbuild: 0.25.12 + tinyglobby: 0.2.17 + vite: 6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@parcel/watcher' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - babel-plugin-macros + - bare-abort-controller + - bare-buffer + - db0 + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - react-native-b4a + - rollup + - sass + - sass-embedded + - srvx + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - yaml + + '@astrojs/preact@4.1.3(@babel/core@7.29.7)(jiti@2.7.0)(lightningcss@1.33.0)(preact@10.29.7(preact-render-to-string@6.7.0))(rollup@4.57.1)(yaml@2.9.0)': + dependencies: + '@preact/preset-vite': 2.10.6(@babel/core@7.29.7)(preact@10.29.7(preact-render-to-string@6.7.0))(rollup@4.57.1)(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) + '@preact/signals': 2.10.1(preact@10.29.7(preact-render-to-string@6.7.0)) + preact: 10.29.7(preact-render-to-string@6.7.0) + preact-render-to-string: 6.7.0(preact@10.29.7(preact-render-to-string@6.7.0)) + vite: 6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@babel/core' + - '@types/node' + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/prism@3.3.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/rss@4.0.15': + dependencies: + fast-xml-parser: 5.3.4 + piccolore: 0.1.3 + + '@astrojs/sitemap@3.7.0': + dependencies: + sitemap: 8.0.2 + stream-replace-string: 2.0.0 + zod: 3.25.76 + + '@astrojs/telemetry@3.3.0': + dependencies: + ci-info: 4.4.0 + debug: 4.4.3 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 transitivePeerDependencies: - supports-color + '@astrojs/underscore-redirects@1.0.0': {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.7 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.29.7': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + '@babel/parser@7.29.0': dependencies: '@babel/types': 7.29.0 + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + + '@babel/traverse@7.29.8': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@capsizecss/unpack@4.0.0': dependencies: fontkitten: 1.0.2 + '@colors/colors@1.6.0': {} + '@ctrl/tinycolor@4.2.0': {} + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + + '@dependents/detective-less@5.0.3': + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.2 + + '@electric-sql/pglite@0.3.16': {} + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true + '@envelop/instrumentation@1.0.0': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + '@esbuild/aix-ppc64@0.25.12': optional: true + '@esbuild/aix-ppc64@0.28.1': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true + '@esbuild/android-arm64@0.28.1': + optional: true + '@esbuild/android-arm@0.25.12': optional: true + '@esbuild/android-arm@0.28.1': + optional: true + '@esbuild/android-x64@0.25.12': optional: true + '@esbuild/android-x64@0.28.1': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true + '@esbuild/darwin-arm64@0.28.1': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true + '@esbuild/darwin-x64@0.28.1': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true + '@esbuild/freebsd-arm64@0.28.1': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true + '@esbuild/freebsd-x64@0.28.1': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true + '@esbuild/linux-arm64@0.28.1': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true + '@esbuild/linux-arm@0.28.1': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true + '@esbuild/linux-ia32@0.28.1': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true + '@esbuild/linux-loong64@0.28.1': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true + '@esbuild/linux-mips64el@0.28.1': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true + '@esbuild/linux-ppc64@0.28.1': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true + '@esbuild/linux-riscv64@0.28.1': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true + '@esbuild/linux-s390x@0.28.1': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true + '@esbuild/linux-x64@0.28.1': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true + '@esbuild/netbsd-arm64@0.28.1': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true + '@esbuild/netbsd-x64@0.28.1': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true + '@esbuild/openbsd-arm64@0.28.1': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true + '@esbuild/openbsd-x64@0.28.1': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true + '@esbuild/openharmony-arm64@0.28.1': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true + '@esbuild/sunos-x64@0.28.1': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true + '@esbuild/win32-arm64@0.28.1': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true + '@esbuild/win32-ia32@0.28.1': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true + '@esbuild/win32-x64@0.28.1': + optional: true + '@expressive-code/core@0.41.6': dependencies: '@ctrl/tinycolor': 4.2.0 @@ -1761,119 +4557,650 @@ snapshots: unist-util-visit: 5.1.0 unist-util-visit-parents: 6.0.2 - '@expressive-code/plugin-frames@0.41.6': + '@expressive-code/plugin-frames@0.41.6': + dependencies: + '@expressive-code/core': 0.41.6 + + '@expressive-code/plugin-shiki@0.41.6': + dependencies: + '@expressive-code/core': 0.41.6 + shiki: 3.22.0 + + '@expressive-code/plugin-text-markers@0.41.6': + dependencies: + '@expressive-code/core': 0.41.6 + + '@fastify/accept-negotiator@2.0.1': {} + + '@fastify/busboy@3.2.0': {} + + '@humanwhocodes/momoa@2.0.4': {} + + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@import-maps/resolve@2.0.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.3 + tar: 7.5.22 + transitivePeerDependencies: + - encoding + - supports-color + + '@netlify/ai@0.4.4': + dependencies: + '@netlify/api': 15.1.0 + + '@netlify/api@15.1.0': + dependencies: + '@netlify/open-api': 2.57.0 + node-fetch: 3.3.2 + p-wait-for: 5.0.2 + picoquery: 2.5.0 + + '@netlify/binary-info@1.0.0': {} + + '@netlify/blobs@10.7.11': + dependencies: + '@netlify/dev-utils': 4.4.7 + '@netlify/otel': 6.0.5 + '@netlify/runtime-utils': 2.3.0 + transitivePeerDependencies: + - supports-color + + '@netlify/cache@3.4.9': + dependencies: + '@netlify/runtime-utils': 2.3.0 + + '@netlify/config@25.1.1': + dependencies: + '@netlify/api': 15.1.0 + '@netlify/headers-parser': 10.1.0 + '@netlify/redirect-parser': 16.1.0 + chalk: 5.6.2 + cron-parser: 4.9.0 + deepmerge: 4.3.1 + dot-prop: 9.0.0 + execa: 8.0.1 + fast-safe-stringify: 2.1.1 + figures: 6.1.0 + filter-obj: 6.1.0 + find-up: 7.0.0 + indent-string: 5.0.0 + is-plain-obj: 4.1.0 + map-obj: 5.0.2 + omit.js: 2.0.2 + p-locate: 6.0.0 + path-type: 6.0.0 + read-package-up: 11.0.0 + smol-toml: 1.6.0 + tomlify-j0.4: 3.0.0 + validate-npm-package-name: 5.0.1 + yaml: 2.9.0 + yargs: 17.7.3 + zod: 4.4.3 + + '@netlify/database-dev@0.10.1': + dependencies: + '@electric-sql/pglite': 0.3.16 + pg-gateway: 0.3.0-beta.4 + + '@netlify/dev-utils@4.4.7': + dependencies: + '@whatwg-node/server': 0.11.0 + ansis: 4.3.1 + atomically: 2.1.1 + chokidar: 4.0.3 + decache: 4.6.2 + dettle: 1.0.5 + dot-prop: 9.0.0 + empathic: 2.0.1 + env-paths: 3.0.0 + image-size: 2.0.2 + js-image-generator: 1.0.4 + parse-gitignore: 2.0.0 + semver: 7.7.3 + tmp-promise: 3.0.3 + + '@netlify/dev@4.18.11(rollup@4.57.1)': + dependencies: + '@netlify/ai': 0.4.4 + '@netlify/blobs': 10.7.11 + '@netlify/config': 25.1.1 + '@netlify/database-dev': 0.10.1 + '@netlify/dev-utils': 4.4.7 + '@netlify/edge-functions-dev': 1.0.23 + '@netlify/functions-dev': 1.3.3(rollup@4.57.1) + '@netlify/headers': 2.1.12 + '@netlify/images': 1.3.11(@netlify/blobs@10.7.11) + '@netlify/redirects': 3.1.14 + '@netlify/runtime': 4.1.27 + '@netlify/static': 3.1.11 + ulid: 3.0.2 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@parcel/watcher' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - db0 + - encoding + - idb-keyval + - ioredis + - react-native-b4a + - rollup + - srvx + - supports-color + - uploadthing + + '@netlify/edge-bundler@15.1.1': + dependencies: + '@import-maps/resolve': 2.0.0 + '@sveltejs/acorn-typescript': 1.0.11(acorn@8.15.0) + acorn: 8.15.0 + ajv: 8.20.0 + ajv-errors: 3.0.0(ajv@8.20.0) + better-ajv-errors: 1.2.0(ajv@8.20.0) + common-path-prefix: 3.0.0 + env-paths: 3.0.0 + esbuild: 0.28.1 + execa: 8.0.1 + find-up: 7.0.0 + get-port: 7.2.0 + node-stream-zip: 1.16.0 + p-retry: 6.2.1 + p-wait-for: 5.0.2 + parse-imports: 2.2.1 + path-key: 4.0.0 + semver: 7.7.3 + tar: 7.5.22 + tmp-promise: 3.0.3 + urlpattern-polyfill: 8.0.2 + + '@netlify/edge-functions-bootstrap@2.16.0': {} + + '@netlify/edge-functions-dev@1.0.23': + dependencies: + '@netlify/dev-utils': 4.4.7 + '@netlify/edge-bundler': 15.1.1 + '@netlify/edge-functions': 3.0.8 + '@netlify/edge-functions-bootstrap': 2.16.0 + '@netlify/runtime-utils': 2.3.0 + get-port: 7.2.0 + + '@netlify/edge-functions@3.0.8': + dependencies: + '@netlify/types': 2.8.0 + + '@netlify/functions-dev@1.3.3(rollup@4.57.1)': + dependencies: + '@netlify/blobs': 10.7.11 + '@netlify/dev-utils': 4.4.7 + '@netlify/functions': 5.3.0 + '@netlify/zip-it-and-ship-it': 15.3.0(rollup@4.57.1) + cron-parser: 4.9.0 + decache: 4.6.2 + extract-zip: 2.0.1 + is-stream: 4.0.1 + jwt-decode: 4.0.0 + lambda-local: 2.2.0 + read-package-up: 11.0.0 + semver: 7.7.3 + source-map-support: 0.5.21 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - encoding + - react-native-b4a + - rollup + - supports-color + + '@netlify/functions@5.3.0': + dependencies: + '@netlify/types': 2.8.0 + + '@netlify/headers-parser@10.1.0': + dependencies: + escape-string-regexp: 5.0.0 + fast-safe-stringify: 2.1.1 + is-plain-obj: 4.1.0 + map-obj: 5.0.2 + path-exists: 5.0.0 + smol-toml: 1.6.0 + + '@netlify/headers@2.1.12': + dependencies: + '@netlify/headers-parser': 10.1.0 + + '@netlify/images@1.3.11(@netlify/blobs@10.7.11)': + dependencies: + ipx: 3.1.1(@netlify/blobs@10.7.11) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@parcel/watcher' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - srvx + - uploadthing + + '@netlify/open-api@2.57.0': {} + + '@netlify/otel@6.0.5': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.9.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - supports-color + + '@netlify/redirect-parser@16.1.0': + dependencies: + fast-safe-stringify: 2.1.1 + is-plain-obj: 4.1.0 + path-exists: 5.0.0 + smol-toml: 1.6.0 + + '@netlify/redirects@3.1.14': + dependencies: + '@netlify/dev-utils': 4.4.7 + '@netlify/redirect-parser': 16.1.0 + cookie: 1.1.1 + jsonwebtoken: 9.0.3 + netlify-redirector: 0.5.0 + + '@netlify/runtime-utils@2.3.0': {} + + '@netlify/runtime@4.1.27': dependencies: - '@expressive-code/core': 0.41.6 + '@netlify/blobs': 10.7.11 + '@netlify/cache': 3.4.9 + '@netlify/runtime-utils': 2.3.0 + '@netlify/types': 2.8.0 + transitivePeerDependencies: + - supports-color - '@expressive-code/plugin-shiki@0.41.6': + '@netlify/serverless-functions-api@2.16.0': dependencies: - '@expressive-code/core': 0.41.6 - shiki: 3.22.0 + '@netlify/types': 2.8.0 - '@expressive-code/plugin-text-markers@0.41.6': + '@netlify/static@3.1.11': dependencies: - '@expressive-code/core': 0.41.6 + mime-types: 3.0.2 - '@img/colour@1.0.0': - optional: true + '@netlify/types@2.8.0': {} - '@img/sharp-darwin-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 - optional: true + '@netlify/vite-plugin@2.12.9(rollup@4.57.1)(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0))': + dependencies: + '@netlify/dev': 4.18.11(rollup@4.57.1) + '@netlify/dev-utils': 4.4.7 + dedent: 1.7.2 + vite: 6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@parcel/watcher' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - babel-plugin-macros + - bare-abort-controller + - bare-buffer + - db0 + - encoding + - idb-keyval + - ioredis + - react-native-b4a + - rollup + - srvx + - supports-color + - uploadthing - '@img/sharp-darwin-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 - optional: true + '@netlify/zip-it-and-ship-it@15.3.0(rollup@4.57.1)': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@netlify/binary-info': 1.0.0 + '@netlify/serverless-functions-api': 2.16.0 + '@opentelemetry/api': 1.8.0 + '@vercel/nft': 0.29.4(rollup@4.57.1) + archiver: 7.0.1 + common-path-prefix: 3.0.0 + copy-file: 11.1.0 + es-module-lexer: 1.7.0 + esbuild: 0.28.1 + execa: 8.0.1 + fast-glob: 3.3.3 + filter-obj: 6.1.0 + find-up: 7.0.0 + is-path-inside: 4.0.0 + junk: 4.0.1 + locate-path: 7.2.0 + merge-options: 3.0.4 + minimatch: 10.2.6 + normalize-path: 3.0.0 + p-map: 7.0.6 + path-exists: 5.0.0 + precinct: 12.3.2 + require-package-name: 2.0.1 + resolve: 2.0.0-next.7 + semver: 7.7.3 + tmp-promise: 3.0.3 + toml: 3.0.0 + unixify: 1.0.0 + urlpattern-polyfill: 8.0.2 + yargs: 17.7.3 + zod: 3.25.76 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - encoding + - react-native-b4a + - rollup + - supports-color - '@img/sharp-libvips-darwin-arm64@1.2.4': - optional: true + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - '@img/sharp-libvips-darwin-x64@1.2.4': - optional: true + '@nodelib/fs.stat@2.0.5': {} - '@img/sharp-libvips-linux-arm64@1.2.4': - optional: true + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 - '@img/sharp-libvips-linux-arm@1.2.4': - optional: true + '@opentelemetry/api-logs@0.220.0': + dependencies: + '@opentelemetry/api': 1.9.1 - '@img/sharp-libvips-linux-ppc64@1.2.4': - optional: true + '@opentelemetry/api@1.8.0': {} - '@img/sharp-libvips-linux-riscv64@1.2.4': - optional: true + '@opentelemetry/api@1.9.1': {} - '@img/sharp-libvips-linux-s390x@1.2.4': - optional: true + '@opentelemetry/context-async-hooks@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 - '@img/sharp-libvips-linux-x64@1.2.4': - optional: true + '@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - optional: true + '@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - optional: true + '@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.220.0 + import-in-the-middle: 3.3.2 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color - '@img/sharp-linux-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 - optional: true + '@opentelemetry/resources@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 - '@img/sharp-linux-arm@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 - optional: true + '@opentelemetry/sdk-trace-base@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 - '@img/sharp-linux-ppc64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 - optional: true + '@opentelemetry/sdk-trace-node@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.9.0(@opentelemetry/api@1.9.1) - '@img/sharp-linux-riscv64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 - optional: true + '@opentelemetry/sdk-trace@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 - '@img/sharp-linux-s390x@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 - optional: true + '@opentelemetry/semantic-conventions@1.43.0': {} - '@img/sharp-linux-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 - optional: true + '@oslojs/encoding@1.1.0': {} - '@img/sharp-linuxmusl-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - optional: true + '@parcel/watcher-wasm@2.6.0': + dependencies: + is-glob: 4.0.3 + picomatch: 4.0.5 - '@img/sharp-linuxmusl-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@pkgjs/parseargs@0.11.0': optional: true - '@img/sharp-wasm32@0.34.5': + '@preact/preset-vite@2.10.6(@babel/core@7.29.7)(preact@10.29.7(preact-render-to-string@6.7.0))(rollup@4.57.1)(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0))': dependencies: - '@emnapi/runtime': 1.8.1 - optional: true + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) + '@prefresh/vite': 2.4.12(preact@10.29.7(preact-render-to-string@6.7.0))(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.7) + debug: 4.4.3 + magic-string: 0.30.21 + picocolors: 1.1.1 + vite: 6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + vite-prerender-plugin: 0.5.13(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) + zimmerframe: 1.1.4 + transitivePeerDependencies: + - preact + - rollup + - supports-color - '@img/sharp-win32-arm64@0.34.5': - optional: true + '@preact/signals-core@1.14.4': {} - '@img/sharp-win32-ia32@0.34.5': - optional: true + '@preact/signals@2.10.1(preact@10.29.7(preact-render-to-string@6.7.0))': + dependencies: + '@preact/signals-core': 1.14.4 + preact: 10.29.7(preact-render-to-string@6.7.0) - '@img/sharp-win32-x64@0.34.5': - optional: true + '@prefresh/babel-plugin@0.5.3': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@prefresh/core@1.5.10(preact@10.29.7(preact-render-to-string@6.7.0))': + dependencies: + preact: 10.29.7(preact-render-to-string@6.7.0) - '@oslojs/encoding@1.1.0': {} + '@prefresh/utils@1.2.1': {} + + '@prefresh/vite@2.4.12(preact@10.29.7(preact-render-to-string@6.7.0))(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0))': + dependencies: + '@babel/core': 7.29.7 + '@prefresh/babel-plugin': 0.5.3 + '@prefresh/core': 1.5.10(preact@10.29.7(preact-render-to-string@6.7.0)) + '@prefresh/utils': 1.2.1 + '@rollup/pluginutils': 4.2.1 + preact: 10.29.7(preact-render-to-string@6.7.0) + vite: 6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 '@rollup/pluginutils@5.3.0(rollup@4.57.1)': dependencies: @@ -1962,14 +5289,14 @@ snapshots: dependencies: '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-to-html: 9.0.5 '@shikijs/engine-javascript@3.22.0': dependencies: '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.4 + oniguruma-to-es: 4.3.6 '@shikijs/engine-oniguruma@3.22.0': dependencies: @@ -1987,17 +5314,26 @@ snapshots: '@shikijs/types@3.22.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@shikijs/vscode-textmate@10.0.2': {} + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@sveltejs/acorn-typescript@1.0.11(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 '@types/estree@1.0.8': {} - '@types/hast@3.0.4': + '@types/hast@3.0.5': dependencies: '@types/unist': 3.0.3 @@ -2013,16 +5349,184 @@ snapshots: '@types/node@17.0.45': {} + '@types/normalize-package-data@2.4.4': {} + + '@types/retry@0.12.2': {} + '@types/sax@1.2.7': dependencies: '@types/node': 17.0.45 + '@types/triple-beam@1.3.5': {} + '@types/unist@3.0.3': {} + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 17.0.45 + optional: true + + '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/types@8.65.0': {} + + '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.7.3 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.3.0': {} + '@vercel/nft@0.29.4(rollup@4.57.1)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.5.0 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.5 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/nft@0.30.4(rollup@4.57.1)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.5.0 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.5 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vue/compiler-core@3.5.40': + dependencies: + '@babel/parser': 7.29.8 + '@vue/shared': 3.5.40 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.40': + dependencies: + '@vue/compiler-core': 3.5.40 + '@vue/shared': 3.5.40 + + '@vue/compiler-sfc@3.5.40': + dependencies: + '@babel/parser': 7.29.8 + '@vue/compiler-core': 3.5.40 + '@vue/compiler-dom': 3.5.40 + '@vue/compiler-ssr': 3.5.40 + '@vue/shared': 3.5.40 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.25 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.40': + dependencies: + '@vue/compiler-dom': 3.5.40 + '@vue/shared': 3.5.40 + + '@vue/shared@3.5.40': {} + + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.13': + dependencies: + '@whatwg-node/node-fetch': 0.8.6 + urlpattern-polyfill: 10.1.0 + + '@whatwg-node/node-fetch@0.8.6': + dependencies: + '@fastify/busboy': 3.2.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.2': + dependencies: + tslib: 2.8.1 + + '@whatwg-node/server@0.11.0': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + abbrev@3.0.1: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn@8.15.0: {} + agent-base@7.1.4: {} + + ajv-errors@3.0.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.5 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -2031,27 +5535,81 @@ snapshots: ansi-regex@6.2.2: {} + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + ansi-styles@6.2.3: {} + ansis@4.3.1: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + archiver-utils@5.0.2: + dependencies: + glob: 10.5.0 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.18.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.2.0 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + arg@5.0.2: {} argparse@2.0.1: {} aria-query@5.3.2: {} + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + array-iterate@2.0.1: {} - astro-expressive-code@0.41.6(astro@5.17.1(rollup@4.57.1)(typescript@5.9.3)): + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + ast-module-types@6.0.2: {} + + astro-expressive-code@0.41.6(astro@5.17.1(@netlify/blobs@10.7.11)(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.9.0)): dependencies: - astro: 5.17.1(rollup@4.57.1)(typescript@5.9.3) + astro: 5.17.1(@netlify/blobs@10.7.11)(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.9.0) rehype-expressive-code: 0.41.6 - astro@5.17.1(rollup@4.57.1)(typescript@5.9.3): + astro@5.17.1(@netlify/blobs@10.7.11)(jiti@2.7.0)(lightningcss@1.33.0)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.9.0): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -2106,10 +5664,10 @@ snapshots: ultrahtml: 1.6.0 unifont: 0.7.3 unist-util-visit: 5.1.0 - unstorage: 1.17.4 + unstorage: 1.17.4(@netlify/blobs@10.7.11) vfile: 6.0.3 - vite: 6.4.1 - vitefu: 1.1.1(vite@6.4.1) + vite: 6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + vitefu: 1.1.1(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -2153,14 +5711,85 @@ snapshots: - uploadthing - yaml - axobject-query@4.1.0: {} + async-function@1.0.0: {} + + async-sema@3.1.1: {} + + async@3.2.6: {} + + atomically@2.1.1: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axobject-query@4.1.0: {} + + b4a@1.8.1: {} + + babel-plugin-transform-hook-names@1.0.2(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 bail@2.0.2: {} + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + bare-events@2.9.1: {} + + bare-fs@4.7.4: + dependencies: + bare-events: 2.9.1 + bare-path: 3.1.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.6 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-path@3.1.1: {} + + bare-stream@2.13.3(bare-events@2.9.1): + dependencies: + b4a: 1.8.1 + streamx: 2.28.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.6: + dependencies: + bare-path: 3.1.1 + base-64@1.0.0: {} + base64-js@1.5.1: {} + + baseline-browser-mapping@2.11.9: {} + bcp-47-match@2.0.3: {} + better-ajv-errors@1.2.0(ajv@8.20.0): + dependencies: + '@babel/code-frame': 7.29.7 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.20.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + boolbase@1.0.0: {} boxen@8.0.1: @@ -2174,10 +5803,69 @@ snapshots: widest-line: 5.0.0 wrap-ansi: 9.0.2 + brace-expansion@2.1.4: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.7: + dependencies: + baseline-browser-mapping: 2.11.9 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.399 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.7) + + buffer-crc32@0.2.13: {} + + buffer-crc32@1.0.0: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsite@1.0.0: {} + camelcase@8.0.0: {} + caniuse-lite@1.0.30001806: {} + ccount@2.0.1: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@5.6.2: {} character-entities-html4@2.1.0: {} @@ -2186,30 +5874,119 @@ snapshots: character-entities@2.0.2: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chokidar@5.0.0: dependencies: readdirp: 5.0.0 + chownr@3.0.0: {} + ci-info@4.4.0: {} + citty@0.1.6: + dependencies: + consola: 3.4.2 + + citty@0.2.2: {} + + cjs-module-lexer@2.2.0: {} + cli-boxes@3.0.0: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@2.1.1: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-convert@3.1.3: + dependencies: + color-name: 2.1.1 + + color-name@1.1.4: {} + + color-name@2.1.1: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.1 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} + commander@11.1.0: {} + commander@12.1.0: {} + + commander@2.20.3: {} + common-ancestor-path@1.0.1: {} + common-path-prefix@3.0.0: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + consola@3.4.2: {} + + convert-source-map@2.0.0: {} + cookie-es@1.2.2: {} + cookie-es@1.2.3: {} + cookie@1.1.1: {} + copy-file@11.1.0: + dependencies: + graceful-fs: 4.2.11 + p-event: 6.0.1 + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + cron-parser@4.9.0: + dependencies: + luxon: 3.7.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crossws@0.3.5: dependencies: uncrypto: 0.1.3 + crossws@0.4.10: {} + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -2234,31 +6011,132 @@ snapshots: cssesc@3.0.0: {} + cssfilter@0.0.10: {} + csso@5.0.5: dependencies: css-tree: 2.2.1 + data-uri-to-buffer@4.0.1: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + debug@4.4.3: dependencies: ms: 2.1.3 + decache@4.6.2: + dependencies: + callsite: 1.0.0 + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 + dedent@1.7.2: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + defu@6.1.4: {} + defu@6.1.7: {} + dequal@2.0.3: {} destr@2.0.5: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} + + detective-amd@6.1.0: + dependencies: + ast-module-types: 6.0.2 + escodegen: 2.1.0 + get-amd-module-type: 6.0.2 + node-source-walk: 7.0.2 + + detective-cjs@6.1.1: + dependencies: + ast-module-types: 6.0.2 + node-source-walk: 7.0.2 + + detective-es6@5.0.2: + dependencies: + node-source-walk: 7.0.2 + + detective-postcss@8.0.4(postcss@8.5.25): + dependencies: + is-url-superb: 4.0.0 + postcss: 8.5.25 + postcss-values-parser: 6.0.2(postcss@8.5.25) + + detective-sass@6.0.2: + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.2 + + detective-scss@5.0.2: + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.2 + + detective-stylus@5.0.1: {} + + detective-typescript@14.1.2(typescript@5.9.3): + dependencies: + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + ast-module-types: 6.0.2 + node-source-walk: 7.0.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + detective-vue2@2.3.0(typescript@5.9.3): + dependencies: + '@dependents/detective-less': 5.0.3 + '@vue/compiler-sfc': 3.5.40 + detective-es6: 5.0.2 + detective-sass: 6.0.2 + detective-scss: 5.0.2 + detective-stylus: 5.0.1 + detective-typescript: 14.1.2(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color deterministic-object-hash@2.0.2: dependencies: base-64: 1.0.0 + dettle@1.0.5: {} + devalue@5.6.2: {} devlop@1.1.0: @@ -2289,18 +6167,146 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + + dotenv@16.6.1: {} + dset@3.1.4: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + electron-to-chromium@1.5.399: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + + empathic@2.0.1: {} + + enabled@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + entities@4.5.0: {} entities@6.0.1: {} + entities@7.0.1: {} + + env-paths@3.0.0: {} + + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.2 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.22 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-module-lexer@2.3.1: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.4 + + es-to-primitive@1.3.4: + dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -2330,16 +6336,87 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + escalade@3.2.0: {} + escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-visitor-keys@5.0.1: {} + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + eventemitter3@5.0.4: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + + events@3.3.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + expressive-code@0.41.6: dependencies: '@expressive-code/core': 0.41.6 @@ -2349,16 +6426,83 @@ snapshots: extend@3.0.2: {} + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.1.5: {} + fast-xml-parser@5.3.4: dependencies: strnum: 2.1.2 + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + fecha@4.2.3: {} + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + filter-obj@6.1.0: {} + + find-up-simple@1.0.1: {} + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + flattie@1.1.1: {} + fn.name@1.1.0: {} + fontace@0.4.1: dependencies: fontkitten: 1.0.2 @@ -2367,13 +6511,125 @@ snapshots: dependencies: tiny-inflate: 1.0.3 + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + + function.prototype.name@1.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + es-define-property: 1.0.1 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 + is-callable: 1.2.7 + is-document.all: 1.0.0 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-amd-module-type@6.0.2: + dependencies: + ast-module-types: 6.0.2 + node-source-walk: 7.0.2 + + get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-port-please@3.2.0: {} + + get-port@7.2.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + + get-stream@8.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + github-slugger@2.0.0: {} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gonzales-pe@4.3.0: + dependencies: + minimist: 1.2.8 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + h3@1.15.5: dependencies: cookie-es: 1.2.2 @@ -2386,9 +6642,31 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + hast-util-from-html@2.0.3: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 devlop: 1.1.0 hast-util-from-parse5: 8.0.3 parse5: 7.3.0 @@ -2397,7 +6675,7 @@ snapshots: hast-util-from-parse5@8.0.3: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 @@ -2408,19 +6686,19 @@ snapshots: hast-util-has-property@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-is-element@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-parse-selector@4.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-raw@9.1.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 '@ungap/structured-clone': 1.3.0 hast-util-from-parse5: 8.0.3 @@ -2436,7 +6714,7 @@ snapshots: hast-util-select@6.0.4: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 bcp-47-match: 2.0.3 comma-separated-tokens: 2.0.3 @@ -2454,7 +6732,7 @@ snapshots: hast-util-to-html@9.0.5: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 @@ -2468,7 +6746,7 @@ snapshots: hast-util-to-parse5@8.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 devlop: 1.1.0 property-information: 7.1.0 @@ -2478,61 +6756,453 @@ snapshots: hast-util-to-string@3.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-to-text@4.0.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hastscript@9.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 7.1.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-escaper@3.0.3: {} html-void-elements@3.0.0: {} http-cache-semantics@4.2.0: {} + http-shutdown@1.2.2: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + ieee754@1.2.1: {} + + image-meta@0.2.2: {} + + image-size@2.0.2: {} + + import-in-the-middle@3.3.2: + dependencies: + cjs-module-lexer: 2.2.0 + es-module-lexer: 2.3.1 + module-details-from-path: 1.0.4 + import-meta-resolve@4.2.0: {} + indent-string@5.0.0: {} + + index-to-position@1.2.0: {} + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.1 + + ipx@3.1.1(@netlify/blobs@10.7.11): + dependencies: + '@fastify/accept-negotiator': 2.0.1 + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.7 + destr: 2.0.5 + etag: 1.8.1 + h3: 1.15.11 + image-meta: 0.2.2 + listhen: 1.10.1 + ofetch: 1.5.1 + pathe: 2.0.3 + sharp: 0.34.5 + svgo: 4.0.0 + ufo: 1.6.4 + unstorage: 1.17.4(@netlify/blobs@10.7.11) + xss: 1.0.15 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@parcel/watcher' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - srvx + - uploadthing + iron-webcrypto@1.2.1: {} + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-docker@3.0.0: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-network-error@1.3.2: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@2.1.0: {} + is-plain-obj@4.1.0: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + + is-unicode-supported@2.1.0: {} + + is-url-superb@4.0.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@2.7.0: {} + + jpeg-js@0.4.4: {} + + js-image-generator@1.0.4: + dependencies: + jpeg-js: 0.4.4 + + js-tokens@4.0.0: {} + js-yaml@4.1.1: dependencies: argparse: 2.0.1 + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonpointer@5.0.1: {} + + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.3 + + junk@4.0.1: {} + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + jwt-decode@4.0.0: {} + kleur@3.0.3: {} + kolorist@1.8.0: {} + + kuler@2.0.0: {} + + lambda-local@2.2.0: + dependencies: + commander: 10.0.1 + dotenv: 16.6.1 + winston: 3.19.0 + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + leven@3.1.0: {} + + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + optional: true + + listhen@1.10.1: + dependencies: + '@parcel/watcher-wasm': 2.6.0 + citty: 0.2.2 + consola: 3.4.2 + crossws: 0.4.10 + defu: 6.1.7 + get-port-please: 3.2.0 + h3: 1.15.11 + http-shutdown: 1.2.2 + jiti: 2.7.0 + node-forge: 1.4.0 + pathe: 2.0.3 + std-env: 4.2.0 + tinyclip: 0.1.15 + ufo: 1.6.4 + untun: 0.2.2 + uqr: 0.1.3 + transitivePeerDependencies: + - srvx + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.once@4.1.1: {} + + lodash@4.18.1: {} + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + longest-streak@3.1.0: {} + lru-cache@10.4.3: {} + lru-cache@11.2.5: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + luxon@3.7.2: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2543,10 +7213,14 @@ snapshots: '@babel/types': 7.29.0 source-map-js: 1.2.1 + map-obj@5.0.2: {} + markdown-table@3.0.4: {} marked@17.0.1: {} + math-intrinsics@1.1.0: {} + mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.4 @@ -2641,7 +7315,7 @@ snapshots: mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 @@ -2671,6 +7345,14 @@ snapshots: mdn-data@2.12.2: {} + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -2862,28 +7544,146 @@ snapshots: transitivePeerDependencies: - supports-color + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mimic-fn@4.0.0: {} + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.4 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.4 + + minimist@1.2.8: {} + + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + module-definition@6.0.2: + dependencies: + ast-module-types: 6.0.2 + node-source-walk: 7.0.2 + + module-details-from-path@1.0.4: {} + mrmime@2.0.1: {} ms@2.1.3: {} nanoid@3.3.11: {} + nanoid@3.3.16: {} + neotraverse@0.6.18: {} + netlify-redirector@0.5.0: {} + nlcst-to-string@4.0.0: dependencies: '@types/nlcst': 2.0.3 + node-domexception@1.0.0: {} + + node-exports-info@1.6.2: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + node-fetch-native@1.6.7: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-forge@1.4.0: {} + + node-gyp-build@4.8.4: {} + + node-html-parser@6.1.13: + dependencies: + css-select: 5.2.2 + he: 1.2.0 + node-mock-http@1.0.4: {} + node-releases@2.0.51: {} + + node-source-walk@7.0.2: + dependencies: + '@babel/parser': 7.29.8 + + node-stream-zip@1.16.0: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 + + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + normalize-path@3.0.0: {} + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + ofetch@1.5.1: dependencies: destr: 2.0.5 @@ -2892,27 +7692,87 @@ snapshots: ohash@2.0.11: {} - oniguruma-parser@0.12.1: {} + omit.js@2.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + oniguruma-parser@0.12.2: {} - oniguruma-to-es@4.3.4: + oniguruma-to-es@4.3.6: dependencies: - oniguruma-parser: 0.12.1 + oniguruma-parser: 0.12.2 regex: 6.1.0 regex-recursion: 6.0.2 + own-keys@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + p-limit@6.2.0: dependencies: yocto-queue: 1.2.2 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@7.0.6: {} + p-queue@8.1.1: dependencies: eventemitter3: 5.0.4 p-timeout: 6.1.4 + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.3.2 + retry: 0.13.1 + p-timeout@6.1.4: {} + p-wait-for@5.0.2: + dependencies: + p-timeout: 6.1.4 + + package-json-from-dist@1.0.1: {} + package-manager-detector@1.6.0: {} + parse-gitignore@2.0.0: {} + + parse-imports@2.2.1: + dependencies: + es-module-lexer: 1.7.0 + slashes: 3.0.12 + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.29.7 + index-to-position: 1.2.0 + type-fest: 4.41.0 + parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -2926,6 +7786,27 @@ snapshots: dependencies: entities: 6.0.1 + path-exists@5.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + path-type@6.0.0: {} + + pathe@2.0.3: {} + + pend@1.2.0: {} + + pg-gateway@0.3.0-beta.4: {} + piccolore@0.1.3: {} picocolors@1.1.1: {} @@ -2934,6 +7815,12 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.5: {} + + picoquery@2.5.0: {} + + possible-typed-array-names@1.1.0: {} + postcss-nested@6.2.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -2944,14 +7831,59 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-values-parser@6.0.2(postcss@8.5.25): + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.5.25 + quote-unquote: 1.0.0 + + postcss@8.5.25: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 + preact-render-to-string@6.7.0(preact@10.29.7(preact-render-to-string@6.7.0)): + dependencies: + preact: 10.29.7(preact-render-to-string@6.7.0) + + preact@10.29.7(preact-render-to-string@6.7.0): + optionalDependencies: + preact-render-to-string: 6.7.0(preact@10.29.7(preact-render-to-string@6.7.0)) + + precinct@12.3.2: + dependencies: + '@dependents/detective-less': 5.0.3 + commander: 12.1.0 + detective-amd: 6.1.0 + detective-cjs: 6.1.1 + detective-es6: 5.0.2 + detective-postcss: 8.0.4(postcss@8.5.25) + detective-sass: 6.0.2 + detective-scss: 5.0.2 + detective-stylus: 5.0.1 + detective-typescript: 14.1.2(typescript@5.9.3) + detective-vue2: 2.3.0(typescript@5.9.3) + module-definition: 6.0.2 + node-source-walk: 7.0.2 + postcss: 8.5.25 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + prismjs@1.30.0: {} + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -2959,10 +7891,74 @@ snapshots: property-information@7.1.0: {} + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + queue-microtask@1.2.3: {} + + quote-unquote@1.0.0: {} + radix3@1.1.2: {} + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + + readdirp@4.1.2: {} + readdirp@5.0.0: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -2973,31 +7969,40 @@ snapshots: dependencies: regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + rehype-expressive-code@0.41.6: dependencies: expressive-code: 0.41.6 rehype-parse@9.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-from-html: 2.0.3 unified: 11.0.5 rehype-raw@7.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-raw: 9.1.0 vfile: 6.0.3 rehype-stringify@10.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-to-html: 9.0.5 unified: 11.0.5 rehype@13.0.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 rehype-parse: 9.0.1 rehype-stringify: 10.0.1 unified: 11.0.5 @@ -3024,7 +8029,7 @@ snapshots: remark-rehype@11.1.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.2.1 unified: 11.0.5 @@ -3043,6 +8048,32 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + remove-trailing-separator@1.1.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + + require-package-name@2.0.1: {} + + resolve-from@5.0.0: {} + + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.2 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -3068,6 +8099,10 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 + retry@0.13.1: {} + + reusify@1.1.0: {} + rollup@4.57.1: dependencies: '@types/estree': 1.0.8 @@ -3099,10 +8134,63 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + sax@1.4.4: {} + semver@6.3.1: {} + semver@7.7.3: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -3133,7 +8221,12 @@ snapshots: '@img/sharp-win32-arm64': 0.34.5 '@img/sharp-win32-ia32': 0.34.5 '@img/sharp-win32-x64': 0.34.5 - optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} shiki@3.22.0: dependencies: @@ -3144,7 +8237,41 @@ snapshots: '@shikijs/themes': 3.22.0 '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + simple-code-frame@1.3.0: + dependencies: + kolorist: 1.8.0 sisteransi@1.0.5: {} @@ -3155,26 +8282,109 @@ snapshots: arg: 5.0.2 sax: 1.4.4 + slashes@3.0.12: {} + smol-toml@1.6.0: {} source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + space-separated-tokens@2.0.2: {} + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + + stack-trace@0.0.10: {} + + stack-trace@1.0.0: {} + + std-env@4.2.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + stream-replace-string@2.0.0: {} + streamx@2.28.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + string-width@7.2.0: dependencies: emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -3188,8 +8398,22 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-final-newline@3.0.0: {} + strnum@2.1.2: {} + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + svgo@4.0.0: dependencies: commander: 11.1.0 @@ -3200,8 +8424,44 @@ snapshots: picocolors: 1.1.1 sax: 1.4.4 + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.4 + fast-fifo: 1.3.2 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar@7.5.22: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + + text-hex@1.0.0: {} + tiny-inflate@1.0.3: {} + tinyclip@0.1.15: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -3209,27 +8469,99 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.7 + + tmp@0.2.7: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toml@3.0.0: {} + + tomlify-j0.4@3.0.0: {} + + tr46@0.0.3: {} + trim-lines@3.0.1: {} + triple-beam@1.4.1: {} + trough@2.2.0: {} + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 - tslib@2.8.1: - optional: true + tslib@2.8.1: {} type-fest@4.41.0: {} + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typescript@5.9.3: {} ufo@1.6.3: {} + ufo@1.6.4: {} + + ulid@3.0.2: {} + ultrahtml@1.6.0: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + uncrypto@0.1.3: {} + unicorn-magic@0.1.0: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -3288,7 +8620,11 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - unstorage@1.17.4: + unixify@1.0.0: + dependencies: + normalize-path: 2.1.1 + + unstorage@1.17.4(@netlify/blobs@10.7.11): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 @@ -3298,9 +8634,32 @@ snapshots: node-fetch-native: 1.6.7 ofetch: 1.5.1 ufo: 1.6.3 + optionalDependencies: + '@netlify/blobs': 10.7.11 + + untun@0.2.2: {} + + update-browserslist-db@1.2.3(browserslist@4.28.7): + dependencies: + browserslist: 4.28.7 + escalade: 3.2.0 + picocolors: 1.1.1 + + uqr@0.1.3: {} + + urlpattern-polyfill@10.1.0: {} + + urlpattern-polyfill@8.0.2: {} util-deprecate@1.0.2: {} + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -3316,7 +8675,17 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.1: + vite-prerender-plugin@0.5.13(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)): + dependencies: + kolorist: 1.8.0 + magic-string: 0.30.21 + node-html-parser: 6.1.13 + simple-code-frame: 1.3.0 + source-map: 0.7.6 + stack-trace: 1.0.0 + vite: 6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + + vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -3326,29 +8695,150 @@ snapshots: tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.33.0 + yaml: 2.9.0 - vitefu@1.1.1(vite@6.4.1): + vitefu@1.1.1(vite@6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)): optionalDependencies: - vite: 6.4.1 + vite: 6.4.1(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) web-namespaces@2.0.1: {} + web-streams-polyfill@3.3.3: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + when-exit@2.1.5: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.2.0 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.22 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + which-pm-runs@1.1.0: {} + which-typed-array@1.1.22: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + widest-line@5.0.0: dependencies: string-width: 7.2.0 + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.8 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 strip-ansi: 7.1.2 + wrappy@1.0.2: {} + + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + xxhash-wasm@1.1.0: {} + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yaml@2.9.0: {} + yargs-parser@21.1.1: {} + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yocto-queue@1.2.2: {} yocto-spinner@0.2.3: @@ -3357,6 +8847,14 @@ snapshots: yoctocolors@2.1.2: {} + zimmerframe@1.1.4: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 @@ -3368,4 +8866,6 @@ snapshots: zod@3.25.76: {} + zod@4.4.3: {} + zwitch@2.0.4: {} diff --git a/public/_redirects b/public/_redirects index f9c6e52..38ba104 100644 --- a/public/_redirects +++ b/public/_redirects @@ -1,3 +1,8 @@ +# GENERATED IN PART. Specific rules first, catch alls last, because Netlify uses the +# first match. Rules below are the pre v2 set and still point at /blog/, which becomes +# an old URL itself once topic first URLs land. scripts/gen-redirects.mjs rewrites all +# of them to point straight at their final destination so nothing chains. + # old blog posts /posts/adding-hateoas-to-an-aspnetcore-rest-api/ /blog/adding-hateoas-to-an-asp-net-core-api/ @@ -13,3 +18,9 @@ /posts/setting-up-raspberry-pi-for-kiosk-mode /blog/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium/ /posts/using-netlify-functions-to-add-comments-to-gridsome/ / /posts/cheers-to-2019-bring-on-2020/ / + +# catch alls. These lived in public/netlify.toml, where Netlify never read them, so +# they have not been running. They sit last so the specific rules above win. + +/brain-dump/* / 301! +/posts/* /blog/:splat 301! diff --git a/public/netlify.toml b/public/netlify.toml deleted file mode 100644 index d17fd3f..0000000 --- a/public/netlify.toml +++ /dev/null @@ -1,18 +0,0 @@ -[[redirects]] - from = "https://bbb.dev/*" - to = "https://bvyerlczpakdlfvybkev.supabase.co/functions/v1/redirect?path=:splat" - status = 301 - force = true - -[[redirects]] - from = "/brain-dump/*" - to = "/" - status = 301 - force = true - -[[redirects]] - from = "/posts/*" - to = "/blog/:splat" - status = 301 - force = true - diff --git a/scripts/gen-themes.mjs b/scripts/gen-themes.mjs new file mode 100644 index 0000000..c22213b --- /dev/null +++ b/scripts/gen-themes.mjs @@ -0,0 +1,399 @@ +/* + Site color, generated. + + Reads real VS Code themes through shiki, resolves each one down to our token + contract, pushes every resolved color away from all three surfaces until it clears + AA, and emits three artifacts that all agree with each other: + + src/styles/themes.css one [data-theme] block per theme, chrome color + src/lib/themes.generated.ts the list the theme picker renders + src/lib/ec-themes.generated.mjs Expressive Code themes built from the same tokens + + Three artifacts rather than one because a hand maintained picker list drifts from the + generator, and because Expressive Code bakes color at build time. If the code blocks + were fed the original VS Code themes instead of the resolved ones, the chrome would + pass AA while the code quietly failed it. + + Decision 34: contrast wins over fidelity. This script exits non zero if any theme + fails, so the guard is enforced rather than promised. + + Run: pnpm themes +*/ + +import { bundledThemes, bundledThemesInfo } from 'shiki'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const OUT_CSS = path.join(ROOT, 'src', 'styles', 'themes.css'); +const OUT_LIST = path.join(ROOT, 'src', 'lib', 'themes.generated.ts'); +const OUT_EC = path.join(ROOT, 'src', 'lib', 'ec-themes.generated.mjs'); + +const TARGET = 4.5; + +const PICK = [ + 'github-dark', 'github-light', 'dracula', 'one-dark-pro', 'night-owl', + 'tokyo-night', 'catppuccin-mocha', 'catppuccin-latte', + 'vitesse-dark', 'vitesse-light', 'solarized-light', 'nord', 'monokai']; + +/* + shiki's own display names are occasionally the marketplace listing rather than the + theme, and the picker shows these to readers. Only override where shiki reads wrong. +*/ +const NAME_OVERRIDES = { + 'dracula': 'Dracula' +}; + +/* ---------- color math ---------- */ + +const hex = (s) => { + if (!s) return null; + let h = s.trim().replace('#', ''); + if (h.length === 3) h = h.split('').map(c => c + c).join(''); + if (h.length === 8) h = h.slice(0, 6); + if (!/^[0-9a-f]{6}$/i.test(h)) return null; + return '#' + h.toLowerCase(); +}; +const rgb = (h) => [1, 3, 5].map(i => parseInt(h.slice(i, i + 2), 16)); +const toHex = ([r, g, b]) => '#' + [r, g, b].map(v => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0')).join(''); +const lum = (h) => { + const [r, g, b] = rgb(h).map(v => { v /= 255; return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; }); + return 0.2126 * r + 0.7152 * g + 0.0722 * b; +}; +const ratio = (a, b) => { const l1 = lum(a), l2 = lum(b); return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05); }; +const mix = (a, b, t) => toHex(rgb(a).map((v, i) => v + (rgb(b)[i] - v) * t)); +// 0 = gray, 1 = fully saturated. Used to reject neutral UI colors as brand accents. +const chroma = (h) => { const c = rgb(h); return (Math.max(...c) - Math.min(...c)) / 255; }; + +// Push `fg` away from the backgrounds it sits on until it clears `target` against all of +// them. The direction is chosen from the mean luminance of every surface, not just the +// page background, because a theme can mix a dark surface with a light one (Hot Dog +// Stand puts black text on both red and yellow). If the preferred direction cannot get +// there, try the other one, and fall back to whichever attempt scored best. +const enforce = (fg, bgs, target) => { + if (!fg) return null; + const list = Array.isArray(bgs) ? bgs.filter(Boolean) : [bgs]; + const ok = (c) => list.every(b => ratio(c, b) >= target); + if (ok(fg)) return fg; + const mean = list.reduce((s, b) => s + lum(b), 0) / list.length; + let best = fg, bestScore = -1; + for (const goal of (mean > 0.45 ? ['#000000', '#ffffff'] : ['#ffffff', '#000000'])) { + for (let t = 0; t <= 1.001; t += 0.02) { + const out = mix(fg, goal, t); + if (ok(out)) return out; + const score = Math.min(...list.map(b => ratio(out, b))); + if (score > bestScore) { bestScore = score; best = out; } + } + } + return best; +}; + +/* ---------- token color lookup ---------- */ + +const scopeColor = (theme, needles) => { + const list = theme.tokenColors || []; + for (const needle of needles) { + for (const rule of list) { + const scopes = Array.isArray(rule.scope) ? rule.scope : (rule.scope ? [rule.scope] : []); + if (scopes.some(s => s === needle || s.startsWith(needle + '.'))) { + const c = hex(rule.settings && rule.settings.foreground); + if (c) return c; + } + } + } + return null; +}; + +const first = (...vals) => vals.find(v => !!v) || null; +// Like first(), but skips near-gray candidates. Dracula and Monokai define +// button.background as a neutral, which makes a lifeless accent. +const firstColorful = (...vals) => vals.find(v => v && chroma(v) >= 0.14) || first(...vals); + +// Hue in degrees, used to keep the four severity colors telling each other apart. +const hue = (h) => { + const [r, g, b] = rgb(h).map(v => v / 255); + const mx = Math.max(r, g, b), mn = Math.min(r, g, b), d = mx - mn; + if (d === 0) return 0; + let deg; + if (mx === r) deg = ((g - b) / d) % 6; + else if (mx === g) deg = (b - r) / d + 2; + else deg = (r - g) / d + 4; + return (deg * 60 + 360) % 360; +}; +const hueGap = (a, b) => { const d = Math.abs(hue(a) - hue(b)); return Math.min(d, 360 - d); }; +// Like firstColorful(), but rejects anything that reads as the same color as `other`. +// Several themes ship no editorWarning.foreground, and the fallback scope lookup lands +// on a red, which would make Warning and Error indistinguishable. +const firstDistinct = (other, minGap, ...vals) => + vals.find(v => v && chroma(v) >= 0.14 && (!other || hueGap(v, other) >= minGap)) || first(...vals); + +/* ---------- resolve one theme to our token contract ---------- */ + +function resolve(theme) { + const c = {}; + for (const [k, v] of Object.entries(theme.colors || {})) c[k] = hex(v); + const dark = theme.type !== 'light'; + + const bg = first(c['editor.background'], dark ? '#1e1e1e' : '#ffffff'); + const rawFg = first(c['editor.foreground'], scopeColor(theme, ['source']), dark ? '#d4d4d4' : '#1f1f1f'); + + const raised = first(c['sideBar.background'], c['editorWidget.background'], c['editorGroupHeader.tabsBackground'], mix(bg, rawFg, 0.05)); + const inset = first(c['input.background'], c['editorWidget.background'], mix(bg, rawFg, 0.09)); + const line = first(c['panel.border'], c['editorGroup.border'], c['input.border'], mix(bg, rawFg, 0.18)); + + // Text can land on any of the three surfaces, so the guard has to clear all three. + // Some themes ship body text below AA against their own background (Solarized is + // 4.13:1). We are committed to AA, so the guard applies to the theme author too. + const S = [bg, raised, inset]; + const fg = enforce(rawFg, S, TARGET); + + const dim = enforce(first(c['descriptionForeground'], c['editorLineNumber.foreground'], mix(fg, bg, 0.4)), S, TARGET); + + const accent = enforce(firstColorful( + c['textLink.foreground'], + scopeColor(theme, ['entity.name.function', 'support.function']), + scopeColor(theme, ['keyword', 'storage.type']), + c['button.background'], c['focusBorder'] + ), S, TARGET); + + // Diagnostic severities. These are the dev disaster scale, so all four must exist + // and, more importantly, must not collapse into each other. + const err = enforce(firstColorful( + c['editorError.foreground'], c['errorForeground'], c['list.errorForeground'], + scopeColor(theme, ['invalid', 'message.error']), dark ? '#f14c4c' : '#cd3131' + ), S, TARGET); + + const warn = enforce(firstDistinct(err, 30, + c['editorWarning.foreground'], c['list.warningForeground'], c['editorWarning.border'], + scopeColor(theme, ['entity.name.type', 'support.type']), dark ? '#cca700' : '#a67100' + ), S, TARGET); + + const info = enforce(firstDistinct(warn, 30, + c['editorInfo.foreground'], c['editorLightBulb.foreground'], + scopeColor(theme, ['entity.name.function', 'support.function']), accent + ), S, TARGET); + + const hint = enforce(first( + c['editorHint.foreground'], c['editorLineNumber.foreground'], + scopeColor(theme, ['comment']), dim + ), S, TARGET); + + const tok = { + key: enforce(scopeColor(theme, ['keyword', 'storage.type']), S, TARGET) || accent, + str: enforce(scopeColor(theme, ['string']), S, TARGET) || fg, + fn: enforce(scopeColor(theme, ['entity.name.function']), S, TARGET) || accent, + typ: enforce(scopeColor(theme, ['entity.name.type', 'support.type']), S, TARGET) || accent, + com: enforce(scopeColor(theme, ['comment']), S, TARGET) || dim, + num: enforce(scopeColor(theme, ['constant.numeric', 'constant']), S, TARGET) || fg + }; + + return { scheme: dark ? 'dark' : 'light', bg, raised, inset, fg, dim, line, accent, err, warn, info, hint, tok }; +} + +const block = (sel, t) => `${sel} { + color-scheme: ${t.scheme}; + --bg: ${t.bg}; + --bg-raised: ${t.raised}; + --bg-inset: ${t.inset}; + --fg: ${t.fg}; + --fg-dim: ${t.dim}; + --line: ${t.line}; + --accent: ${t.accent}; + --sev-error: ${t.err}; + --sev-warn: ${t.warn}; + --sev-info: ${t.info}; + --sev-hint: ${t.hint}; + --tok-key: ${t.tok.key}; + --tok-str: ${t.tok.str}; + --tok-fn: ${t.tok.fn}; + --tok-type: ${t.tok.typ}; + --tok-com: ${t.tok.com}; + --tok-num: ${t.tok.num}; +}`; + +/* ---------- Expressive Code theme, built from the resolved tokens ---------- */ + +// Code blocks sit on --bg-inset, which is what .code does in app.css, so the generated +// theme has to agree or a code block will not match the panel it sits in. +const ecTheme = (id, t) => ({ + name: id, + type: t.scheme, + semanticHighlighting: true, + colors: { + 'editor.background': t.inset, + 'editor.foreground': t.fg, + 'editor.lineHighlightBackground': mix(t.inset, t.fg, 0.06), + 'editorLineNumber.foreground': t.dim, + 'editorLineNumber.activeForeground': t.fg, + 'editorGutter.background': t.inset, + 'editorWidget.background': t.raised, + 'editorWidget.border': t.line, + 'panel.border': t.line, + 'focusBorder': t.accent, + 'editorError.foreground': t.err, + 'editorWarning.foreground': t.warn, + 'editorInfo.foreground': t.info, + 'editorHint.foreground': t.hint, + // Frame chrome. Expressive Code draws a title bar and tabs from these. + 'titleBar.activeBackground': t.raised, + 'titleBar.activeForeground': t.dim, + 'tab.activeBackground': t.inset, + 'tab.activeForeground': t.fg, + 'tab.inactiveBackground': t.raised, + 'tab.inactiveForeground': t.dim, + 'tab.border': t.line, + 'editorGroupHeader.tabsBackground': t.raised, + 'editorGroupHeader.tabsBorder': t.line, + 'terminal.background': t.inset, + 'terminal.foreground': t.fg + }, + tokenColors: [ + { scope: ['comment', 'punctuation.definition.comment'], settings: { foreground: t.tok.com, fontStyle: 'italic' } }, + { scope: ['string', 'string.quoted', 'string.template', 'punctuation.definition.string'], settings: { foreground: t.tok.str } }, + { scope: ['constant.numeric', 'constant.language', 'constant.character', 'constant'], settings: { foreground: t.tok.num } }, + { scope: ['keyword', 'storage', 'storage.type', 'storage.modifier', 'keyword.control', 'keyword.operator.expression', 'variable.language'], settings: { foreground: t.tok.key } }, + { scope: ['entity.name.function', 'support.function', 'meta.function-call.generic', 'entity.name.function.member'], settings: { foreground: t.tok.fn } }, + { scope: ['entity.name.type', 'entity.name.class', 'entity.name.namespace', 'support.type', 'support.class', 'entity.other.inherited-class'], settings: { foreground: t.tok.typ } }, + { scope: ['variable', 'variable.other', 'meta.definition.variable', 'entity.name.variable'], settings: { foreground: t.fg } }, + { scope: ['keyword.operator', 'punctuation'], settings: { foreground: t.dim } }, + { scope: ['entity.name.tag'], settings: { foreground: t.tok.key } }, + { scope: ['entity.other.attribute-name'], settings: { foreground: t.tok.fn } }, + { scope: ['invalid', 'invalid.illegal'], settings: { foreground: t.err } } + ] +}); + +/* ---------- house themes, hand authored ---------- */ + +const house = { + 'bbb-dark': { + label: 'BBB Dark', + scheme: 'dark', + bg: '#15171a', raised: '#1c1f23', inset: '#22262b', + fg: '#e9ebee', dim: '#99a1aa', line: '#2b3037', + accent: '#e9a83c', + err: '#f0655f', warn: '#e8c547', info: '#6fb6ef', hint: '#8a929b', + tok: { key: '#e9a83c', str: '#9bd17f', fn: '#6fb6ef', typ: '#5fc9b6', com: '#7f878f', num: '#f0a58c' } + }, + 'bbb-light': { + label: 'BBB Light', + scheme: 'light', + bg: '#fbfaf8', raised: '#f3f1ed', inset: '#eceae5', + fg: '#1b1a18', dim: '#5f5c57', line: '#ddd9d2', + accent: '#9a6510', + err: '#c0392b', warn: '#8a6300', info: '#1a63c7', hint: '#6b6862', + tok: { key: '#9a6510', str: '#3f6b2f', fn: '#1a63c7', typ: '#0f6f63', com: '#77736c', num: '#a44a2a' } + }, + // Windows 3.1, Control Panel, Color, Hot Dog Stand. Kept honest: yellow page, white + // windows, Win 3.1 silver for insets, and pure #ff0000 on every rule line, which is + // where the theme gets to be as loud as it was in 1992 because borders carry no text. + // Everything that does carry text goes through the same guard as every other theme. + 'hotdog-stand': { + label: 'Hot Dog Stand', + scheme: 'light', + bg: '#ffff00', raised: '#ffffff', inset: '#c0c0c0', + fg: '#000000', dim: '#4a4a4a', line: '#ff0000', + accent: '#cc0000', + err: '#cc0000', warn: '#7a4a00', info: '#0000cc', hint: '#4a4a4a', + tok: { key: '#cc0000', str: '#006600', fn: '#0000cc', typ: '#006666', com: '#4a4a4a', num: '#7a4a00' } + } +}; + +/* ---------- audit ---------- */ + +const audit = (id, t) => { + const surfaces = [t.bg, t.raised, t.inset]; + const worstOn = (col) => Math.min(...surfaces.map(s => ratio(col, s))); + const checks = { + fg: worstOn(t.fg), dim: worstOn(t.dim), accent: worstOn(t.accent), + error: worstOn(t.err), warn: worstOn(t.warn), info: worstOn(t.info), hint: worstOn(t.hint), + 'tok-key': worstOn(t.tok.key), 'tok-str': worstOn(t.tok.str), 'tok-fn': worstOn(t.tok.fn), + 'tok-type': worstOn(t.tok.typ), 'tok-com': worstOn(t.tok.com), 'tok-num': worstOn(t.tok.num) + }; + const worst = Math.min(...Object.values(checks)); + const failed = Object.entries(checks).filter(([, v]) => v < TARGET).map(([k]) => k); + return { id, scheme: t.scheme, worst, failed }; +}; + +/* ---------- run ---------- */ + +const css = ['/* Generated by scripts/gen-themes.mjs. Do not hand edit. */\n']; +const list = []; +const ec = []; +const report = []; + +// House themes go through the identical guard. No special treatment for our own palette. +for (const t of Object.values(house)) { + const S = [t.bg, t.raised, t.inset]; + for (const k of ['fg', 'dim', 'accent', 'err', 'warn', 'info', 'hint']) t[k] = enforce(t[k], S, TARGET); + for (const k of Object.keys(t.tok)) t.tok[k] = enforce(t.tok[k], S, TARGET); +} + +for (const [id, t] of Object.entries(house)) { + css.push(block(`[data-theme="${id}"]`, t)); + list.push({ id, name: t.label, scheme: t.scheme, house: true }); + ec.push(ecTheme(id, t)); + report.push(audit(id, t)); +} + +for (const name of PICK) { + const loader = bundledThemes[name]; + if (!loader) throw new Error(`shiki has no bundled theme named "${name}"`); + const theme = (await loader()).default; + const t = resolve(theme); + const info = bundledThemesInfo.find(i => i.id === name); + + css.push(block(`[data-theme="${name}"]`, t)); + list.push({ + id: name, + name: NAME_OVERRIDES[name] ?? info?.displayName ?? name, + scheme: t.scheme, + house: false + }); + ec.push(ecTheme(name, t)); + report.push(audit(name, t)); +} + +const ts = `// Generated by scripts/gen-themes.mjs. Do not hand edit. +// The picker renders this list. It is generated so it cannot drift from themes.css. + +export interface ThemeEntry { + id: string; + name: string; + scheme: 'dark' | 'light'; + house: boolean; +} + +export const THEMES: ThemeEntry[] = ${JSON.stringify(list, null, 2)}; + +export const DEFAULT_DARK = 'bbb-dark'; +export const DEFAULT_LIGHT = 'bbb-light'; +export const THEME_STORAGE_KEY = 'bbb-theme'; +`; + +fs.mkdirSync(path.dirname(OUT_CSS), { recursive: true }); +fs.mkdirSync(path.dirname(OUT_LIST), { recursive: true }); +fs.writeFileSync(OUT_CSS, css.join('\n\n') + '\n'); +fs.writeFileSync(OUT_LIST, ts); +fs.writeFileSync( + OUT_EC, + '// Generated by scripts/gen-themes.mjs. Do not hand edit.\n' + + '// A module rather than JSON so ec.config.mjs can import it without a resolver that\n' + + '// changes meaning once the config gets bundled.\n\n' + + 'export default ' + + JSON.stringify(ec, null, 2) + + ';\n' +); + +const rel = (p) => path.relative(ROOT, p).replaceAll('\\', '/'); +for (const r of report) { + const status = r.failed.length ? `FAIL ${r.failed.join(',')}` : 'pass'; + console.log(`${r.id.padEnd(20)} ${r.scheme.padEnd(6)} worst ${r.worst.toFixed(2)}:1 ${status}`); +} +console.log(`\n${report.length} themes to ${rel(OUT_CSS)}, ${rel(OUT_LIST)}, ${rel(OUT_EC)}`); + +const broken = report.filter(r => r.failed.length); +if (broken.length) { + console.error(`\n${broken.length} theme(s) below ${TARGET}:1. Decision 34 says contrast wins, so this is a build failure.`); + process.exit(1); +} diff --git a/src/components/Mark.astro b/src/components/Mark.astro new file mode 100644 index 0000000..3d2e286 --- /dev/null +++ b/src/components/Mark.astro @@ -0,0 +1,27 @@ +--- +/* + The brand mark, straight from public/images/icons/bbb.svg. It paints with currentColor + so it inherits whatever the active theme resolved, which is why it is inlined rather + than loaded as an img. +*/ +interface Props { + class?: string; + label?: string; +} + +const { class: className = 'mark', label } = Astro.props; +--- + + + + diff --git a/src/components/Masthead.astro b/src/components/Masthead.astro new file mode 100644 index 0000000..b96229d --- /dev/null +++ b/src/components/Masthead.astro @@ -0,0 +1,45 @@ +--- +import Wordmark from './Wordmark.astro'; +import ThemePicker from './islands/ThemePicker'; +import { VISIBLE_TOPICS } from '../config/site'; + +interface Props { + /** Topic slug, or "dd" for dev disasters. Drives the current nav marker. */ + active?: string; +} + +const { active } = Astro.props; +--- + +
+
+ + + +
+
diff --git a/src/components/SiteFooter.astro b/src/components/SiteFooter.astro new file mode 100644 index 0000000..d901ec1 --- /dev/null +++ b/src/components/SiteFooter.astro @@ -0,0 +1,44 @@ +--- +import Wordmark from './Wordmark.astro'; +import { SITE, EXTERNAL } from '../config/site'; +--- + + diff --git a/src/components/Wordmark.astro b/src/components/Wordmark.astro new file mode 100644 index 0000000..1d02ef7 --- /dev/null +++ b/src/components/Wordmark.astro @@ -0,0 +1,8 @@ +--- +import Mark from './Mark.astro'; +--- + + + + Bald Bearded Builder + diff --git a/src/components/islands/ThemePicker.tsx b/src/components/islands/ThemePicker.tsx new file mode 100644 index 0000000..a5ccbd1 --- /dev/null +++ b/src/components/islands/ThemePicker.tsx @@ -0,0 +1,111 @@ +import { Fragment } from 'preact'; +import { useEffect, useRef, useState, useCallback } from 'preact/hooks'; +import { THEMES, THEME_STORAGE_KEY } from '../../lib/themes.generated'; + +const SWATCH_VARS = ['--bg', '--accent', '--sev-error', '--sev-warn', '--sev-info']; + +/* + The swatch carries its own data-theme, which is what lets a single element preview a + theme the page is not currently using. themes.css scopes every token to [data-theme], + not to :root, so the var() lookups inside resolve against the preview and not the page. +*/ +function Swatch({ id }: { id: string }) { + return ( + + {SWATCH_VARS.map((v) => ( + + ))} + + ); +} + +export default function ThemePicker() { + const [current, setCurrent] = useState(THEMES[0].id); + const [open, setOpen] = useState(false); + const hostRef = useRef(null); + const btnRef = useRef(null); + + // The inline no FOUC script has already picked and applied a theme by the time this + // hydrates, so the island adopts what is on the document rather than deciding again. + useEffect(() => { + const applied = document.documentElement.getAttribute('data-theme'); + if (applied) setCurrent(applied); + }, []); + + const close = useCallback(() => setOpen(false), []); + + useEffect(() => { + if (!open) return; + const onClick = (e: MouseEvent) => { + if (!hostRef.current?.contains(e.target as Node)) close(); + }; + const onKey = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + close(); + btnRef.current?.focus(); + } + }; + document.addEventListener('click', onClick, true); + document.addEventListener('keydown', onKey); + return () => { + document.removeEventListener('click', onClick, true); + document.removeEventListener('keydown', onKey); + }; + }, [open, close]); + + const apply = (id: string) => { + document.documentElement.setAttribute('data-theme', id); + try { + localStorage.setItem(THEME_STORAGE_KEY, id); + } catch { + /* private mode, the choice just does not persist */ + } + setCurrent(id); + close(); + btnRef.current?.focus(); + }; + + const label = THEMES.find((t) => t.id === current)?.name ?? current; + + /* + Disclosure, not a menu. A role="menu" cannot legally contain the Dark and Light + headings the design calls for, and a theme switcher is a set of controls rather than + a set of commands, so aria-expanded on the trigger is the honest pattern. + */ + return ( +
+ + +
+ ); +} diff --git a/src/config/site.ts b/src/config/site.ts new file mode 100644 index 0000000..aea17ef --- /dev/null +++ b/src/config/site.ts @@ -0,0 +1,192 @@ +/* + Site configuration. + + Everything here would otherwise have to live in content frontmatter, which sits in the + michaeljolley/content submodule and is read only from this repo. Anything that needs to + change without a submodule bump belongs in this file. +*/ + +export interface Topic { + /** URL segment. Content lives at /[slug]/[entry]/ */ + slug: string; + /** Nav and chip label. Lowercase on purpose, it is a path segment first. */ + label: string; + /** Longer name for footer columns and page titles. */ + title: string; + /** Deck copy on the topic page. */ + blurb: string; + /** + * Hidden topics keep their URL space reserved but stay out of the nav and the chip + * rail. blazor and mcp start thin, and a topic page with three items on it reads as + * abandoned rather than new. + */ + visible: boolean; +} + +export const TOPICS: Topic[] = [ + { + slug: 'csharp', + label: 'csharp', + title: 'C#', + blurb: + 'The language itself. Pattern matching, nullable reference types, records, and the ' + + 'features people skip because the old way still compiles.', + visible: true + }, + { + slug: 'aspnetcore', + label: 'aspnetcore', + title: 'ASP.NET Core', + blurb: + 'Minimal APIs, middleware, dependency injection, configuration, and the parts of ' + + 'the request pipeline that only bite you in production.', + visible: true + }, + { + slug: 'data', + label: 'data', + title: 'Data and EF Core', + blurb: + 'EF Core, SQL Server, migrations, and the long slow realization that the database ' + + 'was never the slow part.', + visible: true + }, + { + slug: 'copilot', + label: 'copilot', + title: 'Copilot and AI', + blurb: + 'Getting real work out of AI tooling, and being honest about the parts where it ' + + 'still hands you confident nonsense.', + visible: true + }, + { + slug: 'windows', + label: 'windows', + title: 'Windows', + blurb: + 'Building for the desktop people actually use. WinUI, packaging, PowerShell, and ' + + 'the platform quirks nobody documents.', + visible: true + }, + { + slug: 'cloud', + label: 'cloud', + title: 'Cloud', + blurb: + 'Azure, containers, deployment, and the bill that shows up when something you ' + + 'wired at 2am keeps running.', + visible: true + }, + { + slug: 'dev-life', + label: 'dev-life', + title: 'Dev life', + blurb: + 'Everything that is not code. Reviews, postmortems, burnout, teaching, and ' + + 'learning out loud where people can watch you get it wrong.', + visible: true + }, + { + slug: 'blazor', + label: 'blazor', + title: 'Blazor', + blurb: 'Components, render modes, and where the interactivity boundary actually sits.', + visible: false + }, + { + slug: 'mcp', + label: 'mcp', + title: 'MCP', + blurb: 'Model Context Protocol servers, tools, and wiring an agent into real systems.', + visible: false + } +]; + +export const TOPIC_SLUGS = TOPICS.map((t) => t.slug); +export const VISIBLE_TOPICS = TOPICS.filter((t) => t.visible); +export const topicBySlug = (slug: string) => TOPICS.find((t) => t.slug === slug); + +/** + * Top level paths that are not topics. Content is served from /[topic]/[slug]/, so a + * topic slug that collides with one of these would shadow a real page. Enforced by a + * test rather than by remembering. + */ +export const RESERVED_SLUGS = [ + '404', + 'about', + 'blog', + 'builders', + 'conduct', + 'dev-disasters', + 'images', + 'kitchen-sink', + 'privacy', + 'report', + 'rss.xml', + 'search', + 'settings', + 'sitemap-index.xml', + 'submit', + 'terms', + 'uses', + 'videos' +] as const; + +/** + * The four diagnostic severities, which are the ones the editor already draws. They + * replace the rejected SEV-1 through SEV-4 scale, because a developer reading "Warning" + * already knows roughly how bad it was. + */ +export const SEVERITIES = [ + { id: 'error', label: 'Error', blurb: 'Took production down.' }, + { id: 'warning', label: 'Warning', blurb: 'Nearly took production down.' }, + { id: 'info', label: 'Info', blurb: 'Expensive lesson everybody lived through.' }, + { id: 'hint', label: 'Hint', blurb: 'Just embarrassing.' } +] as const; + +export type SeverityId = (typeof SEVERITIES)[number]['id']; + +/** One sort for the whole dev disasters list. Severity filters it, never groups it. */ +export const DISASTER_SORTS = [ + { id: 'liked', label: 'Most liked' }, + { id: 'replies', label: 'Most replies' }, + { id: 'newest', label: 'Newest' } +] as const; + +export const SITE = { + name: 'Bald Bearded Builder', + author: 'Michael Jolley', + tagline: + 'Bringing smiles to the syntax, because laughter is the best error handler.', + url: 'https://baldbeardedbuilder.com', + /** The comment avatar and the host badge key off this handle. */ + hostHandle: 'michaeljolley', + hostBadgeLabel: 'The bald one' +} as const; + +export const EXTERNAL = { + drip: 'https://dotnetdrip.com', + youtube: 'https://youtube.com/@baldbeardedbuilder', + twitch: 'https://twitch.tv/baldbeardedbuilder', + github: 'https://github.com/michaeljolley', + bluesky: 'https://bsky.app/profile/baldbeardedbuilder.com' +} as const; + +/** + * The Start here rail. Hand curated evergreen picks, deliberately not the latest work, + * because the Fresh rail directly below it already shows that and the two would + * duplicate each other. + * + * Entries are `collection:id` so a video and an article can sit side by side. Order is + * the display order. Reorder here, not in the submodule. + * + * TODO: Michael to confirm the final four. These are real entries picked from the + * catalogue so the rail renders against real content until he chooses. + */ +export const START_HERE: string[] = [ + 'blog:stop-parallelizing-everything-a-practical-guide-to-parallelforeach', + 'blog:repository-pattern-vs-dbcontext-in-entity-framework-core', + 'blog:tame-configuration-in-aspnet-core-with-ivalidateoptions', + 'blog:the-traps-of-nullable-in-c-sharp' +]; diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro new file mode 100644 index 0000000..935f863 --- /dev/null +++ b/src/layouts/Base.astro @@ -0,0 +1,101 @@ +--- +import '../styles/themes.css'; +import '../styles/app.css'; + +import Masthead from '../components/Masthead.astro'; +import SiteFooter from '../components/SiteFooter.astro'; +import { SITE } from '../config/site'; +import { THEMES, DEFAULT_DARK, DEFAULT_LIGHT, THEME_STORAGE_KEY } from '../lib/themes.generated'; + +interface Props { + title: string; + description?: string; + /** Topic slug, or "dd" for dev disasters. Drives the current nav marker. */ + active?: string; + image?: string; + noindex?: boolean; + /** Set on pages whose canonical lives elsewhere, for example a syndicated article. */ + canonical?: string; +} + +const { + title, + description = SITE.tagline, + active, + image = '/images/social.png', + noindex = false, + canonical +} = Astro.props; + +const pageTitle = title === SITE.name ? title : `${title} | ${SITE.name}`; +const canonicalUrl = canonical ?? new URL(Astro.url.pathname, Astro.site).href; +const socialImage = new URL(image, Astro.site).href; + +/* + The picker renders client side, so between first paint and hydration the button would + otherwise show whichever theme the server guessed. This map lets the no FOUC script + correct the label and the swatch in the same tick it sets data-theme. It is serialized + from the generated list, so it cannot drift from the picker. +*/ +const themeNames = Object.fromEntries(THEMES.map((t) => [t.id, t.name])); +--- + + + + + + + {pageTitle} + + + {noindex && } + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/ec-themes.generated.mjs b/src/lib/ec-themes.generated.mjs new file mode 100644 index 0000000..fd9584a --- /dev/null +++ b/src/lib/ec-themes.generated.mjs @@ -0,0 +1,2390 @@ +// Generated by scripts/gen-themes.mjs. Do not hand edit. +// A module rather than JSON so ec.config.mjs can import it without a resolver that +// changes meaning once the config gets bundled. + +export default [ + { + "name": "bbb-dark", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#22262b", + "editor.foreground": "#e9ebee", + "editor.lineHighlightBackground": "#2e3237", + "editorLineNumber.foreground": "#99a1aa", + "editorLineNumber.activeForeground": "#e9ebee", + "editorGutter.background": "#22262b", + "editorWidget.background": "#1c1f23", + "editorWidget.border": "#2b3037", + "panel.border": "#2b3037", + "focusBorder": "#e9a83c", + "editorError.foreground": "#f0655f", + "editorWarning.foreground": "#e8c547", + "editorInfo.foreground": "#6fb6ef", + "editorHint.foreground": "#8a929b", + "titleBar.activeBackground": "#1c1f23", + "titleBar.activeForeground": "#99a1aa", + "tab.activeBackground": "#22262b", + "tab.activeForeground": "#e9ebee", + "tab.inactiveBackground": "#1c1f23", + "tab.inactiveForeground": "#99a1aa", + "tab.border": "#2b3037", + "editorGroupHeader.tabsBackground": "#1c1f23", + "editorGroupHeader.tabsBorder": "#2b3037", + "terminal.background": "#22262b", + "terminal.foreground": "#e9ebee" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#878e96", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#9bd17f" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#f0a58c" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#e9a83c" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#6fb6ef" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#5fc9b6" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#e9ebee" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#99a1aa" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#e9a83c" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#6fb6ef" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#f0655f" + } + } + ] + }, + { + "name": "bbb-light", + "type": "light", + "semanticHighlighting": true, + "colors": { + "editor.background": "#eceae5", + "editor.foreground": "#1b1a18", + "editor.lineHighlightBackground": "#dfded9", + "editorLineNumber.foreground": "#5f5c57", + "editorLineNumber.activeForeground": "#1b1a18", + "editorGutter.background": "#eceae5", + "editorWidget.background": "#f3f1ed", + "editorWidget.border": "#ddd9d2", + "panel.border": "#ddd9d2", + "focusBorder": "#915f0f", + "editorError.foreground": "#c0392b", + "editorWarning.foreground": "#8a6300", + "editorInfo.foreground": "#1a63c7", + "editorHint.foreground": "#6b6862", + "titleBar.activeBackground": "#f3f1ed", + "titleBar.activeForeground": "#5f5c57", + "tab.activeBackground": "#eceae5", + "tab.activeForeground": "#1b1a18", + "tab.inactiveBackground": "#f3f1ed", + "tab.inactiveForeground": "#5f5c57", + "tab.border": "#ddd9d2", + "editorGroupHeader.tabsBackground": "#f3f1ed", + "editorGroupHeader.tabsBorder": "#ddd9d2", + "terminal.background": "#eceae5", + "terminal.foreground": "#1b1a18" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#6b6861", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#3f6b2f" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#a44a2a" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#915f0f" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#1a63c7" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#0f6f63" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#1b1a18" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#5f5c57" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#915f0f" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#1a63c7" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#c0392b" + } + } + ] + }, + { + "name": "hotdog-stand", + "type": "light", + "semanticHighlighting": true, + "colors": { + "editor.background": "#c0c0c0", + "editor.foreground": "#000000", + "editor.lineHighlightBackground": "#b4b4b4", + "editorLineNumber.foreground": "#4a4a4a", + "editorLineNumber.activeForeground": "#000000", + "editorGutter.background": "#c0c0c0", + "editorWidget.background": "#ffffff", + "editorWidget.border": "#ff0000", + "panel.border": "#ff0000", + "focusBorder": "#a30000", + "editorError.foreground": "#a30000", + "editorWarning.foreground": "#704400", + "editorInfo.foreground": "#0000cc", + "editorHint.foreground": "#4a4a4a", + "titleBar.activeBackground": "#ffffff", + "titleBar.activeForeground": "#4a4a4a", + "tab.activeBackground": "#c0c0c0", + "tab.activeForeground": "#000000", + "tab.inactiveBackground": "#ffffff", + "tab.inactiveForeground": "#4a4a4a", + "tab.border": "#ff0000", + "editorGroupHeader.tabsBackground": "#ffffff", + "editorGroupHeader.tabsBorder": "#ff0000", + "terminal.background": "#c0c0c0", + "terminal.foreground": "#000000" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#4a4a4a", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#005c00" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#704400" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#a30000" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#0000cc" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#005858" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#000000" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#4a4a4a" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#a30000" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#0000cc" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#a30000" + } + } + ] + }, + { + "name": "github-dark", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#2f363d", + "editor.foreground": "#e1e4e8", + "editor.lineHighlightBackground": "#3a4047", + "editorLineNumber.foreground": "#979fa7", + "editorLineNumber.activeForeground": "#e1e4e8", + "editorGutter.background": "#2f363d", + "editorWidget.background": "#1f2428", + "editorWidget.border": "#1b1f23", + "panel.border": "#1b1f23", + "focusBorder": "#79b8ff", + "editorError.foreground": "#f97583", + "editorWarning.foreground": "#ffea7f", + "editorInfo.foreground": "#79b8ff", + "editorHint.foreground": "#9a9fa4", + "titleBar.activeBackground": "#1f2428", + "titleBar.activeForeground": "#979fa7", + "tab.activeBackground": "#2f363d", + "tab.activeForeground": "#e1e4e8", + "tab.inactiveBackground": "#1f2428", + "tab.inactiveForeground": "#979fa7", + "tab.border": "#1b1f23", + "editorGroupHeader.tabsBackground": "#1f2428", + "editorGroupHeader.tabsBorder": "#1b1f23", + "terminal.background": "#2f363d", + "terminal.foreground": "#e1e4e8" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#9aa0a7", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#9aa0a7" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#79b8ff" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#f97583" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#79b8ff" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#79b8ff" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#e1e4e8" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#979fa7" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#f97583" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#79b8ff" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#f97583" + } + } + ] + }, + { + "name": "github-light", + "type": "light", + "semanticHighlighting": true, + "colors": { + "editor.background": "#fafbfc", + "editor.foreground": "#24292e", + "editor.lineHighlightBackground": "#edeef0", + "editorLineNumber.foreground": "#6a737d", + "editorLineNumber.activeForeground": "#24292e", + "editorGutter.background": "#fafbfc", + "editorWidget.background": "#f6f8fa", + "editorWidget.border": "#e1e4e8", + "panel.border": "#e1e4e8", + "focusBorder": "#0366d6", + "editorError.foreground": "#cb2431", + "editorWarning.foreground": "#8b6e0b", + "editorInfo.foreground": "#0366d6", + "editorHint.foreground": "#1b1f23", + "titleBar.activeBackground": "#f6f8fa", + "titleBar.activeForeground": "#6a737d", + "tab.activeBackground": "#fafbfc", + "tab.activeForeground": "#24292e", + "tab.inactiveBackground": "#f6f8fa", + "tab.inactiveForeground": "#6a737d", + "tab.border": "#e1e4e8", + "editorGroupHeader.tabsBackground": "#f6f8fa", + "editorGroupHeader.tabsBorder": "#e1e4e8", + "terminal.background": "#fafbfc", + "terminal.foreground": "#24292e" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#6a737d", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#6a737d" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#005cc5" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#ce3846" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#0366d6" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#0366d6" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#24292e" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#6a737d" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#ce3846" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#0366d6" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#cb2431" + } + } + ] + }, + { + "name": "dracula", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#282a36", + "editor.foreground": "#f8f8f2", + "editor.lineHighlightBackground": "#343641", + "editorLineNumber.foreground": "#8591b8", + "editorLineNumber.activeForeground": "#f8f8f2", + "editorGutter.background": "#282a36", + "editorWidget.background": "#21222c", + "editorWidget.border": "#bd93f9", + "panel.border": "#bd93f9", + "focusBorder": "#50fa7b", + "editorError.foreground": "#ff5555", + "editorWarning.foreground": "#8be9fd", + "editorInfo.foreground": "#50fa7b", + "editorHint.foreground": "#8591b8", + "titleBar.activeBackground": "#21222c", + "titleBar.activeForeground": "#8591b8", + "tab.activeBackground": "#282a36", + "tab.activeForeground": "#f8f8f2", + "tab.inactiveBackground": "#21222c", + "tab.inactiveForeground": "#8591b8", + "tab.border": "#bd93f9", + "editorGroupHeader.tabsBackground": "#21222c", + "editorGroupHeader.tabsBorder": "#bd93f9", + "terminal.background": "#282a36", + "terminal.foreground": "#f8f8f2" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#8591b8", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#ff79c6" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#bd93f9" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#bd93f9" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#50fa7b" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#8be9fd" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#f8f8f2" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#8591b8" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#bd93f9" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#50fa7b" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#ff5555" + } + } + ] + }, + { + "name": "one-dark-pro", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#1d1f23", + "editor.foreground": "#abb2bf", + "editor.lineHighlightBackground": "#26282c", + "editorLineNumber.foreground": "#abb2bf", + "editorLineNumber.activeForeground": "#abb2bf", + "editorGutter.background": "#1d1f23", + "editorWidget.background": "#21252b", + "editorWidget.border": "#3e4452", + "panel.border": "#3e4452", + "focusBorder": "#61afef", + "editorError.foreground": "#d47974", + "editorWarning.foreground": "#e5c07b", + "editorInfo.foreground": "#61afef", + "editorHint.foreground": "#8e939e", + "titleBar.activeBackground": "#21252b", + "titleBar.activeForeground": "#abb2bf", + "tab.activeBackground": "#1d1f23", + "tab.activeForeground": "#abb2bf", + "tab.inactiveBackground": "#21252b", + "tab.inactiveForeground": "#abb2bf", + "tab.border": "#3e4452", + "editorGroupHeader.tabsBackground": "#21252b", + "editorGroupHeader.tabsBorder": "#3e4452", + "terminal.background": "#1d1f23", + "terminal.foreground": "#abb2bf" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#abb2bf", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#98c379" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#d19a66" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#c678dd" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#61afef" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#e5c07b" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#abb2bf" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#abb2bf" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#c678dd" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#61afef" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#d47974" + } + } + ] + }, + { + "name": "night-owl", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#0b253a", + "editor.foreground": "#d6deeb", + "editor.lineHighlightBackground": "#173045", + "editorLineNumber.foreground": "#7a8c9c", + "editorLineNumber.activeForeground": "#d6deeb", + "editorGutter.background": "#0b253a", + "editorWidget.background": "#011627", + "editorWidget.border": "#5f7e97", + "panel.border": "#5f7e97", + "focusBorder": "#c792ea", + "editorError.foreground": "#ef5654", + "editorWarning.foreground": "#b39554", + "editorInfo.foreground": "#c792ea", + "editorHint.foreground": "#7a8c9c", + "titleBar.activeBackground": "#011627", + "titleBar.activeForeground": "#7a8c9c", + "tab.activeBackground": "#0b253a", + "tab.activeForeground": "#d6deeb", + "tab.inactiveBackground": "#011627", + "tab.inactiveForeground": "#7a8c9c", + "tab.border": "#5f7e97", + "editorGroupHeader.tabsBackground": "#011627", + "editorGroupHeader.tabsBorder": "#5f7e97", + "terminal.background": "#0b253a", + "terminal.foreground": "#d6deeb" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#7c8d8d", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#ecc48d" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#f78c6c" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#c792ea" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#c792ea" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#ffcb8b" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#d6deeb" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#7a8c9c" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#c792ea" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#c792ea" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#ef5654" + } + } + ] + }, + { + "name": "tokyo-night", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#14141b", + "editor.foreground": "#a9b1d6", + "editor.lineHighlightBackground": "#1d1d26", + "editorLineNumber.foreground": "#828598", + "editorLineNumber.activeForeground": "#a9b1d6", + "editorGutter.background": "#14141b", + "editorWidget.background": "#16161e", + "editorWidget.border": "#101014", + "panel.border": "#101014", + "focusBorder": "#6485bc", + "editorError.foreground": "#dd5656", + "editorWarning.foreground": "#e0af68", + "editorInfo.foreground": "#0da0ba", + "editorHint.foreground": "#0da0ba", + "titleBar.activeBackground": "#16161e", + "titleBar.activeForeground": "#828598", + "tab.activeBackground": "#14141b", + "tab.activeForeground": "#a9b1d6", + "tab.inactiveBackground": "#16161e", + "tab.inactiveForeground": "#828598", + "tab.border": "#101014", + "editorGroupHeader.tabsBackground": "#16161e", + "editorGroupHeader.tabsBorder": "#101014", + "terminal.background": "#14141b", + "terminal.foreground": "#a9b1d6" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#7e849f", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#7e849f" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#ff9e64" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#7b82a3" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#0db9d7" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#73daca" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#a9b1d6" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#828598" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#7b82a3" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#0db9d7" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#dd5656" + } + } + ] + }, + { + "name": "catppuccin-mocha", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#313244", + "editor.foreground": "#cdd6f4", + "editor.lineHighlightBackground": "#3a3c4f", + "editorLineNumber.foreground": "#cdd6f4", + "editorLineNumber.activeForeground": "#cdd6f4", + "editorGutter.background": "#313244", + "editorWidget.background": "#181825", + "editorWidget.border": "#585b70", + "panel.border": "#585b70", + "focusBorder": "#89b4fa", + "editorError.foreground": "#f38ba8", + "editorWarning.foreground": "#fab387", + "editorInfo.foreground": "#89b4fa", + "editorHint.foreground": "#969aae", + "titleBar.activeBackground": "#181825", + "titleBar.activeForeground": "#cdd6f4", + "tab.activeBackground": "#313244", + "tab.activeForeground": "#cdd6f4", + "tab.inactiveBackground": "#181825", + "tab.inactiveForeground": "#cdd6f4", + "tab.border": "#585b70", + "editorGroupHeader.tabsBackground": "#181825", + "editorGroupHeader.tabsBorder": "#585b70", + "terminal.background": "#313244", + "terminal.foreground": "#cdd6f4" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#959bb4", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#a6e3a1" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#fab387" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#fab387" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#89b4fa" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#f9e2af" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#cdd6f4" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#cdd6f4" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#fab387" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#89b4fa" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#f38ba8" + } + } + ] + }, + { + "name": "catppuccin-latte", + "type": "light", + "semanticHighlighting": true, + "colors": { + "editor.background": "#ccd0da", + "editor.foreground": "#4c4f69", + "editor.lineHighlightBackground": "#c4c8d3", + "editorLineNumber.foreground": "#4c4f69", + "editorLineNumber.activeForeground": "#4c4f69", + "editorGutter.background": "#ccd0da", + "editorWidget.background": "#e6e9ef", + "editorWidget.border": "#acb0be", + "panel.border": "#acb0be", + "focusBorder": "#1750bf", + "editorError.foreground": "#b00d30", + "editorWarning.foreground": "#983c07", + "editorInfo.foreground": "#1750bf", + "editorHint.foreground": "#575964", + "titleBar.activeBackground": "#e6e9ef", + "titleBar.activeForeground": "#4c4f69", + "tab.activeBackground": "#ccd0da", + "tab.activeForeground": "#4c4f69", + "tab.inactiveBackground": "#e6e9ef", + "tab.inactiveForeground": "#4c4f69", + "tab.border": "#acb0be", + "editorGroupHeader.tabsBackground": "#e6e9ef", + "editorGroupHeader.tabsBorder": "#acb0be", + "terminal.background": "#ccd0da", + "terminal.foreground": "#4c4f69" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#545664", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#29661c" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#983c07" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#983c07" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#1750bf" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#784d10" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#4c4f69" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#4c4f69" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#983c07" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#1750bf" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#b00d30" + } + } + ] + }, + { + "name": "vitesse-dark", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#181818", + "editor.foreground": "#dbd7ca", + "editor.lineHighlightBackground": "#242323", + "editorLineNumber.foreground": "#dedcd5", + "editorLineNumber.activeForeground": "#dbd7ca", + "editorGutter.background": "#181818", + "editorWidget.background": "#121212", + "editorWidget.border": "#191919", + "panel.border": "#191919", + "focusBorder": "#4d9375", + "editorError.foreground": "#cb7676", + "editorWarning.foreground": "#5da994", + "editorInfo.foreground": "#6394bf", + "editorHint.foreground": "#4d9375", + "titleBar.activeBackground": "#121212", + "titleBar.activeForeground": "#dedcd5", + "tab.activeBackground": "#181818", + "tab.activeForeground": "#dbd7ca", + "tab.inactiveBackground": "#121212", + "tab.inactiveForeground": "#dedcd5", + "tab.border": "#191919", + "editorGroupHeader.tabsBackground": "#121212", + "editorGroupHeader.tabsBorder": "#191919", + "terminal.background": "#181818", + "terminal.foreground": "#dbd7ca" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#758575", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#758575" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#4c9a91" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#828282" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#80a665" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#5da994" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#dbd7ca" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#dedcd5" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#828282" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#80a665" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#cb7676" + } + } + ] + }, + { + "name": "vitesse-light", + "type": "light", + "semanticHighlighting": true, + "colors": { + "editor.background": "#f7f7f7", + "editor.foreground": "#393a34", + "editor.lineHighlightBackground": "#ececeb", + "editorLineNumber.foreground": "#393a34", + "editorLineNumber.activeForeground": "#393a34", + "editorGutter.background": "#f7f7f7", + "editorWidget.background": "#ffffff", + "editorWidget.border": "#f0f0f0", + "panel.border": "#f0f0f0", + "focusBorder": "#1c6b48", + "editorError.foreground": "#ab5959", + "editorWarning.foreground": "#287e72", + "editorInfo.foreground": "#296aa3", + "editorHint.foreground": "#1e754f", + "titleBar.activeBackground": "#ffffff", + "titleBar.activeForeground": "#393a34", + "tab.activeBackground": "#f7f7f7", + "tab.activeForeground": "#393a34", + "tab.inactiveBackground": "#ffffff", + "tab.inactiveForeground": "#393a34", + "tab.border": "#f0f0f0", + "editorGroupHeader.tabsBackground": "#ffffff", + "editorGroupHeader.tabsBorder": "#f0f0f0", + "terminal.background": "#f7f7f7", + "terminal.foreground": "#393a34" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#6a726a", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#6a726a" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#2f798a" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#717171" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#527c35" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#287e72" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#393a34" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#393a34" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#717171" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#527c35" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#ab5959" + } + } + ] + }, + { + "name": "solarized-light", + "type": "light", + "semanticHighlighting": true, + "colors": { + "editor.background": "#ddd6c1", + "editor.foreground": "#4f6066", + "editor.lineHighlightBackground": "#d4cfbc", + "editorLineNumber.foreground": "#595e5b", + "editorLineNumber.activeForeground": "#4f6066", + "editorGutter.background": "#ddd6c1", + "editorWidget.background": "#eee8d5", + "editorWidget.border": "#ddd6c1", + "panel.border": "#ddd6c1", + "focusBorder": "#1b6193", + "editorError.foreground": "#b02826", + "editorWarning.foreground": "#7b5400", + "editorInfo.foreground": "#1b6193", + "editorHint.foreground": "#555d5d", + "titleBar.activeBackground": "#eee8d5", + "titleBar.activeForeground": "#595e5b", + "tab.activeBackground": "#ddd6c1", + "tab.activeForeground": "#4f6066", + "tab.inactiveBackground": "#eee8d5", + "tab.inactiveForeground": "#595e5b", + "tab.border": "#ddd6c1", + "editorGroupHeader.tabsBackground": "#eee8d5", + "editorGroupHeader.tabsBorder": "#ddd6c1", + "terminal.background": "#ddd6c1", + "terminal.foreground": "#4f6066" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#555d5d", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#1b6761" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#a52a65" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#556200" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#1b6193" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#a23c12" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#4f6066" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#595e5b" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#556200" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#1b6193" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#b02826" + } + } + ] + }, + { + "name": "nord", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#3b4252", + "editor.foreground": "#d8dee9", + "editor.lineHighlightBackground": "#444b5b", + "editorLineNumber.foreground": "#d8dee9", + "editorLineNumber.activeForeground": "#d8dee9", + "editorGutter.background": "#3b4252", + "editorWidget.background": "#2e3440", + "editorWidget.border": "#3b4252", + "panel.border": "#3b4252", + "focusBorder": "#88c0d0", + "editorError.foreground": "#d9a0a6", + "editorWarning.foreground": "#ebcb8b", + "editorInfo.foreground": "#88c0d0", + "editorHint.foreground": "#ebcb8b", + "titleBar.activeBackground": "#2e3440", + "titleBar.activeForeground": "#d8dee9", + "tab.activeBackground": "#3b4252", + "tab.activeForeground": "#d8dee9", + "tab.inactiveBackground": "#2e3440", + "tab.inactiveForeground": "#d8dee9", + "tab.border": "#3b4252", + "editorGroupHeader.tabsBackground": "#2e3440", + "editorGroupHeader.tabsBorder": "#3b4252", + "terminal.background": "#3b4252", + "terminal.foreground": "#d8dee9" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#a7aebc", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#a3be8c" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#c3a5bd" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#98b2cc" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#88c0d0" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#8fbcbb" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#d8dee9" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#d8dee9" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#98b2cc" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#88c0d0" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#d9a0a6" + } + } + ] + }, + { + "name": "monokai", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "editor.background": "#414339", + "editor.foreground": "#f8f8f2", + "editor.lineHighlightBackground": "#4c4e44", + "editorLineNumber.foreground": "#afafab", + "editorLineNumber.activeForeground": "#f8f8f2", + "editorGutter.background": "#414339", + "editorWidget.background": "#1e1f1c", + "editorWidget.border": "#414339", + "panel.border": "#414339", + "focusBorder": "#a6e22e", + "editorError.foreground": "#f89191", + "editorWarning.foreground": "#ceab0a", + "editorInfo.foreground": "#a6e22e", + "editorHint.foreground": "#afafab", + "titleBar.activeBackground": "#1e1f1c", + "titleBar.activeForeground": "#afafab", + "tab.activeBackground": "#414339", + "tab.activeForeground": "#f8f8f2", + "tab.inactiveBackground": "#1e1f1c", + "tab.inactiveForeground": "#afafab", + "tab.border": "#414339", + "editorGroupHeader.tabsBackground": "#1e1f1c", + "editorGroupHeader.tabsBorder": "#414339", + "terminal.background": "#414339", + "terminal.foreground": "#f8f8f2" + }, + "tokenColors": [ + { + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#b0aea0", + "fontStyle": "italic" + } + }, + { + "scope": [ + "string", + "string.quoted", + "string.template", + "punctuation.definition.string" + ], + "settings": { + "foreground": "#e6db74" + } + }, + { + "scope": [ + "constant.numeric", + "constant.language", + "constant.character", + "constant" + ], + "settings": { + "foreground": "#c09dff" + } + }, + { + "scope": [ + "keyword", + "storage", + "storage.type", + "storage.modifier", + "keyword.control", + "keyword.operator.expression", + "variable.language" + ], + "settings": { + "foreground": "#fc8ab3" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call.generic", + "entity.name.function.member" + ], + "settings": { + "foreground": "#a6e22e" + } + }, + { + "scope": [ + "entity.name.type", + "entity.name.class", + "entity.name.namespace", + "support.type", + "support.class", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#a6e22e" + } + }, + { + "scope": [ + "variable", + "variable.other", + "meta.definition.variable", + "entity.name.variable" + ], + "settings": { + "foreground": "#f8f8f2" + } + }, + { + "scope": [ + "keyword.operator", + "punctuation" + ], + "settings": { + "foreground": "#afafab" + } + }, + { + "scope": [ + "entity.name.tag" + ], + "settings": { + "foreground": "#fc8ab3" + } + }, + { + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "#a6e22e" + } + }, + { + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#f89191" + } + } + ] + } +]; diff --git a/src/lib/themes.generated.ts b/src/lib/themes.generated.ts new file mode 100644 index 0000000..5ffc96e --- /dev/null +++ b/src/lib/themes.generated.ts @@ -0,0 +1,112 @@ +// Generated by scripts/gen-themes.mjs. Do not hand edit. +// The picker renders this list. It is generated so it cannot drift from themes.css. + +export interface ThemeEntry { + id: string; + name: string; + scheme: 'dark' | 'light'; + house: boolean; +} + +export const THEMES: ThemeEntry[] = [ + { + "id": "bbb-dark", + "name": "BBB Dark", + "scheme": "dark", + "house": true + }, + { + "id": "bbb-light", + "name": "BBB Light", + "scheme": "light", + "house": true + }, + { + "id": "hotdog-stand", + "name": "Hot Dog Stand", + "scheme": "light", + "house": true + }, + { + "id": "github-dark", + "name": "GitHub Dark", + "scheme": "dark", + "house": false + }, + { + "id": "github-light", + "name": "GitHub Light", + "scheme": "light", + "house": false + }, + { + "id": "dracula", + "name": "Dracula", + "scheme": "dark", + "house": false + }, + { + "id": "one-dark-pro", + "name": "One Dark Pro", + "scheme": "dark", + "house": false + }, + { + "id": "night-owl", + "name": "Night Owl", + "scheme": "dark", + "house": false + }, + { + "id": "tokyo-night", + "name": "Tokyo Night", + "scheme": "dark", + "house": false + }, + { + "id": "catppuccin-mocha", + "name": "Catppuccin Mocha", + "scheme": "dark", + "house": false + }, + { + "id": "catppuccin-latte", + "name": "Catppuccin Latte", + "scheme": "light", + "house": false + }, + { + "id": "vitesse-dark", + "name": "Vitesse Dark", + "scheme": "dark", + "house": false + }, + { + "id": "vitesse-light", + "name": "Vitesse Light", + "scheme": "light", + "house": false + }, + { + "id": "solarized-light", + "name": "Solarized Light", + "scheme": "light", + "house": false + }, + { + "id": "nord", + "name": "Nord", + "scheme": "dark", + "house": false + }, + { + "id": "monokai", + "name": "Monokai", + "scheme": "dark", + "house": false + } +]; + +export const DEFAULT_DARK = 'bbb-dark'; +export const DEFAULT_LIGHT = 'bbb-light'; +export const THEME_STORAGE_KEY = 'bbb-theme'; diff --git a/src/pages/kitchen-sink.astro b/src/pages/kitchen-sink.astro new file mode 100644 index 0000000..a64ed59 --- /dev/null +++ b/src/pages/kitchen-sink.astro @@ -0,0 +1,103 @@ +--- +/* + Design system proof page. It exists so every primitive in app.css can be checked under + all sixteen themes, at 390px and at desktop, with axe pointed at it. Not linked from + anywhere and kept out of the index, but built on purpose so CI can assert against it. +*/ +import Base from '../layouts/Base.astro'; +import { Code } from 'astro-expressive-code/components'; +import { THEMES } from '../lib/themes.generated'; +import { SEVERITIES } from '../config/site'; + +const sample = `public sealed record Disaster(string Slug, Severity Severity) +{ + public static Disaster Parse(string raw) + { + ArgumentException.ThrowIfNullOrWhiteSpace(raw); + var parts = raw.Split(':', 2); + return new Disaster(parts[0], Enum.Parse(parts[1], true)); + } +}`; +--- + + +
+
+
+

Design system

+

Kitchen / sink

+

+ Every primitive in one place, so a theme that breaks one of them breaks + visibly instead of quietly. +

+
+ +

Severities

+
+ { + SEVERITIES.map((s) => ( + {s.label} + )) + } +
+ +

Squiggle

+
+

+ The migration that dropped the wrong table +

+
+ +

Buttons

+

+ Primary action + Secondary action +

+ +

Chips

+ + +

Prose and code

+
+

+ Body copy sets in Atkinson Hyperlegible Next. Inline var(--tok-key) + should read against the inset surface, and the fenced block below is rendered by + Expressive Code using the same resolved tokens. +

+

A second level heading

+
+ A pull quote, which is the only place the display face shows up inside prose. +
+ +
+

Callout

+
+ What I would do now +

Take the backup first. Then take a second one.

+
+ +

Rows

+
+ + +
+ +

Themes in this build

+
    + {THEMES.map((t) =>
  • {t.name} {t.id} ({t.scheme})
  • )} +
+
+
+ diff --git a/src/scripts/twitch.ts b/src/scripts/twitch.ts index cff2bac..fdf48bd 100644 --- a/src/scripts/twitch.ts +++ b/src/scripts/twitch.ts @@ -46,17 +46,21 @@ export async function getLastStream(): Promise<{ ); const vidBody = await vidResponse.text(); const { data: videos } = JSON.parse(vidBody); + const latest = Array.isArray(videos) && videos.length > 0 ? videos[0] : null; - let lastThumbnail = - videos && videos.length > 0 ? videos[0].thumbnail_url : ""; + // Every one of these guards existed except the URL, which meant an empty or errored + // Twitch response took the whole site build down rather than just hiding one panel. + let lastThumbnail = latest ? latest.thumbnail_url : ""; lastThumbnail = lastThumbnail .replace("%{width}", "960") .replace("%{height}", "540"); - const lastStreamUrl = `https://www.twitch.tv/videos/${videos[0].id}`; - const lastStreamTitle = videos && videos.length > 0 ? videos[0].title : ""; - const lastStreamDuration = videos && videos.length > 0 ? videos[0].duration : ""; - const lastStreamDate = videos && videos.length > 0 ? videos[0].created_at : ""; + const lastStreamUrl = latest + ? `https://www.twitch.tv/videos/${latest.id}` + : "https://www.twitch.tv/baldbeardedbuilder"; + const lastStreamTitle = latest ? latest.title : ""; + const lastStreamDuration = latest ? latest.duration : ""; + const lastStreamDate = latest ? latest.created_at : ""; return { lastStreamUrl, diff --git a/src/styles/app.css b/src/styles/app.css new file mode 100644 index 0000000..05e5b33 --- /dev/null +++ b/src/styles/app.css @@ -0,0 +1,981 @@ +/* ========================================================================== + Bald Bearded Builder + Color lives entirely in themes.css and is user controlled. + Identity therefore lives here: type, structure, rhythm, and one squiggle. + ========================================================================== */ + +*, *::before, *::after { box-sizing: border-box; } + +:root { + --display: "Fraunces", Georgia, serif; + --body: "Atkinson Hyperlegible Next", system-ui, sans-serif; + --mono: "Fira Code", ui-monospace, monospace; + + --shell: 78rem; + --gutter: 11rem; + --measure: 40rem; + + --r: 4px; +} + +html { -webkit-text-size-adjust: 100%; } + +body { + margin: 0; + background: var(--bg); + color: var(--fg); + font-family: var(--body); + font-size: 1.0625rem; + line-height: 1.62; + font-synthesis-weight: none; +} + +body, .card, .prow, .chip, .btn, .swatch i { + transition: background-color .18s ease, color .18s ease, border-color .18s ease; +} + +img { max-width: 100%; display: block; } + +a { color: var(--accent); text-underline-offset: 3px; } + +:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 2px; } + +/* padding-inline, never the padding shorthand. Several blocks are both .shell and a + layout class (.front.shell, .below.shell), and a later shorthand here would silently + zero out their vertical padding. */ +.shell { max-width: var(--shell); margin: 0 auto; padding-inline: 2rem; } + +h1, h2, h3, h4 { + font-family: var(--display); + font-weight: 700; + font-variation-settings: "SOFT" 28, "WONK" 1; + line-height: 1.06; + letter-spacing: -.018em; + margin: 0; + text-wrap: balance; +} + +.skip { + position: absolute; left: -9999px; + background: var(--bg-raised); color: var(--fg); + padding: .75rem 1rem; border: 1px solid var(--line); border-radius: var(--r); +} +.skip:focus { left: 1rem; top: 1rem; z-index: 100; } + +/* ---------- shared bits ---------- */ + +.path { + font-family: var(--mono); + font-size: .75rem; + color: var(--fg-dim); + letter-spacing: .02em; +} +.path b { color: var(--fg); font-weight: 500; } +.path .sep { opacity: .45; padding: 0 .1rem; } + +.sev { + display: inline-flex; + align-items: center; + gap: .45rem; + font-family: var(--mono); + font-size: .75rem; + font-weight: 500; + letter-spacing: .04em; + white-space: nowrap; +} +.sev::before { + content: ""; + width: .5rem; height: .5rem; + border-radius: 50%; + background: currentColor; + flex: none; +} +.sev-error { color: var(--sev-error); } +.sev-warn { color: var(--sev-warn); } +.sev-info { color: var(--sev-info); } +.sev-hint { color: var(--sev-hint); } + +/* The signature. A real diagnostic squiggle, in the severity's own color. */ +.squiggle { + text-decoration-line: underline; + text-decoration-style: wavy; + text-decoration-color: currentColor; + text-decoration-thickness: 2px; + text-underline-offset: .16em; + text-decoration-skip-ink: none; +} + +.btn { + display: inline-flex; + align-items: center; + gap: .5rem; + font-family: var(--mono); + font-size: .8125rem; + padding: .6rem 1rem; + border: 1px solid var(--line); + border-radius: var(--r); + background: transparent; + color: var(--fg); + text-decoration: none; + cursor: pointer; + line-height: 1; +} +.btn:hover { border-color: var(--accent); color: var(--accent); } +.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--bg); font-weight: 600; } +.btn.primary:hover { filter: brightness(1.1); color: var(--bg); } + +.eyebrow { + font-family: var(--mono); + font-size: .6875rem; + letter-spacing: .16em; + text-transform: uppercase; + color: var(--fg-dim); + margin: 0; +} + +.lede { color: var(--fg-dim); font-size: 1.125rem; margin: 0; max-width: 38rem; } + +/* ---------- masthead ---------- */ + +.masthead { + position: sticky; top: 0; z-index: 40; + background: color-mix(in srgb, var(--bg) 88%, transparent); + backdrop-filter: blur(10px); + border-bottom: 1px solid var(--line); +} +.masthead .shell { + display: flex; align-items: center; gap: 1.75rem; + height: 3.75rem; +} +.wordmark { + display: inline-flex; align-items: center; gap: .55rem; + font-family: var(--display); + font-weight: 800; + font-variation-settings: "SOFT" 40, "WONK" 1; + font-size: 1.0625rem; + letter-spacing: -.02em; + text-decoration: none; + color: var(--fg); + white-space: nowrap; +} +.wordmark em { font-style: normal; color: var(--accent); } +.mark { width: 1.9rem; height: 1.9rem; flex: none; color: var(--accent); display: block; } +.wordmark:hover .mark { color: var(--fg); } +.foot .wordmark { font-size: 1.25rem; gap: .7rem; } +.foot .mark { width: 2.4rem; height: 2.4rem; } + +.nav { display: flex; gap: 1.15rem; list-style: none; margin: 0; padding: 0; margin-left: auto; } +.nav a { + font-family: var(--mono); + font-size: .8125rem; + color: var(--fg-dim); + text-decoration: none; + padding: .3rem 0; + border-bottom: 1.5px solid transparent; +} +.nav a:hover { color: var(--fg); } +.nav a.on { color: var(--fg); border-bottom-color: var(--accent); } +.nav a.dd { color: var(--sev-error); } + +/* ---------- theme picker ---------- */ + +.themer { position: relative; } +/* The picker cannot work without script, and a control that does nothing is worse than + no control at all. The no FOUC script sets html.js in the head, so this never flashes. */ +html:not(.js) .themer { display: none; } +.themer-btn { + display: inline-flex; align-items: center; gap: .5rem; + font-family: var(--mono); font-size: .75rem; + padding: .45rem .7rem; + border: 1px solid var(--line); border-radius: var(--r); + background: var(--bg-raised); color: var(--fg-dim); + cursor: pointer; +} +.themer-btn:hover { color: var(--fg); border-color: var(--accent); } +.themer-btn .caret { opacity: .6; font-size: .6rem; } + +.swatch { display: inline-flex; border-radius: 2px; overflow: hidden; border: 1px solid var(--line); flex: none; } +.swatch i { display: block; width: .55rem; height: .9rem; } + +/* The only place in this file that is not a var(). A drop shadow needs a color that is + darker than every surface, and no token guarantees that, so it derives one from the + page background instead of hardcoding black. Under Hot Dog Stand that lands as a + yellow shadow, which is correct. */ +.themer-menu { position: absolute; right: 0; top: calc(100% + .5rem); + width: 20rem; max-height: calc(100vh - 5.5rem); overflow-y: auto; + background: var(--bg-raised); + border: 1px solid var(--line); border-radius: var(--r); + padding: .4rem; + box-shadow: 0 12px 32px color-mix(in srgb, var(--bg) 72%, transparent); +} +.themer-menu[hidden] { display: none; } +.themer-menu h4 { + font-family: var(--mono); font-size: .625rem; font-weight: 500; + letter-spacing: .16em; text-transform: uppercase; + color: var(--fg-dim); padding: .6rem .6rem .35rem; margin: 0; +} +.themer-menu button { + display: flex; align-items: center; gap: .65rem; width: 100%; + background: none; border: 0; border-radius: 3px; + padding: .45rem .6rem; cursor: pointer; + font-family: var(--mono); font-size: .8125rem; + color: var(--fg-dim); text-align: left; +} +.themer-menu button:hover { background: var(--bg-inset); color: var(--fg); } +.themer-menu button[aria-current="true"] { color: var(--fg); } +.themer-menu button[aria-current="true"]::after { content: "\2713"; margin-left: auto; color: var(--accent); } + +/* ---------- hero: the lead dev disaster as a diagnostic ---------- */ + +.hero { padding: 4.5rem 0 3rem; } +.hero-top { + display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; + padding-bottom: 1.5rem; +} +.hero-top .spacer { flex: 1; } + +.hero h1 { + font-size: clamp(2.5rem, 6.4vw, 4.75rem); + max-width: 18ch; + margin-bottom: 1.5rem; +} +.hero h1 .squiggle { color: var(--sev-error); } +.hero h1 .squiggle > span { color: var(--fg); } + +.hero-excerpt { font-size: 1.1875rem; color: var(--fg-dim); max-width: 46rem; margin: 0 0 2rem; } +.hero-actions { display: flex; gap: .75rem; align-items: center; flex-wrap: wrap; } +.hero-actions .by { font-family: var(--mono); font-size: .75rem; color: var(--fg-dim); margin-left: auto; } + +/* ---------- intro strip ---------- */ + +.intro { + border-top: 1px solid var(--line); + border-bottom: 1px solid var(--line); + padding: 1.75rem 0; + display: flex; gap: 2rem; align-items: center; flex-wrap: wrap; +} +.intro p { margin: 0; max-width: 46rem; color: var(--fg-dim); } +.intro p b { color: var(--fg); font-weight: 400; } +.intro .btn { margin-left: auto; } + +/* ---------- section headers ---------- */ + +.band { padding: 3.5rem 0; border-bottom: 1px solid var(--line); } +.band-head { + display: flex; align-items: baseline; gap: 1.25rem; flex-wrap: wrap; + margin-bottom: 1.75rem; +} +.band-head h2 { font-size: 1.75rem; } +.band-head .more { margin-left: auto; font-family: var(--mono); font-size: .8125rem; text-decoration: none; } +.band-note { color: var(--fg-dim); margin: -.75rem 0 1.75rem; max-width: 44rem; } + +/* ---------- problems panel: the dev disasters list ---------- */ + +.panel { border: 1px solid var(--line); border-radius: var(--r); overflow: hidden; } +.panel-bar { + display: flex; align-items: center; gap: 1rem; + background: var(--bg-inset); + border-bottom: 1px solid var(--line); + padding: .55rem .9rem; + font-family: var(--mono); font-size: .6875rem; + letter-spacing: .14em; text-transform: uppercase; color: var(--fg-dim); +} +.panel-bar .count { margin-left: auto; letter-spacing: .04em; text-transform: none; } + +.prow { + display: grid; + grid-template-columns: 7.5rem 1fr auto; + gap: 1.5rem; align-items: center; + padding: .85rem .9rem; + text-decoration: none; color: inherit; + border-bottom: 1px solid var(--line); +} +.prow:last-child { border-bottom: 0; } +.prow:hover { background: var(--bg-raised); } +.prow .msg { font-size: 1rem; line-height: 1.35; } +.prow:hover .msg { color: var(--accent); } +.prow .loc { font-family: var(--mono); font-size: .75rem; color: var(--fg-dim); white-space: nowrap; } +.prow .tag { + font-family: var(--mono); font-size: .625rem; letter-spacing: .1em; text-transform: uppercase; + border: 1px solid currentColor; border-radius: 2px; padding: .1rem .35rem; + color: var(--sev-warn); margin-left: .5rem; vertical-align: .1em; +} + +/* ---------- latest grid ---------- */ + +.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--line); border: 1px solid var(--line); border-radius: var(--r); overflow: hidden; } +.card { + background: var(--bg); + padding: 1.5rem 1.35rem; + text-decoration: none; color: inherit; + display: flex; flex-direction: column; gap: .6rem; +} +.card:hover { background: var(--bg-raised); } +.card h3 { font-size: 1.1875rem; line-height: 1.2; } +.card:hover h3 { color: var(--accent); } +.card p { margin: 0; color: var(--fg-dim); font-size: .9375rem; } +.card .foot { margin-top: auto; padding-top: .9rem; font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); display: flex; gap: .6rem; flex-wrap: wrap; } +.card .foot .k { color: var(--accent); letter-spacing: .1em; text-transform: uppercase; } +.card.wide { grid-column: span 2; display: grid; grid-template-columns: 15rem 1fr; gap: 1.25rem; align-content: start; } +.card.wide .thumb { margin: 0; max-height: none; } +.card.wide .body { display: flex; flex-direction: column; gap: .6rem; height: 100%; } +.card .thumb { + aspect-ratio: 16/9; max-height: 10rem; border-radius: 2px; + background: var(--bg-inset); border: 1px solid var(--line); + display: grid; place-items: center; + font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); +} + +/* ---------- topics ---------- */ + +.chips { display: flex; flex-wrap: wrap; gap: .5rem; } +.chip { + font-family: var(--mono); font-size: .8125rem; + padding: .45rem .75rem; + border: 1px solid var(--line); border-radius: var(--r); + text-decoration: none; color: var(--fg-dim); + display: inline-flex; gap: .5rem; align-items: baseline; +} +.chip:hover { border-color: var(--accent); color: var(--accent); } +.chip .n { font-size: .6875rem; opacity: .6; } + +/* ---------- drip ---------- */ + +.drip { + display: grid; grid-template-columns: 1.3fr 1fr; gap: 3rem; align-items: center; + border: 1px solid var(--line); border-radius: var(--r); + background: var(--bg-raised); + padding: 2.25rem; +} +.drip h2 { font-size: 1.75rem; margin: .5rem 0 .75rem; max-width: 20ch; } +.drip .promise { + font-family: var(--display); font-variation-settings: "SOFT" 28, "WONK" 1; + font-size: 1.75rem; line-height: 1.15; font-weight: 600; + color: var(--fg); margin: 0 0 .75rem; max-width: 24ch; +} +.drip p { color: var(--fg-dim); margin: 0; font-size: .9688rem; } +.drip form { display: flex; gap: .5rem; } +.drip input { + flex: 1; min-width: 0; + background: var(--bg); border: 1px solid var(--line); border-radius: var(--r); + color: var(--fg); font: inherit; font-size: .9375rem; padding: .65rem .8rem; +} +.drip input::placeholder { color: var(--fg-dim); } +.drip .fine { font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); margin-top: .7rem; } + +/* ---------- reading layout ---------- */ + +.read { + display: grid; + grid-template-columns: var(--gutter) minmax(0, var(--measure)) 1fr; + gap: 3rem; + padding: 3rem 0 4rem; +} +.rail { position: sticky; top: 5.5rem; align-self: start; } +.rail dl { margin: 0; display: grid; gap: 1.15rem; } +.rail dt { + font-family: var(--mono); font-size: .625rem; letter-spacing: .14em; + text-transform: uppercase; color: var(--fg-dim); margin-bottom: .3rem; +} +.rail dd { margin: 0; font-family: var(--mono); font-size: .8125rem; display: flex; gap: .6rem; flex-wrap: wrap; } +.rail dd a { text-decoration: none; } + +.like { + margin-top: 1.75rem; + display: inline-flex; align-items: center; gap: .5rem; + font-family: var(--mono); font-size: .8125rem; + background: var(--bg-raised); border: 1px solid var(--line); border-radius: var(--r); + color: var(--fg); padding: .5rem .8rem; cursor: pointer; +} +.like:hover { border-color: var(--sev-error); color: var(--sev-error); } +/* The like is a control and the reply count is navigation, so they sit on the same row + but only one of them is a button. // is how a C# reader already spells "comment". */ +.rail-acts { display: grid; gap: .5rem; margin-top: 1.75rem; } +.rail-acts .like { margin-top: 0; } +.jump { text-decoration: none; } +.jump .cmark { color: var(--tok-com); font-style: italic; } +.jump:hover { border-color: var(--accent); color: var(--accent); } + +.rail .fine { display: block; font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); margin-top: .5rem; } + +.storyhead { margin-bottom: 2rem; } +.storyhead h1 { font-size: clamp(2rem, 4vw, 3rem); margin: 1rem 0; } +.storyhead h1 .squiggle { color: var(--sev-error); } +.storyhead h1 .squiggle > span { color: var(--fg); } + +.prose > * { margin: 0; } +.prose > * + * { margin-top: 1.35rem; } +.prose h2 { font-size: 1.4rem; margin-top: 2.5rem; } +.prose blockquote { + margin: 1.75rem 0; padding: .25rem 0 .25rem 1.25rem; + border-left: 2px solid var(--sev-error); + font-family: var(--display); font-size: 1.25rem; font-variation-settings: "SOFT" 40, "WONK" 1; + line-height: 1.35; +} +.prose code { font-family: var(--mono); font-size: .875em; background: var(--bg-inset); padding: .1em .35em; border-radius: 2px; } + +.code { + border: 1px solid var(--line); border-radius: var(--r); + background: var(--bg-inset); + font-family: var(--mono); font-size: .8125rem; line-height: 1.7; + overflow: hidden; +} +.code-bar { + display: flex; gap: .75rem; padding: .45rem .85rem; + border-bottom: 1px solid var(--line); + font-size: .6875rem; color: var(--fg-dim); +} +.code-bar .lang { margin-left: auto; } +.code pre { margin: 0; padding: .9rem 1rem; overflow-x: auto; } +.k { color: var(--tok-key); } +.s { color: var(--tok-str); } +.f { color: var(--tok-fn); } +.t { color: var(--tok-type); } +.c { color: var(--tok-com); font-style: italic; } +.n { color: var(--tok-num); } + +/* Tables here carry benchmark numbers more often than anything else, so numeric columns + are mono and tabular and digits line up in a column you can actually compare down. + The 2px header rule is the same device as .rule.major, so a table reads as structure. */ +.table-wrap { overflow-x: auto; min-width: 0; } +.prose table { width: 100%; border-collapse: collapse; font-size: .9375rem; } +.prose th { + font-family: var(--mono); font-size: .625rem; letter-spacing: .14em; + text-transform: uppercase; font-weight: 400; color: var(--fg-dim); + text-align: left; white-space: nowrap; + padding: 0 1.25rem .55rem 0; border-bottom: 2px solid var(--fg-dim); +} +.prose td { + padding: .75rem 1.25rem .75rem 0; + border-bottom: 1px solid var(--line); vertical-align: top; +} +.prose th:last-child, .prose td:last-child { padding-right: 0; } +.prose tbody tr:last-child td { border-bottom: 0; } +.prose th.num, .prose td.num { + font-family: var(--mono); font-variant-numeric: tabular-nums; text-align: right; +} +/* Inside a table the mono face already marks the cell as code, so the inline chip is + noise that breaks the row rhythm. */ +.prose table code { background: none; padding: 0; } + +.prose caption { + caption-side: bottom; text-align: left; margin-top: .8rem; + font-family: var(--mono); font-size: .6875rem; line-height: 1.6; color: var(--fg-dim); +} + +.callout { + border: 1px solid var(--line); border-left: 2px solid var(--sev-info); + border-radius: var(--r); + background: var(--bg-raised); + padding: 1.1rem 1.25rem; +} +.callout .tag { + display: block; font-family: var(--mono); font-size: .625rem; + letter-spacing: .14em; text-transform: uppercase; + color: var(--sev-info); margin-bottom: .5rem; +} +.callout p { margin: 0; color: var(--fg-dim); } + +.videocard { + display: flex; gap: 1.25rem; align-items: center; flex-wrap: wrap; + border: 1px solid var(--line); border-left: 2px solid var(--accent); + border-radius: var(--r); background: var(--bg-raised); + padding: 1.1rem 1.25rem; text-decoration: none; color: inherit; +} +.videocard .tag { display: block; font-family: var(--mono); font-size: .625rem; letter-spacing: .14em; text-transform: uppercase; color: var(--accent); margin-bottom: .35rem; } +.videocard strong { font-family: var(--display); font-size: 1.0625rem; font-variation-settings: "SOFT" 30, "WONK" 1; } +.videocard .btn { margin-left: auto; } + +.notice { + font-family: var(--mono); font-size: .75rem; line-height: 1.65; + color: var(--fg-dim); + border: 1px dashed var(--line); border-radius: var(--r); + padding: .85rem 1rem; +} + +/* ---------- comments ---------- */ + +.comments { border-top: 1px solid var(--line); padding: 2.5rem 0 4rem; } +.comments .shell { display: grid; grid-template-columns: var(--gutter) minmax(0, var(--measure)) 1fr; gap: 3rem; } + +.composer { border: 1px solid var(--line); border-radius: var(--r); background: var(--bg-raised); padding: 1rem 1.15rem; margin-bottom: .5rem; } +.composer label { display: block; font-family: var(--mono); font-size: .75rem; color: var(--fg-dim); margin-bottom: .55rem; } +.composer textarea { + width: 100%; min-height: 5.5rem; resize: vertical; + background: var(--bg); border: 1px solid var(--line); border-radius: var(--r); + color: var(--fg); font: inherit; font-size: .9375rem; padding: .75rem .85rem; +} +.composer textarea::placeholder { color: var(--fg-dim); } +.composer-foot { display: flex; gap: .75rem; align-items: center; margin-top: .7rem; font-family: var(--mono); font-size: .75rem; color: var(--fg-dim); flex-wrap: wrap; } +.composer-foot .btn { margin-left: auto; } + +.comment { display: grid; grid-template-columns: 2rem 1fr; gap: .9rem; padding: 1.25rem 0; border-top: 1px solid var(--line); } +.comment.reply { margin-left: 2.9rem; } +.av { + width: 2rem; height: 2rem; border-radius: 3px; + background: var(--bg-inset); border: 1px solid var(--line); + display: grid; place-items: center; + font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); +} +.av.host { color: var(--accent); border-color: var(--accent); } +.av .mark { width: 1.4rem; height: 1.4rem; color: inherit; } +.av.xl .mark { width: 3.4rem; height: 3.4rem; } +.chead { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; font-family: var(--mono); font-size: .75rem; color: var(--fg-dim); margin-bottom: .4rem; } +.chead .who { color: var(--fg); } +.chead .who a { color: inherit; text-decoration: none; } +.chead .who a:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; } +.badge { + font-family: var(--mono); font-size: .625rem; letter-spacing: .06em; + border: 1px solid var(--line); border-radius: 2px; padding: .1rem .35rem; + color: var(--fg-dim); +} +.badge.hot { color: var(--accent); border-color: var(--accent); } +.cbody { font-size: .9688rem; } +.cbody p { margin: 0 0 .7rem; } +.cbody p:last-child { margin-bottom: 0; } +.cacts { display: flex; gap: 1rem; margin-top: .6rem; font-family: var(--mono); font-size: .75rem; } +.cacts button { background: none; border: 0; padding: 0; cursor: pointer; color: var(--fg-dim); font: inherit; } +.cacts button:hover { color: var(--accent); } +.cacts .rep { color: var(--fg-dim); text-decoration: none; } +.cacts .rep:hover { color: var(--sev-error); text-decoration: underline; text-underline-offset: 2px; } + +/* ---------- footer ---------- */ + +/* The footer needs its own edge. Without a rule it reads as one more content block, + which is most obvious on phones where the four columns collapse into one. */ +.foot { border-top: 1px solid var(--line); padding: 3rem 0 4rem; } +.foot-grid { display: grid; grid-template-columns: 1.5fr repeat(3, 1fr); gap: 2.5rem; } +.foot h4 { font-family: var(--mono); font-size: .625rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--fg-dim); margin-bottom: .9rem; } +.foot ul { list-style: none; margin: 0; padding: 0; display: grid; gap: .5rem; font-size: .9375rem; } +.foot ul a { color: var(--fg-dim); text-decoration: none; } +.foot ul a:hover { color: var(--fg); } +.signoff { font-family: var(--display); font-size: 1.25rem; font-variation-settings: "SOFT" 40, "WONK" 1; margin: .75rem 0 .5rem; } +.foot .tagline { color: var(--fg-dim); font-size: .875rem; margin: 0; max-width: 22rem; } + +/* ---------- front page skeleton ---------- */ + +/* Small print. The scoped variants further down only add spacing or position. */ +.fine { font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); } + +.rule { + display: flex; align-items: center; gap: 1rem; + font-family: var(--mono); font-size: .6875rem; + letter-spacing: .16em; text-transform: uppercase; color: var(--fg-dim); + padding: 0 0 .9rem; + border-bottom: 1px solid var(--line); + margin-bottom: 1.5rem; +} +.rule .more { margin-left: auto; text-transform: none; letter-spacing: .04em; text-decoration: none; } + +/* Major section waypoints. Rails inside the fold stay as quiet mono eyebrows; the + sections a reader actually navigates between get the display face so they register + as places rather than captions. */ +.rule.major { + align-items: baseline; + padding-bottom: .6rem; + margin-bottom: 1.4rem; + border-bottom-width: 2px; + border-bottom-color: var(--fg-dim); +} +.rule.major h2 { + font-family: var(--display); + font-variation-settings: "SOFT" 28, "WONK" 1; + font-size: 2rem; line-height: 1.05; font-weight: 600; + letter-spacing: -.015em; text-transform: none; + color: var(--fg); margin: 0; +} + +.row { + display: grid; grid-template-columns: 1fr auto; gap: .35rem 1.25rem; + align-items: baseline; + padding: .85rem 0; border-bottom: 1px solid var(--line); + text-decoration: none; color: inherit; +} +.row:last-child { border-bottom: 0; } +.row h3 { font-size: 1.0625rem; line-height: 1.25; } +.row:hover h3 { color: var(--accent); } +.row .meta { font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); white-space: nowrap; } +.row .meta .k { color: var(--accent); letter-spacing: .1em; text-transform: uppercase; } +.row p { grid-column: 1 / -1; margin: 0; color: var(--fg-dim); font-size: .9375rem; } + +/* padding-block only. .front is also a .shell, and a padding shorthand here would + wipe out the shell's horizontal inset. */ +.front { + display: grid; grid-template-columns: 1fr 26rem; gap: 0 3rem; + padding-block: 2.75rem 2.25rem; +} +.front .lead { border-right: 1px solid var(--line); padding-right: 3rem; } +.lead-top { display: flex; align-items: center; gap: 1rem; margin-bottom: 1.1rem; } +.lead-top .spacer { flex: 1; } +.front h1 { font-size: clamp(1.9rem, 3.2vw, 2.85rem); margin-bottom: 1rem; } +.front h1 .squiggle { color: var(--sev-error); } +.front h1 .squiggle > span { color: var(--fg); } +.front .excerpt { font-size: 1.0625rem; color: var(--fg-dim); margin: 0 0 1.5rem; max-width: 38rem; } +.front .acts { display: flex; gap: .75rem; align-items: center; flex-wrap: wrap; } +.front .acts .by { margin-left: auto; font-family: var(--mono); font-size: .75rem; color: var(--fg-dim); } +.front .side .row { padding: .8rem 0; } +.front .side .row h3 { font-size: 1rem; } + +.byline { + margin-top: 2.5rem; padding-top: 1.5rem; + border-top: 1px solid var(--line); + display: grid; grid-template-columns: auto 1fr; gap: 1rem; align-items: baseline; + max-width: 40rem; +} +.byline .who { font-family: var(--display); font-size: 1.0625rem; white-space: nowrap; } +.byline p { margin: 0; font-size: .9375rem; color: var(--fg-dim); } +.byline a { white-space: nowrap; font-family: var(--mono); font-size: .8125rem; } + +.below { padding-block: 2.75rem 3rem; } +.below .rule { margin-top: 3rem; } +.below .rule:first-child { margin-top: 0; } +.below .lead-in { color: var(--fg-dim); margin: -.5rem 0 1.5rem; max-width: 44rem; } +.below .story-cta { display: flex; gap: .9rem; align-items: center; flex-wrap: wrap; margin-top: 1.25rem; } +.below .story-cta .fine { font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); } + +/* ---------- dev disasters archive ---------- */ +/* Two candidate treatments share one rule: every entry is the same size. Ranking the + severities against each other set the funniest stories smallest, which reads as "your + embarrassment matters less" on a page that promises nobody gets dunked on. */ + +/* Version B, the wall. Same data, opposite editorial position: the sentence you remember + is the headline and the title drops to a label, because the line is the reason anybody + reads these. Severity survives as the rule down the left of each quote. */ + +.wall { margin-top: 2.25rem; columns: 2; column-gap: 3.5rem; } + +.wq { + position: relative; + break-inside: avoid; -webkit-column-break-inside: avoid; + padding: 1.6rem 1.35rem 1.6rem 1.4rem; + border-left: 2px solid var(--wqc); + border-top: 1px solid var(--line); +} +.wall > .wq:first-child { border-top: 0; } +.wq-error { --wqc: var(--sev-error); } +.wq-warn { --wqc: var(--sev-warn); } +.wq-info { --wqc: var(--sev-info); } +.wq-hint { --wqc: var(--sev-hint); } +.wq:hover { background: var(--bg-raised); } + +.wq-lab { display: flex; align-items: center; gap: .75rem; } +.wq-lab b { + font-family: var(--mono); font-size: .75rem; font-weight: 400; + font-variant-numeric: tabular-nums; color: var(--fg-dim); +} +.wq-lab .sev { font-size: .625rem; } + +/* Likes and replies read at full strength while their markers stay quiet, so the number + is what you scan and the glyph only tells you which number it is. */ +.wq-stats { margin-left: auto; display: flex; align-items: baseline; gap: 1.1rem; } +.wq-stats .st { + display: inline-flex; align-items: baseline; gap: .35rem; + font-family: var(--mono); font-size: .875rem; font-variant-numeric: tabular-nums; + color: var(--fg); +} +.wq-stats i { font-style: normal; font-size: .75rem; color: var(--fg-dim); } +.wq-stats i.cm { font-style: italic; color: var(--tok-com); } + +.wq-line { + margin: .7rem 0 0; + font-family: var(--display); font-variation-settings: "SOFT" 40, "WONK" 1; + font-size: 1.375rem; line-height: 1.25; font-weight: 500; +} +.wq-line a { color: inherit; text-decoration: none; } +.wq:hover .wq-line a { color: var(--accent); } +.wq-line .stretch::after { content: ""; position: absolute; inset: 0; } +.wq-line .stretch:focus-visible { outline: none; } +.wq:has(.stretch:focus-visible) { outline: 2px solid var(--accent); outline-offset: -2px; } + +.wq-f { + display: block; margin-top: .9rem; + font-family: var(--mono); font-size: .6875rem; line-height: 1.7; color: var(--fg-dim); +} +.wq-f a { position: relative; z-index: 1; color: var(--fg-dim); text-underline-offset: 2px; } +.wq-f a:hover { color: var(--accent); } + +/* ---------- page heads and filters ---------- */ + +.pagehead { padding: 3rem 0 1.5rem; } +.pagehead h1 { font-size: clamp(2rem, 4vw, 3rem); margin-bottom: .9rem; } +.pagehead h1 .slash { color: var(--accent); font-weight: 400; } +.pagehead .lede { max-width: 44rem; } + +.filters { + display: flex; gap: .5rem; flex-wrap: wrap; align-items: center; + padding: 1.25rem 0; + border-top: 1px solid var(--line); + border-bottom: 1px solid var(--line); + margin-bottom: 1.75rem; +} +.filters .lbl { + font-family: var(--mono); font-size: .6875rem; + letter-spacing: .16em; text-transform: uppercase; color: var(--fg-dim); + margin-right: .35rem; +} +.filters .lbl + .chip { margin-left: 0; } +.filters .push { margin-left: auto; } +.chip.on { border-color: var(--accent); color: var(--accent); background: var(--bg-raised); } + +/* ---------- mixed content feed ---------- */ + +.feed { border-top: 1px solid var(--line); } +.fitem { + display: grid; grid-template-columns: 9rem 1fr auto; gap: 1.75rem; + align-items: start; + padding: 1.5rem .75rem; + border-bottom: 1px solid var(--line); + text-decoration: none; color: inherit; +} +.fitem:hover { background: var(--bg-raised); } +.fitem h3 { font-size: 1.125rem; line-height: 1.25; margin-bottom: .35rem; } +.fitem:hover h3 { color: var(--accent); } +.fitem p { margin: 0; color: var(--fg-dim); font-size: .9375rem; } +.fitem .kind { + font-family: var(--mono); font-size: .6875rem; + letter-spacing: .12em; text-transform: uppercase; color: var(--accent); + padding-top: .2rem; display: grid; gap: .5rem; justify-items: start; +} +.fitem .stat { text-align: right; font-family: var(--mono); font-size: .75rem; color: var(--fg-dim); display: grid; gap: .3rem; white-space: nowrap; } +.fitem .thumb { width: 9rem; max-height: none; } + +/* ---------- video page ---------- */ + +.embed { + aspect-ratio: 16/9; border-radius: var(--r); + border: 1px solid var(--line); background: var(--bg-inset); + display: grid; place-items: center; position: relative; + margin-bottom: 1.75rem; +} +.embed .play { + width: 4.25rem; height: 3rem; border-radius: 8px; + border: 1px solid var(--line); background: var(--bg-raised); + display: grid; place-items: center; color: var(--fg); font-size: 1.15rem; +} +.embed .fine { position: absolute; bottom: 1rem; left: 0; right: 0; text-align: center; font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); } + +.transcript { border: 1px solid var(--line); border-radius: var(--r); margin-top: 2rem; } +.transcript summary { + padding: .9rem 1.15rem; cursor: pointer; list-style: none; + display: flex; align-items: center; gap: .75rem; + font-family: var(--mono); font-size: .75rem; + letter-spacing: .12em; text-transform: uppercase; color: var(--fg-dim); +} +.transcript summary::-webkit-details-marker { display: none; } +.transcript summary::before { content: "\25B8"; color: var(--accent); } +.transcript[open] summary::before { content: "\25BE"; } +.transcript summary:hover { color: var(--fg); } +.transcript summary .hint { margin-left: auto; text-transform: none; letter-spacing: .02em; } +.transcript .tbody { padding: .35rem 1.15rem 1.15rem; border-top: 1px solid var(--line); } +.tline { display: grid; grid-template-columns: 3.5rem 1fr; gap: 1rem; padding: .45rem 0; } +.tline .t { font-family: var(--mono); font-size: .75rem; color: var(--accent); } +.tline p { margin: 0; color: var(--fg-dim); font-size: .9375rem; } + +.chapters { display: grid; gap: .1rem; } +.chapters a { + display: grid; grid-template-columns: 3.5rem 1fr; gap: 1rem; + padding: .4rem .5rem; border-radius: 3px; + text-decoration: none; color: var(--fg-dim); font-size: .9375rem; +} +.chapters a:hover { background: var(--bg-raised); color: var(--fg); } +.chapters .t { font-family: var(--mono); font-size: .75rem; color: var(--accent); } + +/* ---------- profile ---------- */ + +.profile-head { + display: grid; grid-template-columns: auto 1fr auto; gap: 1.5rem; + align-items: center; padding: 3rem 0 1.75rem; +} +.av.xl { width: 5rem; height: 5rem; font-size: 1.5rem; border-radius: var(--r); } +.profile-head h1 { font-size: 1.9rem; margin-bottom: .3rem; } +.profile-head .handle { font-family: var(--mono); font-size: .8125rem; color: var(--fg-dim); margin: 0; } +.profile-head .badges { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: .8rem; } + +.stat-strip { + display: flex; flex-wrap: wrap; gap: 2rem; + padding: 1.15rem 0; + border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); + font-family: var(--mono); font-size: .6875rem; + letter-spacing: .14em; text-transform: uppercase; color: var(--fg-dim); +} +.stat-strip b { display: block; font-family: var(--display); font-size: 1.5rem; font-weight: 700; letter-spacing: -.01em; color: var(--fg); margin-bottom: .25rem; } + +.shelf { padding: 2.25rem 0; } +.shelf-note { color: var(--fg-dim); font-size: .9375rem; max-width: 40rem; margin: -.5rem 0 1.5rem; } +.plaques { display: grid; grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr)); gap: .75rem; } +.plaque { + position: relative; overflow: hidden; + border: 1px solid var(--line); border-radius: var(--r); + background: var(--bg-raised); + padding: .95rem 1rem .95rem 1.25rem; + display: grid; gap: .3rem; +} +.plaque::after { content: ""; position: absolute; inset: 0 auto 0 0; width: 3px; background: var(--accent); } +.plaque .name { font-family: var(--display); font-weight: 700; font-size: .9375rem; } +.plaque .how { font-family: var(--mono); font-size: .6875rem; color: var(--fg-dim); line-height: 1.5; } +.plaque .tier { position: absolute; top: .7rem; right: .8rem; font-family: var(--mono); font-size: .6875rem; color: var(--accent); } +.plaque.locked { opacity: .45; } +.plaque.locked::after { background: var(--line); } +.plaque.locked .tier { color: var(--fg-dim); } + +.tabs { + display: flex; gap: 1.5rem; border-bottom: 1px solid var(--line); + font-family: var(--mono); font-size: .8125rem; margin-bottom: 1.5rem; +} +.tabs a { text-decoration: none; color: var(--fg-dim); padding: .7rem 0; border-bottom: 2px solid transparent; margin-bottom: -1px; } +.tabs a:hover { color: var(--fg); } +.tabs a.on { color: var(--fg); border-bottom-color: var(--accent); } +.tabs .n { opacity: .6; } + +/* ---------- forms ---------- */ + +.form { display: grid; gap: 1.75rem; } +.field { display: grid; gap: .5rem; } +.field label:not(.consent):not(.pick) { + font-family: var(--mono); font-size: .75rem; + letter-spacing: .12em; text-transform: uppercase; color: var(--fg); +} +.field label:not(.consent):not(.pick) .opt { color: var(--fg-dim); text-transform: none; letter-spacing: .02em; } +.field .help { color: var(--fg-dim); font-size: .9375rem; margin: 0; max-width: 40rem; } +.field .help.count { font-family: var(--mono); font-size: .6875rem; } +/* Deliberately excludes radios and checkboxes. They live inside .field too, and a 100% + wide radio button pushes its own label off the end of the row. */ +.field textarea, +.field input:not([type="radio"]):not([type="checkbox"]) { + width: 100%; font: inherit; color: var(--fg); + background: var(--bg-inset); border: 1px solid var(--line); border-radius: var(--r); + padding: .85rem 1rem; resize: vertical; +} +.field textarea::placeholder, .field input::placeholder { color: var(--fg-dim); } +.field textarea:focus, +.field input:focus { outline: 2px solid var(--accent); outline-offset: 1px; } + +.switch-row { + display: grid; grid-template-columns: auto 1fr; gap: 1rem; align-items: start; + border: 1px solid var(--line); border-radius: var(--r); + background: var(--bg-raised); padding: 1.1rem 1.25rem; +} +.switch { + width: 2.9rem; height: 1.6rem; flex: none; + border-radius: 999px; border: 1px solid var(--line); background: var(--bg-inset); + padding: 2px; cursor: pointer; display: flex; +} +.switch .knob { width: 1.2rem; height: 1.2rem; border-radius: 50%; background: var(--fg-dim); transition: transform .15s, background .15s; } +.switch[aria-checked="true"] { border-color: var(--accent); } +.switch[aria-checked="true"] .knob { transform: translateX(1.3rem); background: var(--accent); } +.switch-label { font-family: var(--display); font-weight: 700; font-size: 1rem; display: block; } +.switch-help { color: var(--fg-dim); font-size: .9375rem; display: block; margin-top: .3rem; max-width: 36rem; } + +.consent { display: grid; grid-template-columns: auto 1fr; gap: .75rem; align-items: start; font-size: .9375rem; color: var(--fg-dim); } +.consent input { + appearance: none; width: 1.15rem; height: 1.15rem; margin-top: .15rem; + border: 1px solid var(--line); border-radius: 3px; background: var(--bg-inset); + cursor: pointer; display: grid; place-items: center; +} +.consent input:checked { border-color: var(--accent); } +.consent input:checked::after { content: "\2713"; color: var(--accent); font-size: .8rem; line-height: 1; } +.consent input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } + +.form-foot { display: flex; gap: 1rem; align-items: center; flex-wrap: wrap; } + +/* ---------- conduct and report ---------- */ + +.crows { display: flex; flex-direction: column; gap: .5rem; margin-top: 1.75rem; } +.crow { + display: grid; grid-template-columns: 5.5rem 1fr; gap: 1.25rem; + align-items: start; + background: var(--bg-raised); border: 1px solid var(--line); border-radius: var(--r); + padding: 1rem 1.25rem; +} +.crow h3 { font-family: var(--body); font-size: 1rem; font-weight: 700; margin: 0; } +.crow p { color: var(--fg-dim); font-size: .9375rem; margin: .3rem 0 0; } + +.picks { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .6rem; } +.pick { + display: inline-flex; align-items: center; gap: .5rem; + font-family: var(--mono); font-size: .8125rem; + border: 1px solid var(--line); border-radius: var(--r); + padding: .45rem .75rem; cursor: pointer; color: var(--fg-dim); +} +.pick:hover { border-color: var(--accent); color: var(--fg); } +.pick:has(input:checked) { border-color: var(--accent); color: var(--accent); } +.pick input { accent-color: var(--accent); margin: 0; } + +/* ---------- responsive ---------- */ + +@media (max-width: 1180px) { + .front { grid-template-columns: minmax(0, 1fr); gap: 2.5rem; } + .front .lead { border-right: 0; padding-right: 0; } +} + +@media (max-width: 1080px) { + /* minmax(0,1fr) not 1fr. An auto-sized track refuses to go below its content's + min-content width, which lets a wide table push the whole page sideways. */ + .read, .comments .shell { grid-template-columns: minmax(0, 1fr); gap: 1.75rem; } + .rail { position: static; } + /* Stacked, the rail would put a pile of metadata between the reader and the headline. + Send it under the piece, where it reads as an appendix and the like button lands + right where somebody just finished. */ + .read > article { order: 1; } + .read > .rail { + order: 2; + border-top: 1px solid var(--line); + padding-top: 1.5rem; + } + .rail dl { grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); } + .grid { grid-template-columns: 1fr 1fr; } + .card.wide { grid-column: span 2; } + .drip { grid-template-columns: 1fr; gap: 1.75rem; } + .masthead .shell { flex-wrap: wrap; height: auto; padding-top: .75rem; padding-bottom: .75rem; gap: .75rem 1.25rem; } + .nav { + order: 3; width: 100%; margin-left: 0; + overflow-x: auto; scrollbar-width: none; + padding-bottom: .1rem; + } + .nav::-webkit-scrollbar { display: none; } + .nav a { white-space: nowrap; } + .themer { margin-left: auto; } + .foot-grid { grid-template-columns: 1fr 1fr; } +} + +@media (max-width: 720px) { + .shell { padding-inline: 1.25rem; } + .hero { padding: 2.5rem 0 2rem; } + .grid, .card.wide { grid-column: auto; } + .grid { grid-template-columns: 1fr; } + .card.wide { grid-template-columns: 1fr; gap: .6rem; } + .card.wide .thumb { max-height: 10rem; } + .prow { grid-template-columns: 1fr; gap: .5rem; } + .prow .loc { text-align: left; } + .hero-actions .by { margin-left: 0; width: 100%; } + .themer-menu { position: fixed; left: 1rem; right: 1rem; width: auto; top: 4rem; } + .foot-grid { grid-template-columns: 1fr; gap: 1.75rem; } + .front .acts .by { margin-left: 0; width: 100%; } + .byline { grid-template-columns: 1fr; gap: .4rem; } + .fitem { grid-template-columns: 1fr; gap: .75rem; padding: 1.25rem .25rem; } + .fitem .thumb { width: 100%; max-height: 11rem; } + .fitem .stat { text-align: left; grid-auto-flow: column; justify-content: start; gap: 1rem; } + .profile-head { grid-template-columns: auto 1fr; } + .profile-head > .btn { grid-column: 1 / -1; justify-self: start; } + .stat-strip { gap: 1.25rem 2rem; } + .filters .push { flex-basis: 100%; height: 0; margin: 0; } + .filters { gap: .5rem .5rem; } + /* The lede runs to four lines at phone width, so the default 1.5rem leaves it sitting + on the filter rule. Match the space above the breadcrumb instead. */ + .pagehead { padding-bottom: 2.25rem; } + .rule.major h2 { font-size: 1.5rem; } + /* The wall drops to one column. Two columns of quotes at phone width is one column + of fragments. */ + .wall { columns: 1; } + .wq { padding-left: 1rem; padding-right: 1rem; } + /* Let the header labels stack instead of forcing a horizontal scroll. A four column + benchmark table fits a phone if "Peak threads" is allowed to be two lines. */ + .prose table { font-size: .875rem; } + .prose th { white-space: normal; padding-right: .6rem; } + .prose td { padding-right: .6rem; } + .crow { grid-template-columns: 1fr; gap: .6rem; } +} + +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; } +} diff --git a/src/styles/themes.css b/src/styles/themes.css new file mode 100644 index 0000000..5b00db2 --- /dev/null +++ b/src/styles/themes.css @@ -0,0 +1,338 @@ +/* Generated by scripts/gen-themes.mjs. Do not hand edit. */ + + +[data-theme="bbb-dark"] { + color-scheme: dark; + --bg: #15171a; + --bg-raised: #1c1f23; + --bg-inset: #22262b; + --fg: #e9ebee; + --fg-dim: #99a1aa; + --line: #2b3037; + --accent: #e9a83c; + --sev-error: #f0655f; + --sev-warn: #e8c547; + --sev-info: #6fb6ef; + --sev-hint: #8a929b; + --tok-key: #e9a83c; + --tok-str: #9bd17f; + --tok-fn: #6fb6ef; + --tok-type: #5fc9b6; + --tok-com: #878e96; + --tok-num: #f0a58c; +} + +[data-theme="bbb-light"] { + color-scheme: light; + --bg: #fbfaf8; + --bg-raised: #f3f1ed; + --bg-inset: #eceae5; + --fg: #1b1a18; + --fg-dim: #5f5c57; + --line: #ddd9d2; + --accent: #915f0f; + --sev-error: #c0392b; + --sev-warn: #8a6300; + --sev-info: #1a63c7; + --sev-hint: #6b6862; + --tok-key: #915f0f; + --tok-str: #3f6b2f; + --tok-fn: #1a63c7; + --tok-type: #0f6f63; + --tok-com: #6b6861; + --tok-num: #a44a2a; +} + +[data-theme="hotdog-stand"] { + color-scheme: light; + --bg: #ffff00; + --bg-raised: #ffffff; + --bg-inset: #c0c0c0; + --fg: #000000; + --fg-dim: #4a4a4a; + --line: #ff0000; + --accent: #a30000; + --sev-error: #a30000; + --sev-warn: #704400; + --sev-info: #0000cc; + --sev-hint: #4a4a4a; + --tok-key: #a30000; + --tok-str: #005c00; + --tok-fn: #0000cc; + --tok-type: #005858; + --tok-com: #4a4a4a; + --tok-num: #704400; +} + +[data-theme="github-dark"] { + color-scheme: dark; + --bg: #24292e; + --bg-raised: #1f2428; + --bg-inset: #2f363d; + --fg: #e1e4e8; + --fg-dim: #979fa7; + --line: #1b1f23; + --accent: #79b8ff; + --sev-error: #f97583; + --sev-warn: #ffea7f; + --sev-info: #79b8ff; + --sev-hint: #9a9fa4; + --tok-key: #f97583; + --tok-str: #9aa0a7; + --tok-fn: #79b8ff; + --tok-type: #79b8ff; + --tok-com: #9aa0a7; + --tok-num: #79b8ff; +} + +[data-theme="github-light"] { + color-scheme: light; + --bg: #ffffff; + --bg-raised: #f6f8fa; + --bg-inset: #fafbfc; + --fg: #24292e; + --fg-dim: #6a737d; + --line: #e1e4e8; + --accent: #0366d6; + --sev-error: #cb2431; + --sev-warn: #8b6e0b; + --sev-info: #0366d6; + --sev-hint: #1b1f23; + --tok-key: #ce3846; + --tok-str: #6a737d; + --tok-fn: #0366d6; + --tok-type: #0366d6; + --tok-com: #6a737d; + --tok-num: #005cc5; +} + +[data-theme="dracula"] { + color-scheme: dark; + --bg: #282a36; + --bg-raised: #21222c; + --bg-inset: #282a36; + --fg: #f8f8f2; + --fg-dim: #8591b8; + --line: #bd93f9; + --accent: #50fa7b; + --sev-error: #ff5555; + --sev-warn: #8be9fd; + --sev-info: #50fa7b; + --sev-hint: #8591b8; + --tok-key: #bd93f9; + --tok-str: #ff79c6; + --tok-fn: #50fa7b; + --tok-type: #8be9fd; + --tok-com: #8591b8; + --tok-num: #bd93f9; +} + +[data-theme="one-dark-pro"] { + color-scheme: dark; + --bg: #282c34; + --bg-raised: #21252b; + --bg-inset: #1d1f23; + --fg: #abb2bf; + --fg-dim: #abb2bf; + --line: #3e4452; + --accent: #61afef; + --sev-error: #d47974; + --sev-warn: #e5c07b; + --sev-info: #61afef; + --sev-hint: #8e939e; + --tok-key: #c678dd; + --tok-str: #98c379; + --tok-fn: #61afef; + --tok-type: #e5c07b; + --tok-com: #abb2bf; + --tok-num: #d19a66; +} + +[data-theme="night-owl"] { + color-scheme: dark; + --bg: #011627; + --bg-raised: #011627; + --bg-inset: #0b253a; + --fg: #d6deeb; + --fg-dim: #7a8c9c; + --line: #5f7e97; + --accent: #c792ea; + --sev-error: #ef5654; + --sev-warn: #b39554; + --sev-info: #c792ea; + --sev-hint: #7a8c9c; + --tok-key: #c792ea; + --tok-str: #ecc48d; + --tok-fn: #c792ea; + --tok-type: #ffcb8b; + --tok-com: #7c8d8d; + --tok-num: #f78c6c; +} + +[data-theme="tokyo-night"] { + color-scheme: dark; + --bg: #1a1b26; + --bg-raised: #16161e; + --bg-inset: #14141b; + --fg: #a9b1d6; + --fg-dim: #828598; + --line: #101014; + --accent: #6485bc; + --sev-error: #dd5656; + --sev-warn: #e0af68; + --sev-info: #0da0ba; + --sev-hint: #0da0ba; + --tok-key: #7b82a3; + --tok-str: #7e849f; + --tok-fn: #0db9d7; + --tok-type: #73daca; + --tok-com: #7e849f; + --tok-num: #ff9e64; +} + +[data-theme="catppuccin-mocha"] { + color-scheme: dark; + --bg: #1e1e2e; + --bg-raised: #181825; + --bg-inset: #313244; + --fg: #cdd6f4; + --fg-dim: #cdd6f4; + --line: #585b70; + --accent: #89b4fa; + --sev-error: #f38ba8; + --sev-warn: #fab387; + --sev-info: #89b4fa; + --sev-hint: #969aae; + --tok-key: #fab387; + --tok-str: #a6e3a1; + --tok-fn: #89b4fa; + --tok-type: #f9e2af; + --tok-com: #959bb4; + --tok-num: #fab387; +} + +[data-theme="catppuccin-latte"] { + color-scheme: light; + --bg: #eff1f5; + --bg-raised: #e6e9ef; + --bg-inset: #ccd0da; + --fg: #4c4f69; + --fg-dim: #4c4f69; + --line: #acb0be; + --accent: #1750bf; + --sev-error: #b00d30; + --sev-warn: #983c07; + --sev-info: #1750bf; + --sev-hint: #575964; + --tok-key: #983c07; + --tok-str: #29661c; + --tok-fn: #1750bf; + --tok-type: #784d10; + --tok-com: #545664; + --tok-num: #983c07; +} + +[data-theme="vitesse-dark"] { + color-scheme: dark; + --bg: #121212; + --bg-raised: #121212; + --bg-inset: #181818; + --fg: #dbd7ca; + --fg-dim: #dedcd5; + --line: #191919; + --accent: #4d9375; + --sev-error: #cb7676; + --sev-warn: #5da994; + --sev-info: #6394bf; + --sev-hint: #4d9375; + --tok-key: #828282; + --tok-str: #758575; + --tok-fn: #80a665; + --tok-type: #5da994; + --tok-com: #758575; + --tok-num: #4c9a91; +} + +[data-theme="vitesse-light"] { + color-scheme: light; + --bg: #ffffff; + --bg-raised: #ffffff; + --bg-inset: #f7f7f7; + --fg: #393a34; + --fg-dim: #393a34; + --line: #f0f0f0; + --accent: #1c6b48; + --sev-error: #ab5959; + --sev-warn: #287e72; + --sev-info: #296aa3; + --sev-hint: #1e754f; + --tok-key: #717171; + --tok-str: #6a726a; + --tok-fn: #527c35; + --tok-type: #287e72; + --tok-com: #6a726a; + --tok-num: #2f798a; +} + +[data-theme="solarized-light"] { + color-scheme: light; + --bg: #fdf6e3; + --bg-raised: #eee8d5; + --bg-inset: #ddd6c1; + --fg: #4f6066; + --fg-dim: #595e5b; + --line: #ddd6c1; + --accent: #1b6193; + --sev-error: #b02826; + --sev-warn: #7b5400; + --sev-info: #1b6193; + --sev-hint: #555d5d; + --tok-key: #556200; + --tok-str: #1b6761; + --tok-fn: #1b6193; + --tok-type: #a23c12; + --tok-com: #555d5d; + --tok-num: #a52a65; +} + +[data-theme="nord"] { + color-scheme: dark; + --bg: #2e3440; + --bg-raised: #2e3440; + --bg-inset: #3b4252; + --fg: #d8dee9; + --fg-dim: #d8dee9; + --line: #3b4252; + --accent: #88c0d0; + --sev-error: #d9a0a6; + --sev-warn: #ebcb8b; + --sev-info: #88c0d0; + --sev-hint: #ebcb8b; + --tok-key: #98b2cc; + --tok-str: #a3be8c; + --tok-fn: #88c0d0; + --tok-type: #8fbcbb; + --tok-com: #a7aebc; + --tok-num: #c3a5bd; +} + +[data-theme="monokai"] { + color-scheme: dark; + --bg: #272822; + --bg-raised: #1e1f1c; + --bg-inset: #414339; + --fg: #f8f8f2; + --fg-dim: #afafab; + --line: #414339; + --accent: #a6e22e; + --sev-error: #f89191; + --sev-warn: #ceab0a; + --sev-info: #a6e22e; + --sev-hint: #afafab; + --tok-key: #fc8ab3; + --tok-str: #e6db74; + --tok-fn: #a6e22e; + --tok-type: #a6e22e; + --tok-com: #b0aea0; + --tok-num: #c09dff; +} diff --git a/tests/contrast.test.mjs b/tests/contrast.test.mjs new file mode 100644 index 0000000..f9ee39c --- /dev/null +++ b/tests/contrast.test.mjs @@ -0,0 +1,153 @@ +/* + Decision 34 written down as a test rather than as a promise. + + This reparses the generated themes.css and recomputes every foreground token against + all three surfaces using its own WCAG implementation, deliberately not importing the + generator's math. An independent implementation is what makes this a check rather than + a restatement, and it is what catches a hand edit to themes.css. + + Run: pnpm test +*/ + +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const CSS = fs.readFileSync(path.join(ROOT, 'src', 'styles', 'themes.css'), 'utf8'); + +const TARGET = 4.5; +const SURFACES = ['--bg', '--bg-raised', '--bg-inset']; +const FOREGROUNDS = [ + '--fg', + '--fg-dim', + '--accent', + '--sev-error', + '--sev-warn', + '--sev-info', + '--sev-hint', + '--tok-key', + '--tok-str', + '--tok-fn', + '--tok-type', + '--tok-com', + '--tok-num' +]; + +function srgbToLinear(channel) { + const v = channel / 255; + return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); +} + +function relativeLuminance(hexColor) { + const n = parseInt(hexColor.slice(1), 16); + const r = srgbToLinear((n >> 16) & 0xff); + const g = srgbToLinear((n >> 8) & 0xff); + const b = srgbToLinear(n & 0xff); + return 0.2126 * r + 0.7152 * g + 0.0722 * b; +} + +function contrast(a, b) { + const la = relativeLuminance(a); + const lb = relativeLuminance(b); + const lighter = Math.max(la, lb); + const darker = Math.min(la, lb); + return (lighter + 0.05) / (darker + 0.05); +} + +function parseThemes(css) { + const themes = new Map(); + const blockPattern = /\[data-theme="([^"]+)"\]\s*\{([^}]*)\}/g; + let match; + while ((match = blockPattern.exec(css)) !== null) { + const [, id, body] = match; + const vars = {}; + for (const line of body.split(';')) { + const decl = line.trim(); + if (!decl.startsWith('--')) continue; + const [name, value] = decl.split(':').map((s) => s.trim()); + vars[name] = value; + } + themes.set(id, vars); + } + return themes; +} + +const themes = parseThemes(CSS); + +test('themes.css defines at least sixteen themes', () => { + assert.ok(themes.size >= 16, `found ${themes.size} themes`); +}); + +test('every color is a six digit hex, so nothing resolves at runtime', () => { + for (const [id, vars] of themes) { + for (const name of [...SURFACES, ...FOREGROUNDS]) { + assert.match( + vars[name] ?? '', + /^#[0-9a-f]{6}$/, + `${id} ${name} is "${vars[name]}"` + ); + } + } +}); + +test('every theme declares a color-scheme so form controls follow it', () => { + for (const [id, vars] of themes) { + const block = CSS.slice(CSS.indexOf(`[data-theme="${id}"]`)); + assert.match( + block.slice(0, block.indexOf('}')), + /color-scheme:\s*(dark|light)/, + `${id} has no color-scheme` + ); + assert.ok(vars['--line'], `${id} has no --line`); + } +}); + +test('every foreground token clears 4.5 to 1 against all three surfaces', () => { + const failures = []; + for (const [id, vars] of themes) { + for (const fg of FOREGROUNDS) { + for (const bg of SURFACES) { + const r = contrast(vars[fg], vars[bg]); + if (r < TARGET) { + failures.push(`${id}: ${fg} on ${bg} is ${r.toFixed(2)}:1`); + } + } + } + } + assert.deepEqual(failures, [], `\n${failures.join('\n')}\n`); +}); + +test('Warning stays visually distinct from Error', () => { + const hue = (hexColor) => { + const n = parseInt(hexColor.slice(1), 16); + const r = ((n >> 16) & 0xff) / 255; + const g = ((n >> 8) & 0xff) / 255; + const b = (n & 0xff) / 255; + const mx = Math.max(r, g, b); + const mn = Math.min(r, g, b); + const d = mx - mn; + if (d === 0) return 0; + let deg; + if (mx === r) deg = ((g - b) / d) % 6; + else if (mx === g) deg = (b - r) / d + 2; + else deg = (r - g) / d + 4; + return (deg * 60 + 360) % 360; + }; + const gap = (a, b) => { + const d = Math.abs(hue(a) - hue(b)); + return Math.min(d, 360 - d); + }; + + const failures = []; + for (const [id, vars] of themes) { + const g = gap(vars['--sev-error'], vars['--sev-warn']); + // Hot Dog Stand has one hue to work with, so it is allowed to collapse. Every other + // theme has to keep the two severities apart. + if (id === 'hotdog-stand') continue; + if (g < 20) failures.push(`${id}: error and warn are ${g.toFixed(0)} degrees apart`); + } + assert.deepEqual(failures, [], `\n${failures.join('\n')}\n`); +}); From f6bfac1678cedf885eaae64640952618569c4dec Mon Sep 17 00:00:00 2001 From: Michael Jolley Date: Fri, 31 Jul 2026 12:36:57 -0500 Subject: [PATCH 02/99] Add topic first URLs, the taxonomy map and an exhaustive redirect map Content now lives at /[topic]/[slug]/ rather than under /blog/ and /videos/. Where each item lives is decided by scripts/gen-taxonomy.mjs and recorded in src/config/taxonomy.json, which is generated and committed so slugs freeze. Classification runs in three layers, highest wins: a human review flag, an AI review pass held in src/config/taxonomy.overrides.json, then a keyword scorer. The generator refuses to finish if an override matches no content, names a topic that does not exist, or produces a slug that shadows a reserved path. scripts/gen-redirects.mjs turns that map into 148 explicit rules plus two catch alls. Old URLs are mapped to content ids rather than to other URLs, so a redirect can never chain. Measuring production first found two live faults the new map fixes: one alias pointed at a slug that no longer exists and returned 404, and /posts/* landed on an unslashed URL that then redirected again. Two test files guard it. One checks the map, the other checks real dist output, and the second is what caught five future dated posts whose redirects pointed at pages the build never produced. Those now build with a draft flag and noindex so the URL is live the moment the date passes. Expressive Code drops from sixteen themes to one. Sixteen made it inline sixteen hex values onto every syntax span, which took one real article to 926 KB of HTML. The single theme sets every token color to var(--tok-*), so the existing [data-theme] cascade does the switching. The same article is 55 KB, the generated stylesheet halves, and code colors now reference the chrome tokens instead of copying them, so they cannot drift. Two mockup rules did not survive real content. Feed summaries had no clamp and real ones run past 400 characters, and .embed had no iframe rule because the mockup drew a placeholder rather than a player. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f3070fc6-4aa5-412a-9dfe-0d0037c9684a --- .gitattributes | 2 + ec.config.mjs | 79 +- package.json | 13 +- pnpm-lock.yaml | 73 + public/_redirects | 183 ++- scripts/gen-redirects.mjs | 184 +++ scripts/gen-taxonomy.mjs | 399 +++++ scripts/gen-themes.mjs | 68 +- src/components/FeedItem.astro | 32 + src/config/taxonomy.json | 1443 +++++++++++++++++ src/config/taxonomy.overrides.json | 137 ++ src/lib/content.ts | 163 ++ src/lib/ec-themes.generated.mjs | 2261 +-------------------------- src/pages/[topic]/[...filter].astro | 119 ++ src/pages/[topic]/[slug].astro | 111 ++ src/pages/blog/[slug].astro | 2 +- src/styles/app.css | 15 +- tests/redirects.build.test.mjs | 69 + tests/redirects.test.mjs | 139 ++ 19 files changed, 3180 insertions(+), 2312 deletions(-) create mode 100644 scripts/gen-redirects.mjs create mode 100644 scripts/gen-taxonomy.mjs create mode 100644 src/components/FeedItem.astro create mode 100644 src/config/taxonomy.json create mode 100644 src/config/taxonomy.overrides.json create mode 100644 src/lib/content.ts create mode 100644 src/pages/[topic]/[...filter].astro create mode 100644 src/pages/[topic]/[slug].astro create mode 100644 tests/redirects.build.test.mjs create mode 100644 tests/redirects.test.mjs diff --git a/.gitattributes b/.gitattributes index f08aff5..f41fae8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,3 +4,5 @@ src/styles/themes.css text eol=lf src/lib/themes.generated.ts text eol=lf src/lib/ec-themes.generated.mjs text eol=lf +src/config/taxonomy.json text eol=lf +public/_redirects text eol=lf diff --git a/ec.config.mjs b/ec.config.mjs index dd0bdbd..34b4ac0 100644 --- a/ec.config.mjs +++ b/ec.config.mjs @@ -1,30 +1,47 @@ -import { defineEcConfig } from 'astro-expressive-code'; +import { defineEcConfig, ExpressiveCodeTheme } from 'astro-expressive-code'; import ecThemes from './src/lib/ec-themes.generated.mjs'; /* - Expressive Code lives here rather than in astro.config.mjs because themeCssSelector is - a function, and the component needs the whole options object to survive a JSON - round trip. A separate config file is how Expressive Code supports that. + Expressive Code lives here rather than in astro.config.mjs because the Code component + needs the whole options object to survive a JSON round trip, and a separate config + file is how Expressive Code supports options that cannot. - The themes are generated by scripts/gen-themes.mjs from the same resolved, contrast - guarded tokens that produce themes.css. Feeding it the original VS Code themes instead - would leave code blocks below AA while the chrome around them passed. + One theme, not sixteen. Expressive Code inlines one CSS custom property per configured + theme onto every syntax span, so sixteen themes multiplied every code heavy article by + sixteen. One real article measured 926 KB of HTML that way, which breaks decision 32 + far harder than any JavaScript budget would have. The generated theme instead sets + every token foreground to var(--tok-*), so the existing [data-theme] cascade in + themes.css does all the switching for free and the code always matches the chrome + exactly rather than approximately. The same article is 56 KB. + + Every surface color is overridden here rather than left to the theme, because theme + workbench colors have to be hex for Expressive Code to parse them, while style + overrides accept variables. Nothing hex reaches the page. */ +const theme = new ExpressiveCodeTheme(ecThemes[0]); + +/* + A code block with no language gets tokenized as plain text, and plain text takes the + theme's resolved default foreground rather than any scope rule. That resolution runs + through a workbench color parser that only accepts hex, so the one honest way to keep + a hex value off the page is to overwrite the resolved value after the parser is done + with it. +*/ +theme.fg = 'var(--fg)'; +theme.bg = 'var(--bg-inset)'; + export default defineEcConfig({ - themes: ecThemes, - // All sixteen themes are emitted at once and scoped to the same [data-theme] attribute - // the chrome switches on. That is what keeps a code block matching the panel it sits in - // when a reader changes theme, with no rebuild and no flash. - themeCssSelector: (theme) => `[data-theme="${theme.name}"]`, - // Without this the first theme gets promoted to a media query default and wins over the - // scoped blocks. + themes: [theme], + // One theme means nothing to scope and nothing to switch, so neither a per theme + // selector nor the media query default has a job to do. Leaving the selector on would + // emit a dead [data-theme="bbb"] block that no page ever matches. + themeCssSelector: false, useDarkModeMediaQuery: false, /* - Expressive Code runs its own contrast pass over syntax colors, which would push the - generated tokens somewhere other than where the guard put them and leave inline code - in prose a different shade to the same token inside a block. The generator already - clears 4.5 to 1 against all three surfaces, not just the code background, so this - hands the job to the one guard that sees the whole picture. + Expressive Code runs its own contrast pass over syntax colors. It cannot evaluate a + CSS variable, and gen-themes.mjs already clears 4.5 to 1 against all three surfaces + rather than just the code background, so this hands the job to the guard that can + actually see the colors. */ minSyntaxHighlightingColorContrast: 0, styleOverrides: { @@ -32,9 +49,31 @@ export default defineEcConfig({ codeFontFamily: 'var(--mono)', codeFontSize: '0.8125rem', codeLineHeight: '1.7', + codeBackground: 'var(--bg-inset)', + codeForeground: 'var(--fg)', borderColor: 'var(--line)', borderRadius: 'var(--r)', - borderWidth: '1px' + borderWidth: '1px', + focusBorder: 'var(--accent)', + scrollbarThumbColor: 'var(--line)', + scrollbarThumbHoverColor: 'var(--fg-dim)', + frames: { + editorActiveTabBackground: 'var(--bg-inset)', + editorActiveTabForeground: 'var(--fg)', + editorActiveTabBorderColor: 'var(--line)', + editorTabBarBackground: 'var(--bg-raised)', + editorTabBarBorderBottomColor: 'var(--line)', + editorBackground: 'var(--bg-inset)', + terminalBackground: 'var(--bg-inset)', + terminalTitlebarBackground: 'var(--bg-raised)', + terminalTitlebarForeground: 'var(--fg-dim)', + terminalTitlebarBorderBottomColor: 'var(--line)', + inlineButtonBackground: 'var(--bg-raised)', + inlineButtonForeground: 'var(--fg-dim)', + inlineButtonBorder: 'var(--line)', + tooltipSuccessBackground: 'var(--bg-raised)', + tooltipSuccessForeground: 'var(--fg)' + } }, frames: { showCopyToClipboardButton: true, diff --git a/package.json b/package.json index aed45dc..682100d 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,15 @@ "node": ">=22" }, "scripts": { - "dev": "pnpm themes && astro dev", + "dev": "pnpm gen && astro dev", "build": "astro build", - "prebuild": "pnpm themes", + "prebuild": "pnpm gen", "preview": "astro preview", + "gen": "pnpm themes && pnpm taxonomy && pnpm redirects", "themes": "node scripts/gen-themes.mjs", - "themes:check": "pnpm themes && git diff --exit-code src/styles/themes.css src/lib/themes.generated.ts src/lib/ec-themes.generated.mjs", + "taxonomy": "node scripts/gen-taxonomy.mjs", + "redirects": "node scripts/gen-redirects.mjs", + "gen:check": "pnpm gen && git diff --exit-code src/styles/themes.css src/lib/themes.generated.ts src/lib/ec-themes.generated.mjs src/config/taxonomy.json public/_redirects", "test": "node --test \"tests/**/*.test.mjs\"", "check": "astro check", "astro": "astro" @@ -28,6 +31,8 @@ "preact": "^10.29.7" }, "devDependencies": { - "shiki": "^3.22.0" + "gray-matter": "^4.0.3", + "shiki": "^3.22.0", + "yaml": "^2.9.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3d9da7..baa19ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,9 +33,15 @@ importers: specifier: ^10.29.7 version: 10.29.7(preact-render-to-string@6.7.0) devDependencies: + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 shiki: specifier: ^3.22.0 version: 3.22.0 + yaml: + specifier: ^2.9.0 + version: 2.9.0 packages: @@ -1307,6 +1313,9 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -2015,6 +2024,10 @@ packages: expressive-code@0.41.6: resolution: {integrity: sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2204,6 +2217,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} @@ -2386,6 +2403,10 @@ packages: resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} engines: {node: '>= 0.4'} + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2528,6 +2549,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.15.0: + resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==} + hasBin: true + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -2567,6 +2592,10 @@ packages: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -3422,6 +3451,10 @@ packages: resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} engines: {node: '>=11.0.0'} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3526,6 +3559,9 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -3587,6 +3623,10 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -5574,6 +5614,10 @@ snapshots: arg@5.0.2: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} aria-query@5.3.2: {} @@ -6424,6 +6468,10 @@ snapshots: '@expressive-code/plugin-shiki': 0.41.6 '@expressive-code/plugin-text-markers': 0.41.6 + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + extend@3.0.2: {} extract-zip@2.0.1: @@ -6618,6 +6666,13 @@ snapshots: graceful-fs@4.2.11: {} + gray-matter@4.0.3: + dependencies: + js-yaml: 3.15.0 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + h3@1.15.11: dependencies: cookie-es: 1.2.3 @@ -6915,6 +6970,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -7033,6 +7090,11 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@3.15.0: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -7073,6 +7135,8 @@ snapshots: jwt-decode@4.0.0: {} + kind-of@6.0.3: {} + kleur@3.0.3: {} kolorist@1.8.0: {} @@ -8165,6 +8229,11 @@ snapshots: sax@1.4.4: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + semver@6.3.1: {} semver@7.7.3: {} @@ -8313,6 +8382,8 @@ snapshots: spdx-license-ids@3.0.23: {} + sprintf-js@1.0.3: {} + stack-trace@0.0.10: {} stack-trace@1.0.0: {} @@ -8398,6 +8469,8 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom-string@1.0.0: {} + strip-final-newline@3.0.0: {} strnum@2.1.2: {} diff --git a/public/_redirects b/public/_redirects index 38ba104..155e6ad 100644 --- a/public/_redirects +++ b/public/_redirects @@ -1,26 +1,165 @@ -# GENERATED IN PART. Specific rules first, catch alls last, because Netlify uses the -# first match. Rules below are the pre v2 set and still point at /blog/, which becomes -# an old URL itself once topic first URLs land. scripts/gen-redirects.mjs rewrites all -# of them to point straight at their final destination so nothing chains. +# GENERATED by scripts/gen-redirects.mjs. Do not hand edit, run pnpm redirects. +# +# Decision 19: every old URL 301s straight to its final destination. No chains. That +# is why every article has its own line instead of a /blog/* wildcard, and why the +# legacy /posts/ aliases point at the topic first URL rather than at /blog/. +# +# Netlify takes the first match in file order, so specific rules sort before the +# wildcards at the bottom. -# old blog posts +# 148 explicit rules -/posts/adding-hateoas-to-an-aspnetcore-rest-api/ /blog/adding-hateoas-to-an-asp-net-core-api/ -/posts/using-automapper-with-dotnetcore-3 /blog/using-auto-mapper-with-asp-net-core-3/ -/posts/adding-hateoas-to-an-aspnetcore-rest-api /blog/adding-hateoas-to-an-asp-net-core-api/ -/posts/release-notes-with-github-appveyor-octopus-deploy /blog/automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy/ -/posts/using-azure-key-vault-with-azure-functions /blog/environment-variables-in-azure-functions-with-key-vault/ -/posts/sql-server-in-a-linux-container-to-do-quick-tasks /blog/using-sql-server-in-docker-containers-for-basic-tasks/ -/posts/code-of-conduct-and-contributions-in-public-repositories /blog/using-a-contributing-and-code-of-conduct-to-assist-others-in-contributing-to-public-repositories/ -/posts/setup-command-aliases-in-powershell-to-make-life-easier /blog/adding-command-aliases-to-power-shell/ -/posts/stream-setup /blog/current-twitch-live-coding-stream-setup/ -/posts/docker-communication-between-containers /blog/communication-between-containers-using-docker-compose-in-windows/ -/posts/setting-up-raspberry-pi-for-kiosk-mode /blog/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium/ -/posts/using-netlify-functions-to-add-comments-to-gridsome/ / -/posts/cheers-to-2019-bring-on-2020/ / +/blog/ef-core-audit-logging-with-interceptors-that-do-not-clutter-your-dbcontext/ /data/ef-core-audit-logging-with-interceptors-that-do-not-clutter-your-dbcontext/ 301! +/blog/virtual-vs-override-vs-partial-in-c-explained-with-small-runnable-examples/ /csharp/virtual-vs-override-vs-partial-in-c-explained-with-small-runnable-examples/ 301! +/blog/ef-core-audit-logging-with-interceptors-that-do-not-clutter-your-dbcontext /data/ef-core-audit-logging-with-interceptors-that-do-not-clutter-your-dbcontext/ 301! +/blog/virtual-vs-override-vs-partial-in-c-explained-with-small-runnable-examples /csharp/virtual-vs-override-vs-partial-in-c-explained-with-small-runnable-examples/ 301! +/blog/stop-guessing-types-in-c-typeof-gettype-and-isassignablefrom-explained/ /csharp/stop-guessing-types-in-c-typeof-gettype-and-isassignablefrom-explained/ 301! +/blog/stop-guessing-types-in-c-typeof-gettype-and-isassignablefrom-explained /csharp/stop-guessing-types-in-c-typeof-gettype-and-isassignablefrom-explained/ 301! +/blog/using-azure-file-storage-as-container-volume-mounts-in-app-services/ /cloud/using-azure-file-storage-as-container-volume-mounts-in-app-services/ 301! +/blog/automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy/ /cloud/automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy/ 301! +/blog/stop-parallelizing-everything-a-practical-guide-to-parallelforeach/ /csharp/stop-parallelizing-everything-a-practical-guide-to-parallelforeach/ 301! +/blog/using-azure-file-storage-as-container-volume-mounts-in-app-services /cloud/using-azure-file-storage-as-container-volume-mounts-in-app-services/ 301! +/blog/automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy /cloud/automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy/ 301! +/blog/stop-parallelizing-everything-a-practical-guide-to-parallelforeach /csharp/stop-parallelizing-everything-a-practical-guide-to-parallelforeach/ 301! +/blog/communication-between-containers-using-docker-compose-in-windows/ /cloud/communication-between-containers-using-docker-compose-in-windows/ 301! +/blog/communication-between-containers-using-docker-compose-in-windows /cloud/communication-between-containers-using-docker-compose-in-windows/ 301! +/blog/how-to-use-whisper-openais-speech-recognition-model-in-1-minute/ /copilot/how-to-use-whisper-openais-speech-recognition-model-in-1-minute/ 301! +/blog/how-to-use-whisper-openais-speech-recognition-model-in-1-minute /copilot/how-to-use-whisper-openais-speech-recognition-model-in-1-minute/ 301! +/blog/email-phone-call-transcripts-with-twilio-studio-and-pipedream/ /cloud/email-phone-call-transcripts-with-twilio-studio-and-pipedream/ 301! +/blog/stop-breaking-clocks-in-aspnet-core-with-utc-and-timezoneinfo/ /aspnetcore/stop-breaking-clocks-in-aspnet-core-with-utc-and-timezoneinfo/ 301! +/blog/email-phone-call-transcripts-with-twilio-studio-and-pipedream /cloud/email-phone-call-transcripts-with-twilio-studio-and-pipedream/ 301! +/blog/stop-breaking-clocks-in-aspnet-core-with-utc-and-timezoneinfo /aspnetcore/stop-breaking-clocks-in-aspnet-core-with-utc-and-timezoneinfo/ 301! +/blog/five-di-anti-patterns-haunting-net-apps-and-how-to-fix-them/ /aspnetcore/five-di-anti-patterns-haunting-net-apps-and-how-to-fix-them/ 301! +/blog/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium/ /dev-life/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium/ 301! +/blog/five-di-anti-patterns-haunting-net-apps-and-how-to-fix-them /aspnetcore/five-di-anti-patterns-haunting-net-apps-and-how-to-fix-them/ 301! +/blog/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium /dev-life/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium/ 301! +/blog/sealed-by-default-in-net-when-it-shines-and-when-it-bites/ /csharp/sealed-by-default-in-net-when-it-shines-and-when-it-bites/ 301! +/posts/code-of-conduct-and-contributions-in-public-repositories/ /dev-life/code-of-conduct-and-contributions-in-public-repositories/ 301! +/blog/code-of-conduct-and-contributions-in-public-repositories/ /dev-life/code-of-conduct-and-contributions-in-public-repositories/ 301! +/blog/from-layers-to-slices-how-i-ship-faster-aspnet-core-apis/ /aspnetcore/from-layers-to-slices-how-i-ship-faster-aspnet-core-apis/ 301! +/blog/how-net-10-speeds-up-api-validation-without-code-changes/ /aspnetcore/how-net-10-speeds-up-api-validation-without-code-changes/ 301! +/blog/repository-pattern-vs-dbcontext-in-entity-framework-core/ /data/repository-pattern-vs-dbcontext-in-entity-framework-core/ 301! +/blog/sealed-by-default-in-net-when-it-shines-and-when-it-bites /csharp/sealed-by-default-in-net-when-it-shines-and-when-it-bites/ 301! +/posts/code-of-conduct-and-contributions-in-public-repositories /dev-life/code-of-conduct-and-contributions-in-public-repositories/ 301! +/posts/setup-command-aliases-in-powershell-to-make-life-easier/ /windows/adding-command-aliases-to-power-shell/ 301! +/blog/cleaner-joins-in-ef-core-10-with-leftjoin-and-rightjoin/ /data/cleaner-joins-in-ef-core-10-with-leftjoin-and-rightjoin/ 301! +/blog/code-of-conduct-and-contributions-in-public-repositories /dev-life/code-of-conduct-and-contributions-in-public-repositories/ 301! +/blog/environment-variables-in-azure-functions-with-key-vault/ /cloud/environment-variables-in-azure-functions-with-key-vault/ 301! +/blog/from-layers-to-slices-how-i-ship-faster-aspnet-core-apis /aspnetcore/from-layers-to-slices-how-i-ship-faster-aspnet-core-apis/ 301! +/blog/from-sln-to-slnx-in-minutes-cleaner-diffs-faster-merges/ /windows/from-sln-to-slnx-in-minutes-cleaner-diffs-faster-merges/ 301! +/blog/how-net-10-speeds-up-api-validation-without-code-changes /aspnetcore/how-net-10-speeds-up-api-validation-without-code-changes/ 301! +/blog/repository-pattern-vs-dbcontext-in-entity-framework-core /data/repository-pattern-vs-dbcontext-in-entity-framework-core/ 301! +/blog/tame-configuration-in-aspnet-core-with-ivalidateoptions/ /aspnetcore/tame-configuration-in-aspnet-core-with-ivalidateoptions/ 301! +/posts/setup-command-aliases-in-powershell-to-make-life-easier /windows/adding-command-aliases-to-power-shell/ 301! +/blog/cleaner-joins-in-ef-core-10-with-leftjoin-and-rightjoin /data/cleaner-joins-in-ef-core-10-with-leftjoin-and-rightjoin/ 301! +/blog/environment-variables-in-azure-functions-with-key-vault /cloud/environment-variables-in-azure-functions-with-key-vault/ 301! +/blog/from-sln-to-slnx-in-minutes-cleaner-diffs-faster-merges /windows/from-sln-to-slnx-in-minutes-cleaner-diffs-faster-merges/ 301! +/blog/smarter-error-handling-in-c-try-result-and-fewer-tears/ /csharp/smarter-error-handling-in-c-try-result-and-fewer-tears/ 301! +/blog/tame-configuration-in-aspnet-core-with-ivalidateoptions /aspnetcore/tame-configuration-in-aspnet-core-with-ivalidateoptions/ 301! +/blog/smarter-error-handling-in-c-try-result-and-fewer-tears /csharp/smarter-error-handling-in-c-try-result-and-fewer-tears/ 301! +/blog/using-sql-server-in-docker-containers-for-basic-tasks/ /cloud/using-sql-server-in-docker-containers-for-basic-tasks/ 301! +/blog/building-a-discord-bot-to-improve-inclusive-language/ /dev-life/building-a-discord-bot-to-improve-inclusive-language/ 301! +/blog/choosing-between-dotnet-controllers-and-minimal-apis/ /aspnetcore/choosing-between-dotnet-controllers-and-minimal-apis/ 301! +/blog/using-sql-server-in-docker-containers-for-basic-tasks /cloud/using-sql-server-in-docker-containers-for-basic-tasks/ 301! +/posts/using-netlify-functions-to-add-comments-to-gridsome/ / 301! +/blog/building-a-discord-bot-to-improve-inclusive-language /dev-life/building-a-discord-bot-to-improve-inclusive-language/ 301! +/blog/choosing-between-dotnet-controllers-and-minimal-apis /aspnetcore/choosing-between-dotnet-controllers-and-minimal-apis/ 301! +/posts/using-netlify-functions-to-add-comments-to-gridsome / 301! +/blog/making-a-man-lessons-learned-from-my-single-mother/ /dev-life/making-a-man-lessons-learned-from-my-single-mother/ 301! +/blog/sentiment-analysis-with-opentok-and-azure-face-api/ /cloud/sentiment-analysis-with-opentok-and-azure-face-api/ 301! +/blog/unit-of-work-with-entity-framework-core-done-right/ /data/unit-of-work-with-entity-framework-core-done-right/ 301! +/posts/release-notes-with-github-appveyor-octopus-deploy/ /cloud/automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy/ 301! +/posts/sql-server-in-a-linux-container-to-do-quick-tasks/ /cloud/using-sql-server-in-docker-containers-for-basic-tasks/ 301! +/blog/making-a-man-lessons-learned-from-my-single-mother /dev-life/making-a-man-lessons-learned-from-my-single-mother/ 301! +/blog/sentiment-analysis-with-opentok-and-azure-face-api /cloud/sentiment-analysis-with-opentok-and-azure-face-api/ 301! +/blog/unit-of-work-with-entity-framework-core-done-right /data/unit-of-work-with-entity-framework-core-done-right/ 301! +/posts/release-notes-with-github-appveyor-octopus-deploy /cloud/automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy/ 301! +/posts/sql-server-in-a-linux-container-to-do-quick-tasks /cloud/using-sql-server-in-docker-containers-for-basic-tasks/ 301! +/blog/how-to-update-notion-cover-image-with-javascript/ /cloud/how-to-update-notion-cover-image-with-javascript/ 301! +/blog/10-visual-studio-code-extensions-you-need-today/ /windows/10-visual-studio-code-extensions-you-need-today/ 301! +/blog/how-to-update-notion-cover-image-with-javascript /cloud/how-to-update-notion-cover-image-with-javascript/ 301! +/blog/measure-twice-allocate-once-faster-lists-in-net/ /csharp/measure-twice-allocate-once-faster-lists-in-net/ 301! +/blog/10-visual-studio-code-extensions-you-need-today /windows/10-visual-studio-code-extensions-you-need-today/ 301! +/blog/choosing-between-blazor-server-or-web-assembly/ /blazor/choosing-between-blazor-server-or-web-assembly/ 301! +/blog/measure-twice-allocate-once-faster-lists-in-net /csharp/measure-twice-allocate-once-faster-lists-in-net/ 301! +/blog/using-netlify-functions-faunadb-for-short-urls/ /cloud/using-netlify-functions-faunadb-for-short-urls/ 301! +/blog/choosing-between-blazor-server-or-web-assembly /blazor/choosing-between-blazor-server-or-web-assembly/ 301! +/blog/using-netlify-functions-faunadb-for-short-urls /cloud/using-netlify-functions-faunadb-for-short-urls/ 301! +/blog/building-my-ultimate-rustic-developers-desk/ /dev-life/building-my-ultimate-rustic-developers-desk/ 301! +/blog/ef-core-query-performance-tips-for-everyone/ /data/ef-core-query-performance-tips-for-everyone/ 301! +/blog/using-apollo-to-query-graph-ql-from-node-js/ /dev-life/using-apollo-to-query-graph-ql-from-node-js/ 301! +/posts/using-azure-key-vault-with-azure-functions/ /cloud/environment-variables-in-azure-functions-with-key-vault/ 301! +/blog/building-my-ultimate-rustic-developers-desk /dev-life/building-my-ultimate-rustic-developers-desk/ 301! +/blog/c-14s-unbound-generics-in-nameof-explained/ /csharp/c-14s-unbound-generics-in-nameof-explained/ 301! +/blog/ef-core-query-performance-tips-for-everyone /data/ef-core-query-performance-tips-for-everyone/ 301! +/blog/using-apollo-to-query-graph-ql-from-node-js /dev-life/using-apollo-to-query-graph-ql-from-node-js/ 301! +/blog/using-polywork-to-break-unconscious-biases/ /dev-life/using-polywork-to-break-unconscious-biases/ 301! +/posts/using-azure-key-vault-with-azure-functions /cloud/environment-variables-in-azure-functions-with-key-vault/ 301! +/blog/c-14s-unbound-generics-in-nameof-explained /csharp/c-14s-unbound-generics-in-nameof-explained/ 301! +/blog/using-polywork-to-break-unconscious-biases /dev-life/using-polywork-to-break-unconscious-biases/ 301! +/posts/adding-hateoas-to-an-aspnetcore-rest-api/ /aspnetcore/adding-hateoas-to-an-asp-net-core-api/ 301! +/blog/live-coding-to-learn-share-and-encourage/ /dev-life/live-coding-to-learn-share-and-encourage/ 301! +/blog/primary-constructors-in-csharp-12-dotnet/ /csharp/primary-constructors-in-csharp-12-dotnet/ 301! +/posts/adding-hateoas-to-an-aspnetcore-rest-api /aspnetcore/adding-hateoas-to-an-asp-net-core-api/ 301! +/posts/docker-communication-between-containers/ /cloud/communication-between-containers-using-docker-compose-in-windows/ 301! +/blog/current-twitch-live-coding-stream-setup/ /dev-life/current-twitch-live-coding-stream-setup/ 301! +/blog/live-coding-to-learn-share-and-encourage /dev-life/live-coding-to-learn-share-and-encourage/ 301! +/blog/primary-constructors-in-csharp-12-dotnet /csharp/primary-constructors-in-csharp-12-dotnet/ 301! +/posts/docker-communication-between-containers /cloud/communication-between-containers-using-docker-compose-in-windows/ 301! +/posts/setting-up-raspberry-pi-for-kiosk-mode/ /dev-life/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium/ 301! +/blog/current-twitch-live-coding-stream-setup /dev-life/current-twitch-live-coding-stream-setup/ 301! +/posts/setting-up-raspberry-pi-for-kiosk-mode /dev-life/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium/ 301! +/blog/adding-command-aliases-to-power-shell/ /windows/adding-command-aliases-to-power-shell/ 301! +/blog/adding-hateoas-to-an-asp-net-core-api/ /aspnetcore/adding-hateoas-to-an-asp-net-core-api/ 301! +/blog/using-auto-mapper-with-asp-net-core-3/ /aspnetcore/using-auto-mapper-with-asp-net-core-3/ 301! +/blog/adding-command-aliases-to-power-shell /windows/adding-command-aliases-to-power-shell/ 301! +/blog/adding-hateoas-to-an-asp-net-core-api /aspnetcore/adding-hateoas-to-an-asp-net-core-api/ 301! +/blog/using-auto-mapper-with-asp-net-core-3 /aspnetcore/using-auto-mapper-with-asp-net-core-3/ 301! +/blog/integrating-notion-with-astro-sites/ /dev-life/integrating-notion-with-astro-sites/ 301! +/posts/using-automapper-with-dotnetcore-3/ /aspnetcore/using-auto-mapper-with-asp-net-core-3/ 301! +/blog/integrating-notion-with-astro-sites /dev-life/integrating-notion-with-astro-sites/ 301! +/posts/using-automapper-with-dotnetcore-3 /aspnetcore/using-auto-mapper-with-asp-net-core-3/ 301! +/blog/building-404-pages-that-bring-joy/ /dev-life/building-404-pages-that-bring-joy/ 301! +/blog/building-404-pages-that-bring-joy /dev-life/building-404-pages-that-bring-joy/ 301! +/blog/the-traps-of-nullable-in-c-sharp/ /csharp/the-traps-of-nullable-in-c-sharp/ 301! +/blog/the-traps-of-nullable-in-c-sharp /csharp/the-traps-of-nullable-in-c-sharp/ 301! +/posts/cheers-to-2019-bring-on-2020/ / 301! +/posts/cheers-to-2019-bring-on-2020 / 301! +/blog/alias-any-type-in-csharp-12/ /csharp/alias-any-type-in-csharp-12/ 301! +/blog/cross-platform-nuget-dotnet/ /csharp/cross-platform-nuget-dotnet/ 301! +/blog/alias-any-type-in-csharp-12 /csharp/alias-any-type-in-csharp-12/ 301! +/blog/cross-platform-nuget-dotnet /csharp/cross-platform-nuget-dotnet/ 301! +/blog/girls-who-code/ /dev-life/girls-who-code/ 301! +/blog/girls-who-code /dev-life/girls-who-code/ 301! +/posts/stream-setup/ /dev-life/current-twitch-live-coding-stream-setup/ 301! +/posts/stream-setup /dev-life/current-twitch-live-coding-stream-setup/ 301! +/videos/10/ / 301! +/videos/11/ / 301! +/videos/12/ / 301! +/videos/2/ / 301! +/videos/3/ / 301! +/videos/4/ / 301! +/videos/5/ / 301! +/videos/6/ / 301! +/videos/7/ / 301! +/videos/8/ / 301! +/videos/9/ / 301! +/blog/10/ / 301! +/blog/11/ / 301! +/blog/12/ / 301! +/blog/2/ / 301! +/blog/3/ / 301! +/blog/4/ / 301! +/blog/5/ / 301! +/blog/6/ / 301! +/blog/7/ / 301! +/blog/8/ / 301! +/blog/9/ / 301! +/videos/ / 301! +/blog/ / 301! -# catch alls. These lived in public/netlify.toml, where Netlify never read them, so -# they have not been running. They sit last so the specific rules above win. +# Safety net. Anything under these prefixes that is not named above was never a real +# page, so it goes home rather than 404ing. These must stay last. -/brain-dump/* / 301! -/posts/* /blog/:splat 301! +/brain-dump/* / 301! +/posts/* / 301! diff --git a/scripts/gen-redirects.mjs b/scripts/gen-redirects.mjs new file mode 100644 index 0000000..c7a2bf9 --- /dev/null +++ b/scripts/gen-redirects.mjs @@ -0,0 +1,184 @@ +/* + Redirect map generator. + + Decision 19 requires every old URL to 301 straight to its final destination with no + chains. That rules out the wildcard approach the site runs today, because + /posts/* to /blog/:splat lands on a URL without a trailing slash which then redirects + again, and because /blog/[slug]/ is itself about to become an old URL once topic first + routing lands. + + So every content URL gets an explicit line. Wildcards survive only as a final safety + net for paths that were never real pages. + + Sources, in the order they are applied: + 1. LEGACY_ALIASES below, the pre Astro /posts/ URLs. Hand maintained because there is + no machine readable record of them anywhere. + 2. taxonomy.json, which knows the final URL of every article and video. + 3. Index and pagination routes that no longer exist in v2. + + Run: pnpm redirects +*/ + +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const TAXONOMY = path.join(ROOT, 'src', 'config', 'taxonomy.json'); +const OUT = path.join(ROOT, 'public', '_redirects'); + +/** + * Old Gridsome era URLs, mapped to the content id they became. Resolving the id through + * taxonomy.json rather than hard coding a destination is what keeps these from chaining + * the day a post changes topic. + * + * Measured against production on the day this was written. Every one of these currently + * 301s, so removing one is a regression. + */ +const LEGACY_ALIASES = { + '/posts/adding-hateoas-to-an-aspnetcore-rest-api': 'blog:adding-hateoas-to-an-asp-net-core-api', + '/posts/using-automapper-with-dotnetcore-3': 'blog:using-auto-mapper-with-asp-net-core-3', + '/posts/release-notes-with-github-appveyor-octopus-deploy': + 'blog:automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy', + '/posts/using-azure-key-vault-with-azure-functions': + 'blog:environment-variables-in-azure-functions-with-key-vault', + '/posts/sql-server-in-a-linux-container-to-do-quick-tasks': + 'blog:using-sql-server-in-docker-containers-for-basic-tasks', + // Production sends this one to a slug that does not exist and returns a 404. Pointing + // it at the post that actually carries the content fixes a live broken link. + '/posts/code-of-conduct-and-contributions-in-public-repositories': + 'blog:code-of-conduct-and-contributions-in-public-repositories', + '/posts/setup-command-aliases-in-powershell-to-make-life-easier': + 'blog:adding-command-aliases-to-power-shell', + '/posts/stream-setup': 'blog:current-twitch-live-coding-stream-setup', + '/posts/docker-communication-between-containers': + 'blog:communication-between-containers-using-docker-compose-in-windows', + '/posts/setting-up-raspberry-pi-for-kiosk-mode': + 'blog:setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium' +}; + +/** Old URLs whose content is gone for good. They go home, not to a guess. */ +const RETIRED = [ + '/posts/using-netlify-functions-to-add-comments-to-gridsome/', + '/posts/cheers-to-2019-bring-on-2020/' +]; + +const taxonomy = JSON.parse(fs.readFileSync(TAXONOMY, 'utf8')); +const entries = taxonomy.entries; + +/** old path to new path. A Map so a duplicate source is caught rather than merged. */ +const rules = new Map(); +const problems = []; + +function add(from, to) { + const existing = rules.get(from); + if (existing && existing !== to) { + problems.push(`${from} is claimed by both ${existing} and ${to}`); + return; + } + if (from === to) { + problems.push(`${from} redirects to itself`); + return; + } + rules.set(from, to); +} + +function urlFor(key) { + const e = entries[key]; + if (!e) { + problems.push(`no taxonomy entry for ${key}`); + return null; + } + return e.url; +} + +/* + 1. Every article moves from /blog/[slug]/ to /[topic]/[slug]/. + Both the slashed and unslashed forms are emitted, because the site is + trailingSlash always and an unslashed request would otherwise take a second hop. +*/ +for (const [key, e] of Object.entries(entries)) { + if (!key.startsWith('blog:')) continue; + const slug = key.slice('blog:'.length); + add(`/blog/${slug}/`, e.url); + add(`/blog/${slug}`, e.url); +} + +/* + 2. Legacy /posts/ aliases go straight to the final topic first URL, not to /blog/. + This is the chain that decision 19 exists to prevent. +*/ +for (const [from, key] of Object.entries(LEGACY_ALIASES)) { + const to = urlFor(key); + if (!to) continue; + add(from, to); + add(from + '/', to); +} + +for (const from of RETIRED) { + add(from, '/'); + add(from.replace(/\/$/, ''), '/'); +} + +/* + 3. Index and pagination routes that v2 does not have. Topic pages replace the single + flat blog index, and there is no combined video index either. Home carries the + Fresh rail, so it is the honest destination rather than a topic picked at random. +*/ +add('/blog/', '/'); +add('/videos/', '/'); +for (let n = 2; n <= 12; n++) { + add(`/blog/${n}/`, '/'); + add(`/videos/${n}/`, '/'); +} + +const sorted = [...rules.entries()].sort(([a], [b]) => { + // Longest first so a specific rule can never sit behind a shorter one that also + // matches. Netlify takes the first match in file order. + if (b.length !== a.length) return b.length - a.length; + return a.localeCompare(b); +}); + +const width = + Math.max(...sorted.flatMap(([from, to]) => [from.length, to.length]), '/brain-dump/*'.length) + 2; + +function rule(from, to) { + return `${from.padEnd(width)}${to.padEnd(width)}301!`; +} + +const lines = [ + '# GENERATED by scripts/gen-redirects.mjs. Do not hand edit, run pnpm redirects.', + '#', + '# Decision 19: every old URL 301s straight to its final destination. No chains. That', + '# is why every article has its own line instead of a /blog/* wildcard, and why the', + '# legacy /posts/ aliases point at the topic first URL rather than at /blog/.', + '#', + '# Netlify takes the first match in file order, so specific rules sort before the', + '# wildcards at the bottom.', + '', + `# ${sorted.length} explicit rules`, + '' +]; + +for (const [from, to] of sorted) { + lines.push(rule(from, to)); +} + +lines.push( + '', + '# Safety net. Anything under these prefixes that is not named above was never a real', + '# page, so it goes home rather than 404ing. These must stay last.', + '', + rule('/brain-dump/*', '/'), + rule('/posts/*', '/'), + '' +); + +if (problems.length > 0) { + console.error('redirect map problems:'); + for (const p of problems) console.error(' ' + p); + process.exit(1); +} + +fs.writeFileSync(OUT, lines.join('\n')); +console.log(`${sorted.length} explicit rules plus 2 wildcards, wrote public/_redirects`); diff --git a/scripts/gen-taxonomy.mjs b/scripts/gen-taxonomy.mjs new file mode 100644 index 0000000..23fbcb9 --- /dev/null +++ b/scripts/gen-taxonomy.mjs @@ -0,0 +1,399 @@ +/* + Taxonomy, generated once and then hand reviewed. + + Decision 20 gives the site nine topics and decision 18 makes URLs topic first, which + means every article and video needs exactly one owning topic. The content submodule is + read only from this repo and videos carry no tags at all, so the map lives here. + + This script produces a starting point, not an answer. It scores each item against a + keyword table, writes the winner as primaryTopic and any runner up above the threshold + as alsoFiled, and marks anything it is not confident about so a human can look at it. + Rerunning it never overwrites a decision that has been reviewed: entries already marked + reviewed in the existing taxonomy.json are carried through untouched. + + Run: pnpm taxonomy +*/ + +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import matter from 'gray-matter'; +import YAML from 'yaml'; + +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const CONTENT = path.join(ROOT, 'src', 'content'); +const OUT = path.join(ROOT, 'src', 'config', 'taxonomy.json'); +const OVERRIDES = path.join(ROOT, 'src', 'config', 'taxonomy.overrides.json'); + +/* + Weighted keyword table. Tags count for more than titles because a tag was a deliberate + act and a title word can be incidental. The order inside each topic does not matter. +*/ +const SIGNALS = { + csharp: { + tags: ['csharp', 'c#', 'dotnet', 'linq', 'nuget', 'benchmark', 'algorithms', 'automapper'], + words: [ + 'c#', 'csharp', '.net', 'dotnet', 'linq', 'nuget', 'nullable', 'record', + 'pattern matching', 'generic', 'nameof', 'typeof', 'gettype', 'sealed', + 'partial', 'virtual', 'override', 'parallel', 'span', 'allocat', 'immutab', + 'primary constructor', 'alias any type', 'garbage collect', 'stack vs', + 'heap', 'boxing', 'struct', 'enum', 'interface', 'extension method', + 'async', 'await', 'task', 'threading', 'delegate', 'lambda', 'yield', + 'var keyword', 'tolower', 'string', 'performance', 'benchmark', 'httpclient', + 'serializ', 'reflection', 'attribute', 'operator', 'tuple', 'dispose', + 'idisposable', 'exception', 'switch expression', 'collection', 'array', + 'list<', 'dictionary', 'automapper', 'mediatr', 'polly', 'source generator' + ] + }, + aspnetcore: { + tags: ['aspnet', 'aspnetcore', 'minimal-api', 'api', 'mvc', 'hateoas', 'microservices', 'graphql', 'apollo'], + words: [ + 'asp.net', 'aspnet', 'minimal api', 'web api', 'controller', 'middleware', + 'endpoint', 'routing', 'ivalidateoptions', 'model binding', 'hateoas', + 'vertical slice', 'dependency injection', 'timezoneinfo', 'signalr', + 'razor', 'health check', 'rate limit', 'cors', 'swagger', 'openapi', + 'authentication', 'authoriz', 'jwt', 'identity', 'rest api', 'graphql', + 'microservice', 'grpc', 'webhook' + ] + }, + data: { + tags: ['efcore', 'entity-framework', 'sql', 'sqlite', 'server', 'fauna', 'faunadb', 'json', 'storage'], + words: [ + 'ef core', 'entity framework', 'dbcontext', 'onmodelcreating', 'repository pattern', + 'unit of work', 'sql server', 'sqlite', 'postgres', 'migration', 'query', + 'leftjoin', 'rightjoin', 'interceptor', 'audit logging', 'database', 'lazy loading', + 'eager loading', 'n+1', 'seed data', 'index', 'transaction', 'stored procedure', + 'dapper', 'supabase', 'mongodb', 'redis', 'cosmos' + ] + }, + copilot: { + tags: ['ai', 'openai', 'machine-learning', 'whisper', 'copilot', 'mcp'], + words: [ + 'copilot', 'openai', 'chatgpt', 'whisper', 'llm', 'model context protocol', + 'sentiment analysis', 'speech recognition', 'ai agent', 'prompt', 'semantic kernel', + 'ollama', 'embedding', 'vector', ' ai ', 'ai-', 'machine learning', + 'voice coding', 'transcri' + ] + }, + windows: { + tags: ['windows', 'powershell', 'vscode', 'vs-code', 'visual-studio', 'terminal', 'avalonia', 'ide', 'extensions', 'keyboard', 'font', 'setup', 'alias'], + words: [ + 'windows', 'powershell', 'winui', 'wpf', 'visual studio', 'vs code', + 'vscode', 'terminal', 'command alias', 'slnx', 'winget', 'wsl', + 'shortcut', 'keybind', 'snippet', 'debugger', 'breakpoint', 'profiler', + 'editor', 'theme', 'font', 'dev drive' + ] + }, + cloud: { + tags: ['azure', 'docker', 'container', 'compose', 'serverless', 'functions', 'devops', 'netlify', 'app-service', 'key-vault', 'appveyor', 'octopus-deploy', 'linux', 'pipedream', 'twilio', 'vonage', 'opentok'], + words: [ + 'azure', 'aws', 'docker', 'container', 'kubernetes', 'serverless', + 'netlify', 'vercel', 'key vault', 'app service', 'deploy', 'ci/cd', + 'pipeline', 'github action', 'volume', 'cloud', 'hosting', 'cdn', + 'pipedream', 'twilio', 'zapier', 'lambda function', 'edge function' + ] + }, + 'dev-life': { + tags: [ + 'oss', 'open-source', 'inclusion', 'diversity', 'parenting', 'family-values', + 'productivity', 'twitch', 'stream', 'livestream', 'coding', 'hacktoberfest', + 'code-of-conduct', 'contributions', 'polywork', 'woodworking', 'diy', 'desk', + 'hardware', 'developer-experience', 'testing', 'git', 'github', 'notion', + 'discord', 'nintendo', 'iot', 'raspberry-pi' + ], + words: [ + 'live coding', 'stream', 'community', 'code of conduct', 'contributing', + 'girls who code', 'mother', 'lessons learned', 'desk', 'kiosk', 'raspberry pi', + 'inclusive', 'bias', '404 page', 'joy', 'career', 'burnout', 'imposter', + 'git ', 'github', 'gist', 'pull request', 'commit', 'rebase', 'cherry-pick', + 'stash', 'branch', 'merge conflict', 'open source', 'maintainer', 'mentor', + 'interview', 'salary', 'remote work', 'productivity', 'notion', 'obsidian', + 'bongo cat', 'my setup', 'my desk', 'behind the scenes', 'why i ', + 'i tried', 'disaster', 'mistake', 'lesson' + ] + }, + blazor: { + tags: ['blazor', 'wasm'], + words: ['blazor', 'webassembly', 'render mode'] + }, + mcp: { + tags: ['mcp'], + words: ['model context protocol', 'mcp server'] + } +}; + +const TAG_WEIGHT = 3; +const WORD_WEIGHT = 1; +/** Below this the item is flagged rather than silently filed under a guess. */ +const CONFIDENCE_FLOOR = 3; +/** A runner up at least this fraction of the winner also gets listed as alsoFiled. */ +const ALSO_FILED_RATIO = 0.5; + +/** + * Reserved top level paths. A topic can never be one of these and neither can anything + * that would end up shadowing one. Kept in sync with RESERVED_SLUGS in src/config/site.ts + * by tests/taxonomy.test.mjs rather than by importing across the ts boundary. + */ +const RESERVED = new Set([ + '404', 'about', 'blog', 'builders', 'conduct', 'dev-disasters', 'images', + 'kitchen-sink', 'privacy', 'report', 'rss.xml', 'search', 'settings', + 'sitemap-index.xml', 'submit', 'terms', 'uses', 'videos' +]); + +/** + * Article slugs already exist and are load bearing, so they are never regenerated. + * Videos have never had a page, so their slug is derived from the title once and then + * frozen here by the fact that taxonomy.json is committed. + */ +function slugify(title) { + return title + .toLowerCase() + .normalize('NFKD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/['\u2018\u2019\u201c\u201d]/g, '') + .replace(/&/g, ' and ') + .replace(/\+/g, ' plus ') + .replace(/#/g, 'sharp') + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') + .slice(0, 80) + .replace(/-+$/g, ''); +} + +function normalizeTags(raw) { + if (!Array.isArray(raw)) return []; + return raw + .filter((t) => typeof t === 'string') + .map((t) => t.toLowerCase().trim()) + // Some entries in the back catalogue have body text bleeding into the tag list. + // Anything with a space or a slash in it was never a real tag. + .filter((t) => t && t.length <= 24 && !/[\s/]/.test(t)); +} + +function score(item) { + const tags = new Set(item.tags); + const haystack = `${item.title} ${item.description}`.toLowerCase(); + const scores = {}; + for (const [topic, signal] of Object.entries(SIGNALS)) { + let s = 0; + for (const t of signal.tags) if (tags.has(t)) s += TAG_WEIGHT; + for (const w of signal.words) if (haystack.includes(w)) s += WORD_WEIGHT; + scores[topic] = s; + } + return scores; +} + +function classify(item) { + const scores = score(item); + const ranked = Object.entries(scores) + .filter(([, s]) => s > 0) + .sort((a, b) => b[1] - a[1]); + + if (ranked.length === 0) { + return { primaryTopic: 'dev-life', alsoFiled: [], confidence: 0, needsReview: true }; + } + + const [winner, top] = ranked[0]; + const alsoFiled = ranked + .slice(1) + .filter(([, s]) => s >= top * ALSO_FILED_RATIO) + .map(([t]) => t) + .slice(0, 2); + + // A tie at the top is a real editorial decision, not something to resolve by sort order. + const tied = ranked.filter(([, s]) => s === top).length > 1; + + return { + primaryTopic: winner, + alsoFiled, + confidence: top, + needsReview: tied || top < CONFIDENCE_FLOOR + }; +} + +function readCollection(name) { + const dir = path.join(CONTENT, name); + if (!fs.existsSync(dir)) return []; + return fs + .readdirSync(dir) + .filter((f) => /\.(md|mdx)$/.test(f)) + .map((f) => { + const parsed = matter(fs.readFileSync(path.join(dir, f), 'utf8')); + return { + collection: name, + id: f.replace(/\.(md|mdx)$/, ''), + title: String(parsed.data.title ?? ''), + description: String(parsed.data.description ?? parsed.data.summary ?? ''), + tags: normalizeTags(parsed.data.tags) + }; + }); +} + +function readVideos() { + const dir = path.join(CONTENT, 'videos'); + if (!fs.existsSync(dir)) return []; + // Videos carry no tags and no description, so the title is the only signal there is. + // That is exactly why so many of them come back flagged. + return fs + .readdirSync(dir) + .filter((f) => /\.ya?ml$/.test(f)) + .map((f) => { + const v = YAML.parse(fs.readFileSync(path.join(dir, f), 'utf8')) ?? {}; + return { + collection: 'videos', + id: String(v.id ?? f.replace(/\.ya?ml$/, '')), + title: String(v.title ?? ''), + description: '', + tags: [], + short: Boolean(v.short) + }; + }); +} + +const existing = fs.existsSync(OUT) ? JSON.parse(fs.readFileSync(OUT, 'utf8')) : { entries: {} }; +const overrides = fs.existsSync(OVERRIDES) + ? JSON.parse(fs.readFileSync(OVERRIDES, 'utf8')).overrides ?? {} + : {}; + +const items = [ + ...readCollection('blog'), + // Brain dumps are deliberately absent. They are link roundups, they have never had a + // published URL (/brain-dump/* has redirected to / for years), there is no mockup for + // them and no nav home. v2 keeps that behaviour rather than inventing a page type. + // Add readCollection('brainDumps') here the day a brain dump page gets designed. + ...readVideos() +]; + +const entries = {}; +let reviewed = 0; +let ai = 0; +let flagged = 0; + +for (const item of items) { + const key = `${item.collection}:${item.id}`; + const prior = existing.entries?.[key]; + if (prior?.reviewed) { + entries[key] = prior; + reviewed++; + continue; + } + + const override = overrides[key]; + if (override) { + ai++; + entries[key] = { + primaryTopic: override.primaryTopic, + alsoFiled: override.alsoFiled ?? [], + source: 'ai', + reviewed: false, + title: item.title, + ...(override.note ? { note: override.note } : {}) + }; + continue; + } + + const result = classify(item); + if (result.needsReview) flagged++; + entries[key] = { + primaryTopic: result.primaryTopic, + alsoFiled: result.alsoFiled, + source: 'keyword', + confidence: result.confidence, + needsReview: result.needsReview, + reviewed: false, + title: item.title + }; +} + +// Resolve the final URL for every item. Topic first per decision 18, so the owning +// topic and the slug together are the address. Articles keep the slug they already have +// because those URLs are live. Videos get one derived from the title. +// +// Two items can collide inside a topic, most likely a video that restates an article +// title. The loser takes a numeric suffix rather than either item silently vanishing, +// and the collision is printed so a better title can be chosen deliberately. +const taken = new Map(); +const collisions = []; + +// A topic serves /[topic]/articles/ and /[topic]/videos/ as filter views, so those two +// slugs are spoken for inside every topic before any content is placed. +const TOPIC_FILTERS = ['articles', 'videos']; +for (const topic of Object.keys(SIGNALS)) { + for (const f of TOPIC_FILTERS) taken.set(`${topic}/${f}`, 'reserved filter view'); +} + +for (const item of items) { + const key = `${item.collection}:${item.id}`; + const entry = entries[key]; + const base = item.collection === 'videos' ? slugify(item.title) : item.id; + let slug = base || key.replace(/[^a-z0-9]+/gi, '-').toLowerCase(); + + const inTopic = `${entry.primaryTopic}/${slug}`; + if (taken.has(inTopic)) { collisions.push([key, taken.get(inTopic), inTopic]); + let n = 2; + while (taken.has(`${entry.primaryTopic}/${slug}-${n}`)) n++; + slug = `${slug}-${n}`; + } + taken.set(`${entry.primaryTopic}/${slug}`, key); + + entry.slug = slug; + entry.url = `/${entry.primaryTopic}/${slug}/`; +} + +if (collisions.length > 0) { + console.warn('slug collisions resolved with a numeric suffix:'); + for (const [a, b, at] of collisions) console.warn(` ${at} ${a} vs ${b}`); +} + +// An override that points at nothing means content moved or an id was mistyped, and a +// silently ignored override is worse than a loud one. +const orphans = Object.keys(overrides).filter((k) => !entries[k]); +if (orphans.length > 0) { + console.error('overrides that match no content item:'); + for (const o of orphans) console.error(' ' + o); + process.exitCode = 1; +} + +const TOPIC_IDS = new Set(Object.keys(SIGNALS)); +const badTopics = Object.entries(entries).filter( + ([, v]) => !TOPIC_IDS.has(v.primaryTopic) || v.alsoFiled.some((t) => !TOPIC_IDS.has(t)) +); +if (badTopics.length > 0) { + console.error('entries pointing at a topic that does not exist:'); + for (const [k] of badTopics) console.error(' ' + k); + process.exitCode = 1; +} + +const shadowed = [...TOPIC_IDS].filter((t) => RESERVED.has(t)); +if (shadowed.length > 0) { + console.error('topics that collide with a reserved top level path: ' + shadowed.join(', ')); + process.exitCode = 1; +} + +const byTopic = {}; +for (const e of Object.values(entries)) { + byTopic[e.primaryTopic] = (byTopic[e.primaryTopic] ?? 0) + 1; +} + +fs.writeFileSync( + OUT, + JSON.stringify( + { + $comment: + 'Generated by scripts/gen-taxonomy.mjs, then hand reviewed. Set reviewed to true ' + + 'on an entry and the generator will never touch it again.', + entries + }, + null, + 2 + ) + '\n' +); + +console.log( + `${items.length} items: ${reviewed} human reviewed, ${ai} from the AI pass, ` + + `${items.length - reviewed - ai} from keywords of which ${flagged} need a look\n` +); +for (const [topic, n] of Object.entries(byTopic).sort((a, b) => b[1] - a[1])) { + console.log(String(n).padStart(4), topic); +} +console.log(`\nwrote ${path.relative(ROOT, OUT)}`); diff --git a/scripts/gen-themes.mjs b/scripts/gen-themes.mjs index c22213b..4dbdf61 100644 --- a/scripts/gen-themes.mjs +++ b/scripts/gen-themes.mjs @@ -214,10 +214,28 @@ const block = (sel, t) => `${sel} { /* ---------- Expressive Code theme, built from the resolved tokens ---------- */ -// Code blocks sit on --bg-inset, which is what .code does in app.css, so the generated -// theme has to agree or a code block will not match the panel it sits in. -const ecTheme = (id, t) => ({ - name: id, +/* + One theme, not sixteen. + + Expressive Code inlines a CSS custom property per configured theme onto every syntax + span, so sixteen themes multiplied every code heavy article by sixteen. One real + article measured at 926 KB of HTML, which is a far worse violation of decision 32 than + any amount of JavaScript would have been. + + The fix is to stop copying the colors and start referencing them. Every token + foreground here is var(--tok-*), which resolves against whichever [data-theme] block + themes.css has applied. The same article is 56 KB, the code blocks track the chrome + exactly rather than approximately, and switching theme needs no extra CSS at all. + + Workbench colors still have to be hex because Expressive Code parses them before any + browser sees them. They are overridden by styleOverrides in ec.config.mjs, which does + accept variables, so nothing hex actually reaches the page. The values below are the + bbb-dark surfaces, present only to satisfy the parser. +*/ +const EC_THEME_NAME = 'bbb'; + +const ecTheme = (t) => ({ + name: EC_THEME_NAME, type: t.scheme, semanticHighlighting: true, colors: { @@ -235,7 +253,6 @@ const ecTheme = (id, t) => ({ 'editorWarning.foreground': t.warn, 'editorInfo.foreground': t.info, 'editorHint.foreground': t.hint, - // Frame chrome. Expressive Code draws a title bar and tabs from these. 'titleBar.activeBackground': t.raised, 'titleBar.activeForeground': t.dim, 'tab.activeBackground': t.inset, @@ -249,17 +266,24 @@ const ecTheme = (id, t) => ({ 'terminal.foreground': t.fg }, tokenColors: [ - { scope: ['comment', 'punctuation.definition.comment'], settings: { foreground: t.tok.com, fontStyle: 'italic' } }, - { scope: ['string', 'string.quoted', 'string.template', 'punctuation.definition.string'], settings: { foreground: t.tok.str } }, - { scope: ['constant.numeric', 'constant.language', 'constant.character', 'constant'], settings: { foreground: t.tok.num } }, - { scope: ['keyword', 'storage', 'storage.type', 'storage.modifier', 'keyword.control', 'keyword.operator.expression', 'variable.language'], settings: { foreground: t.tok.key } }, - { scope: ['entity.name.function', 'support.function', 'meta.function-call.generic', 'entity.name.function.member'], settings: { foreground: t.tok.fn } }, - { scope: ['entity.name.type', 'entity.name.class', 'entity.name.namespace', 'support.type', 'support.class', 'entity.other.inherited-class'], settings: { foreground: t.tok.typ } }, - { scope: ['variable', 'variable.other', 'meta.definition.variable', 'entity.name.variable'], settings: { foreground: t.fg } }, - { scope: ['keyword.operator', 'punctuation'], settings: { foreground: t.dim } }, - { scope: ['entity.name.tag'], settings: { foreground: t.tok.key } }, - { scope: ['entity.other.attribute-name'], settings: { foreground: t.tok.fn } }, - { scope: ['invalid', 'invalid.illegal'], settings: { foreground: t.err } } + /* + A scopeless rule is how a TextMate theme spells "default foreground". Without it + every token that matches no scope below, whitespace included, bakes the hex from + colors['editor.foreground'] and stops following the theme. That reads as white on + white the moment somebody picks a light theme. + */ + { settings: { foreground: 'var(--fg)' } }, + { scope: ['comment', 'punctuation.definition.comment'], settings: { foreground: 'var(--tok-com)', fontStyle: 'italic' } }, + { scope: ['string', 'string.quoted', 'string.template', 'punctuation.definition.string'], settings: { foreground: 'var(--tok-str)' } }, + { scope: ['constant.numeric', 'constant.language', 'constant.character', 'constant'], settings: { foreground: 'var(--tok-num)' } }, + { scope: ['keyword', 'storage', 'storage.type', 'storage.modifier', 'keyword.control', 'keyword.operator.expression', 'variable.language'], settings: { foreground: 'var(--tok-key)' } }, + { scope: ['entity.name.function', 'support.function', 'meta.function-call.generic', 'entity.name.function.member'], settings: { foreground: 'var(--tok-fn)' } }, + { scope: ['entity.name.type', 'entity.name.class', 'entity.name.namespace', 'support.type', 'support.class', 'entity.other.inherited-class'], settings: { foreground: 'var(--tok-type)' } }, + { scope: ['variable', 'variable.other', 'meta.definition.variable', 'entity.name.variable'], settings: { foreground: 'var(--fg)' } }, + { scope: ['keyword.operator', 'punctuation'], settings: { foreground: 'var(--fg-dim)' } }, + { scope: ['entity.name.tag'], settings: { foreground: 'var(--tok-key)' } }, + { scope: ['entity.other.attribute-name'], settings: { foreground: 'var(--tok-fn)' } }, + { scope: ['invalid', 'invalid.illegal'], settings: { foreground: 'var(--err)' } } ] }); @@ -319,7 +343,6 @@ const audit = (id, t) => { const css = ['/* Generated by scripts/gen-themes.mjs. Do not hand edit. */\n']; const list = []; -const ec = []; const report = []; // House themes go through the identical guard. No special treatment for our own palette. @@ -332,7 +355,6 @@ for (const t of Object.values(house)) { for (const [id, t] of Object.entries(house)) { css.push(block(`[data-theme="${id}"]`, t)); list.push({ id, name: t.label, scheme: t.scheme, house: true }); - ec.push(ecTheme(id, t)); report.push(audit(id, t)); } @@ -350,7 +372,6 @@ for (const name of PICK) { scheme: t.scheme, house: false }); - ec.push(ecTheme(name, t)); report.push(audit(name, t)); } @@ -379,9 +400,14 @@ fs.writeFileSync( OUT_EC, '// Generated by scripts/gen-themes.mjs. Do not hand edit.\n' + '// A module rather than JSON so ec.config.mjs can import it without a resolver that\n' + - '// changes meaning once the config gets bundled.\n\n' + + '// changes meaning once the config gets bundled.\n' + + '//\n' + + '// One theme, whose token colors are var(--tok-*) references rather than copies.\n' + + '// Sixteen themes made Expressive Code inline sixteen hex values onto every syntax\n' + + '// span, which took one real article to 926 KB of HTML. This is the same article at\n' + + '// 56 KB, and the colors now track the chrome exactly instead of approximately.\n\n' + 'export default ' + - JSON.stringify(ec, null, 2) + + JSON.stringify([ecTheme(house['bbb-dark'])], null, 2) + ';\n' ); diff --git a/src/components/FeedItem.astro b/src/components/FeedItem.astro new file mode 100644 index 0000000..40485dd --- /dev/null +++ b/src/components/FeedItem.astro @@ -0,0 +1,32 @@ +--- +/* + One feed row. Used by the topic pages and by the front page rails. + + The whole row is the link. The kind label, the title, the description and the stats all + sit inside a single anchor so there is exactly one tab stop per item, which is what + keyboard users want out of a list of fifty things. +*/ +import type { Item } from '../lib/content'; + +interface Props { + item: Item; +} + +const { item } = Astro.props; + +const stats: string[] = [item.length]; +if (item.views !== null) { + stats.push(`${item.views.toLocaleString('en-US')} views`); +} +--- + + + {item.kind === 'video' ? 'Video' : 'Article'} + +

{item.title}

+ {item.description &&

{item.description}

} +
+ + {stats.map((s) => {s})} + +
diff --git a/src/config/taxonomy.json b/src/config/taxonomy.json new file mode 100644 index 0000000..48a54bd --- /dev/null +++ b/src/config/taxonomy.json @@ -0,0 +1,1443 @@ +{ + "$comment": "Generated by scripts/gen-taxonomy.mjs, then hand reviewed. Set reviewed to true on an entry and the generator will never touch it again.", + "entries": { + "blog:10-visual-studio-code-extensions-you-need-today": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "10 VS Code Extensions You Need Today", + "slug": "10-visual-studio-code-extensions-you-need-today", + "url": "/windows/10-visual-studio-code-extensions-you-need-today/" + }, + "blog:adding-command-aliases-to-power-shell": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 8, + "needsReview": false, + "reviewed": false, + "title": "Adding command aliases to Powershell", + "slug": "adding-command-aliases-to-power-shell", + "url": "/windows/adding-command-aliases-to-power-shell/" + }, + "blog:adding-hateoas-to-an-asp-net-core-api": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "keyword", + "confidence": 12, + "needsReview": false, + "reviewed": false, + "title": "Adding HATEOAS to an ASP.NET Core API", + "slug": "adding-hateoas-to-an-asp-net-core-api", + "url": "/aspnetcore/adding-hateoas-to-an-asp-net-core-api/" + }, + "blog:alias-any-type-in-csharp-12": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 10, + "needsReview": false, + "reviewed": false, + "title": "Alias any Type with C# 12", + "slug": "alias-any-type-in-csharp-12", + "url": "/csharp/alias-any-type-in-csharp-12/" + }, + "blog:automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy": { + "primaryTopic": "cloud", + "alsoFiled": [ + "dev-life" + ], + "source": "ai", + "reviewed": false, + "title": "Automating release notes with GitHub, AppVeyor and Octopus Deploy", + "slug": "automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy", + "url": "/cloud/automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy/" + }, + "blog:building-404-pages-that-bring-joy": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "Building 404 Pages That Bring Joy", + "slug": "building-404-pages-that-bring-joy", + "url": "/dev-life/building-404-pages-that-bring-joy/" + }, + "blog:building-a-discord-bot-to-improve-inclusive-language": { + "primaryTopic": "dev-life", + "alsoFiled": [ + "cloud" + ], + "source": "keyword", + "confidence": 7, + "needsReview": false, + "reviewed": false, + "title": "Building a Discord Bot to Improve Inclusive Language", + "slug": "building-a-discord-bot-to-improve-inclusive-language", + "url": "/dev-life/building-a-discord-bot-to-improve-inclusive-language/" + }, + "blog:building-my-ultimate-rustic-developers-desk": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "keyword", + "confidence": 10, + "needsReview": false, + "reviewed": false, + "title": "Building my Ultimate Rustic Developers Desk", + "slug": "building-my-ultimate-rustic-developers-desk", + "url": "/dev-life/building-my-ultimate-rustic-developers-desk/" + }, + "blog:c-14s-unbound-generics-in-nameof-explained": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 13, + "needsReview": false, + "reviewed": false, + "title": "C# 14's Unbound Generics in nameof Explained", + "slug": "c-14s-unbound-generics-in-nameof-explained", + "url": "/csharp/c-14s-unbound-generics-in-nameof-explained/" + }, + "blog:choosing-between-blazor-server-or-web-assembly": { + "primaryTopic": "blazor", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Choosing Between Blazor Server or WebAssembly", + "slug": "choosing-between-blazor-server-or-web-assembly", + "url": "/blazor/choosing-between-blazor-server-or-web-assembly/" + }, + "blog:choosing-between-dotnet-controllers-and-minimal-apis": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "keyword", + "confidence": 12, + "needsReview": false, + "reviewed": false, + "title": "Choosing Between Controllers and Minimal API for .NET APIs", + "slug": "choosing-between-dotnet-controllers-and-minimal-apis", + "url": "/aspnetcore/choosing-between-dotnet-controllers-and-minimal-apis/" + }, + "blog:cleaner-joins-in-ef-core-10-with-leftjoin-and-rightjoin": { + "primaryTopic": "data", + "alsoFiled": [], + "source": "keyword", + "confidence": 9, + "needsReview": false, + "reviewed": false, + "title": "Cleaner Joins in EF Core 10 with LeftJoin and RightJoin", + "slug": "cleaner-joins-in-ef-core-10-with-leftjoin-and-rightjoin", + "url": "/data/cleaner-joins-in-ef-core-10-with-leftjoin-and-rightjoin/" + }, + "blog:code-of-conduct-and-contributions-in-public-repositories": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "keyword", + "confidence": 12, + "needsReview": false, + "reviewed": false, + "title": "Using a Code of Conduct and Contributing Guidelines in Public Repositories", + "slug": "code-of-conduct-and-contributions-in-public-repositories", + "url": "/dev-life/code-of-conduct-and-contributions-in-public-repositories/" + }, + "blog:communication-between-containers-using-docker-compose-in-windows": { + "primaryTopic": "cloud", + "alsoFiled": [ + "windows" + ], + "source": "keyword", + "confidence": 8, + "needsReview": false, + "reviewed": false, + "title": "Communication between containers using docker compose in Windows", + "slug": "communication-between-containers-using-docker-compose-in-windows", + "url": "/cloud/communication-between-containers-using-docker-compose-in-windows/" + }, + "blog:cross-platform-nuget-dotnet": { + "primaryTopic": "csharp", + "alsoFiled": [ + "dev-life" + ], + "source": "ai", + "reviewed": false, + "title": "Building a Cross Platform NuGet Package", + "slug": "cross-platform-nuget-dotnet", + "url": "/csharp/cross-platform-nuget-dotnet/" + }, + "blog:current-twitch-live-coding-stream-setup": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "keyword", + "confidence": 7, + "needsReview": false, + "reviewed": false, + "title": "Current Twitch live-coding stream setup", + "slug": "current-twitch-live-coding-stream-setup", + "url": "/dev-life/current-twitch-live-coding-stream-setup/" + }, + "blog:ef-core-audit-logging-with-interceptors-that-do-not-clutter-your-dbcontext": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "EF Core Audit Logging with Interceptors that do not Clutter Your DbContext", + "slug": "ef-core-audit-logging-with-interceptors-that-do-not-clutter-your-dbcontext", + "url": "/data/ef-core-audit-logging-with-interceptors-that-do-not-clutter-your-dbcontext/" + }, + "blog:ef-core-query-performance-tips-for-everyone": { + "primaryTopic": "data", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "EF Core Query Performance Tips for Everyone", + "slug": "ef-core-query-performance-tips-for-everyone", + "url": "/data/ef-core-query-performance-tips-for-everyone/" + }, + "blog:email-phone-call-transcripts-with-twilio-studio-and-pipedream": { + "primaryTopic": "cloud", + "alsoFiled": [], + "source": "keyword", + "confidence": 8, + "needsReview": false, + "reviewed": false, + "title": "How to Email Phone Call Transcripts with Twilio Studio and Pipedream", + "slug": "email-phone-call-transcripts-with-twilio-studio-and-pipedream", + "url": "/cloud/email-phone-call-transcripts-with-twilio-studio-and-pipedream/" + }, + "blog:environment-variables-in-azure-functions-with-key-vault": { + "primaryTopic": "cloud", + "alsoFiled": [], + "source": "keyword", + "confidence": 12, + "needsReview": false, + "reviewed": false, + "title": "Environment Variables in Azure Functions with Key Vault", + "slug": "environment-variables-in-azure-functions-with-key-vault", + "url": "/cloud/environment-variables-in-azure-functions-with-key-vault/" + }, + "blog:five-di-anti-patterns-haunting-net-apps-and-how-to-fix-them": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Five DI Anti-Patterns Haunting .NET Apps and how to fix Them", + "slug": "five-di-anti-patterns-haunting-net-apps-and-how-to-fix-them", + "url": "/aspnetcore/five-di-anti-patterns-haunting-net-apps-and-how-to-fix-them/" + }, + "blog:from-layers-to-slices-how-i-ship-faster-aspnet-core-apis": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "From Layers to Slices: How I Ship Faster ASP.NET Core APIs", + "slug": "from-layers-to-slices-how-i-ship-faster-aspnet-core-apis", + "url": "/aspnetcore/from-layers-to-slices-how-i-ship-faster-aspnet-core-apis/" + }, + "blog:from-sln-to-slnx-in-minutes-cleaner-diffs-faster-merges": { + "primaryTopic": "windows", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "From sln to slnx in Minutes: Cleaner Diffs, Faster Merges", + "slug": "from-sln-to-slnx-in-minutes-cleaner-diffs-faster-merges", + "url": "/windows/from-sln-to-slnx-in-minutes-cleaner-diffs-faster-merges/" + }, + "blog:girls-who-code": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "keyword", + "confidence": 4, + "needsReview": false, + "reviewed": false, + "title": "Girls Who Code", + "slug": "girls-who-code", + "url": "/dev-life/girls-who-code/" + }, + "blog:how-net-10-speeds-up-api-validation-without-code-changes": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "How .NET 10 speeds up API validation without code changes", + "slug": "how-net-10-speeds-up-api-validation-without-code-changes", + "url": "/aspnetcore/how-net-10-speeds-up-api-validation-without-code-changes/" + }, + "blog:how-to-update-notion-cover-image-with-javascript": { + "primaryTopic": "cloud", + "alsoFiled": [ + "dev-life" + ], + "source": "keyword", + "confidence": 4, + "needsReview": true, + "reviewed": false, + "title": "Updating Notion Cover Images with Pipedream and JavaScript", + "slug": "how-to-update-notion-cover-image-with-javascript", + "url": "/cloud/how-to-update-notion-cover-image-with-javascript/" + }, + "blog:how-to-use-whisper-openais-speech-recognition-model-in-1-minute": { + "primaryTopic": "copilot", + "alsoFiled": [], + "source": "keyword", + "confidence": 12, + "needsReview": false, + "reviewed": false, + "title": "Try Whisper: OpenAI's Speech Recognition Model in 1 Minute", + "slug": "how-to-use-whisper-openais-speech-recognition-model-in-1-minute", + "url": "/copilot/how-to-use-whisper-openais-speech-recognition-model-in-1-minute/" + }, + "blog:integrating-notion-with-astro-sites": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "Integrating a Notion Database with an Astro Site", + "note": "No topic covers Astro or front end web. Same gap as the Apollo post.", + "slug": "integrating-notion-with-astro-sites", + "url": "/dev-life/integrating-notion-with-astro-sites/" + }, + "blog:live-coding-to-learn-share-and-encourage": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "keyword", + "confidence": 9, + "needsReview": false, + "reviewed": false, + "title": "Live-Coding to Learn, Share and Encourage", + "slug": "live-coding-to-learn-share-and-encourage", + "url": "/dev-life/live-coding-to-learn-share-and-encourage/" + }, + "blog:making-a-man-lessons-learned-from-my-single-mother": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "keyword", + "confidence": 9, + "needsReview": false, + "reviewed": false, + "title": "Making a Man: Lessons Learned from My Single Mother", + "slug": "making-a-man-lessons-learned-from-my-single-mother", + "url": "/dev-life/making-a-man-lessons-learned-from-my-single-mother/" + }, + "blog:measure-twice-allocate-once-faster-lists-in-net": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 8, + "needsReview": false, + "reviewed": false, + "title": "Measure Twice Allocate Once: Faster Lists in .NET", + "slug": "measure-twice-allocate-once-faster-lists-in-net", + "url": "/csharp/measure-twice-allocate-once-faster-lists-in-net/" + }, + "blog:primary-constructors-in-csharp-12-dotnet": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 10, + "needsReview": false, + "reviewed": false, + "title": "Using Primary Constructors in C# 12 & .NET 8", + "slug": "primary-constructors-in-csharp-12-dotnet", + "url": "/csharp/primary-constructors-in-csharp-12-dotnet/" + }, + "blog:repository-pattern-vs-dbcontext-in-entity-framework-core": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Repository Pattern vs DbContext in Entity Framework Core", + "slug": "repository-pattern-vs-dbcontext-in-entity-framework-core", + "url": "/data/repository-pattern-vs-dbcontext-in-entity-framework-core/" + }, + "blog:sealed-by-default-in-net-when-it-shines-and-when-it-bites": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 10, + "needsReview": false, + "reviewed": false, + "title": "Sealed by Default in .NET: when it Shines and when it Bites", + "slug": "sealed-by-default-in-net-when-it-shines-and-when-it-bites", + "url": "/csharp/sealed-by-default-in-net-when-it-shines-and-when-it-bites/" + }, + "blog:sentiment-analysis-with-opentok-and-azure-face-api": { + "primaryTopic": "cloud", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "I See What You're Saying: Sentiment Analysis With OpenTok and Azure Face API", + "slug": "sentiment-analysis-with-opentok-and-azure-face-api", + "url": "/cloud/sentiment-analysis-with-opentok-and-azure-face-api/" + }, + "blog:setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "keyword", + "confidence": 8, + "needsReview": false, + "reviewed": false, + "title": "Setting up Raspberry Pi for use in kiosk mode with Chromium", + "slug": "setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium", + "url": "/dev-life/setting-up-raspberry-pi-for-use-in-kiosk-mode-with-chromium/" + }, + "blog:smarter-error-handling-in-c-try-result-and-fewer-tears": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 9, + "needsReview": false, + "reviewed": false, + "title": "Smarter Error Handling in C#: Try, Result and Fewer Tears", + "slug": "smarter-error-handling-in-c-try-result-and-fewer-tears", + "url": "/csharp/smarter-error-handling-in-c-try-result-and-fewer-tears/" + }, + "blog:stop-breaking-clocks-in-aspnet-core-with-utc-and-timezoneinfo": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Stop Breaking Clocks in ASP.NET Core with UTC and TimeZoneInfo", + "slug": "stop-breaking-clocks-in-aspnet-core-with-utc-and-timezoneinfo", + "url": "/aspnetcore/stop-breaking-clocks-in-aspnet-core-with-utc-and-timezoneinfo/" + }, + "blog:stop-guessing-types-in-c-typeof-gettype-and-isassignablefrom-explained": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 12, + "needsReview": false, + "reviewed": false, + "title": "Stop Guessing Types in C#: typeof, GetType and IsAssignableFrom Explained", + "slug": "stop-guessing-types-in-c-typeof-gettype-and-isassignablefrom-explained", + "url": "/csharp/stop-guessing-types-in-c-typeof-gettype-and-isassignablefrom-explained/" + }, + "blog:stop-parallelizing-everything-a-practical-guide-to-parallelforeach": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 9, + "needsReview": false, + "reviewed": false, + "title": "Stop Parallelizing Everything: A Practical Guide to Parallel.ForEach", + "slug": "stop-parallelizing-everything-a-practical-guide-to-parallelforeach", + "url": "/csharp/stop-parallelizing-everything-a-practical-guide-to-parallelforeach/" + }, + "blog:tame-configuration-in-aspnet-core-with-ivalidateoptions": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Tame Configuration in ASP.NET Core with IValidateOptions", + "slug": "tame-configuration-in-aspnet-core-with-ivalidateoptions", + "url": "/aspnetcore/tame-configuration-in-aspnet-core-with-ivalidateoptions/" + }, + "blog:the-traps-of-nullable-in-c-sharp": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 12, + "needsReview": false, + "reviewed": false, + "title": "The Traps of Nullable in C#: a Practical Guide with Tiny Examples", + "slug": "the-traps-of-nullable-in-c-sharp", + "url": "/csharp/the-traps-of-nullable-in-c-sharp/" + }, + "blog:unit-of-work-with-entity-framework-core-done-right": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Unit of Work with Entity Framework Core Done Right", + "slug": "unit-of-work-with-entity-framework-core-done-right", + "url": "/data/unit-of-work-with-entity-framework-core-done-right/" + }, + "blog:using-apollo-to-query-graph-ql-from-node-js": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "Using Apollo to Query GraphQL from Node.js", + "note": "No topic covers Node and GraphQL. Filed under dev-life as the least wrong home. See the topic coverage gap.", + "slug": "using-apollo-to-query-graph-ql-from-node-js", + "url": "/dev-life/using-apollo-to-query-graph-ql-from-node-js/" + }, + "blog:using-auto-mapper-with-asp-net-core-3": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Using AutoMapper with ASP.NET Core 3", + "slug": "using-auto-mapper-with-asp-net-core-3", + "url": "/aspnetcore/using-auto-mapper-with-asp-net-core-3/" + }, + "blog:using-azure-file-storage-as-container-volume-mounts-in-app-services": { + "primaryTopic": "cloud", + "alsoFiled": [], + "source": "keyword", + "confidence": 16, + "needsReview": false, + "reviewed": false, + "title": "Using Azure File Storage as Container Volume Mounts in App Services", + "slug": "using-azure-file-storage-as-container-volume-mounts-in-app-services", + "url": "/cloud/using-azure-file-storage-as-container-volume-mounts-in-app-services/" + }, + "blog:using-netlify-functions-faunadb-for-short-urls": { + "primaryTopic": "cloud", + "alsoFiled": [], + "source": "keyword", + "confidence": 7, + "needsReview": false, + "reviewed": false, + "title": "Creating Short URLs with Netlify Functions and FaunaDb", + "slug": "using-netlify-functions-faunadb-for-short-urls", + "url": "/cloud/using-netlify-functions-faunadb-for-short-urls/" + }, + "blog:using-polywork-to-break-unconscious-biases": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "keyword", + "confidence": 10, + "needsReview": false, + "reviewed": false, + "title": "Using Polywork to Break My Unconscious Biases", + "slug": "using-polywork-to-break-unconscious-biases", + "url": "/dev-life/using-polywork-to-break-unconscious-biases/" + }, + "blog:using-sql-server-in-docker-containers-for-basic-tasks": { + "primaryTopic": "cloud", + "alsoFiled": [], + "source": "keyword", + "confidence": 11, + "needsReview": false, + "reviewed": false, + "title": "Using SQL Server in Docker containers for basic tasks", + "slug": "using-sql-server-in-docker-containers-for-basic-tasks", + "url": "/cloud/using-sql-server-in-docker-containers-for-basic-tasks/" + }, + "blog:virtual-vs-override-vs-partial-in-c-explained-with-small-runnable-examples": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 11, + "needsReview": false, + "reviewed": false, + "title": "Virtual vs Override vs Partial in C# Explained with Small Runnable Examples", + "slug": "virtual-vs-override-vs-partial-in-c-explained-with-small-runnable-examples", + "url": "/csharp/virtual-vs-override-vs-partial-in-c-explained-with-small-runnable-examples/" + }, + "videos:-uGeyE1TSs8": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Keep Track of VS Code Windows with Peacock", + "slug": "keep-track-of-vs-code-windows-with-peacock", + "url": "/windows/keep-track-of-vs-code-windows-with-peacock/" + }, + "videos:0NUUMMRwUbA": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Slow Entity Framework Core queries? Let’s speed them up!", + "slug": "slow-entity-framework-core-queries-lets-speed-them-up", + "url": "/data/slow-entity-framework-core-queries-lets-speed-them-up/" + }, + "videos:0pA6c2Ua_7E": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Alias Any Type in C# 12", + "slug": "alias-any-type-in-csharp-12-2", + "url": "/csharp/alias-any-type-in-csharp-12-2/" + }, + "videos:159lzdcz3cU": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "The Best C# Collections Explained", + "slug": "the-best-csharp-collections-explained", + "url": "/csharp/the-best-csharp-collections-explained/" + }, + "videos:3Pn1_fHi7mI": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Value Types in C#", + "slug": "value-types-in-csharp", + "url": "/csharp/value-types-in-csharp/" + }, + "videos:3W9Z4Jr-CRI": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "C# '== null': There's a Better Way!", + "slug": "csharp-null-theres-a-better-way", + "url": "/csharp/csharp-null-theres-a-better-way/" + }, + "videos:3WrpRcjzUp0": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Should You be Using the var Keyword in C#?", + "slug": "should-you-be-using-the-var-keyword-in-csharp", + "url": "/csharp/should-you-be-using-the-var-keyword-in-csharp/" + }, + "videos:4WsST_9MX_4": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Async Void in C#: The Trap Card You Keep Playing", + "slug": "async-void-in-csharp-the-trap-card-you-keep-playing", + "url": "/csharp/async-void-in-csharp-the-trap-card-you-keep-playing/" + }, + "videos:4YcSDHCttLg": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Don't Make This Dependency Injection Mistake!", + "slug": "dont-make-this-dependency-injection-mistake", + "url": "/aspnetcore/dont-make-this-dependency-injection-mistake/" + }, + "videos:51d4fQqSg9M": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "You Should Probably Stop Using Task.Wait in C#", + "slug": "you-should-probably-stop-using-task-wait-in-csharp", + "url": "/csharp/you-should-probably-stop-using-task-wait-in-csharp/" + }, + "videos:5uWJ3YXW1BI": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "What is the Record Type in C#?", + "slug": "what-is-the-record-type-in-csharp", + "url": "/csharp/what-is-the-record-type-in-csharp/" + }, + "videos:6I7v_mHbRYI": { + "primaryTopic": "data", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "EF Core Queries Go BOOM!", + "slug": "ef-core-queries-go-boom", + "url": "/data/ef-core-queries-go-boom/" + }, + "videos:6Xb7c3-cxNo": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Immutability in .NET just got a LOT easier", + "slug": "immutability-in-net-just-got-a-lot-easier", + "url": "/csharp/immutability-in-net-just-got-a-lot-easier/" + }, + "videos:6Yt35l-VQt0": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "ToLower is Killing your App Performance!", + "slug": "tolower-is-killing-your-app-performance", + "url": "/csharp/tolower-is-killing-your-app-performance/" + }, + "videos:70jllnMbGTY": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "MVC vs. Minimal API vs. FastEndpoints - Which is Best for Your Project?", + "slug": "mvc-vs-minimal-api-vs-fastendpoints-which-is-best-for-your-project", + "url": "/aspnetcore/mvc-vs-minimal-api-vs-fastendpoints-which-is-best-for-your-project/" + }, + "videos:71qFZUyKCy0": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Easy LINQ Tips Every Developer Should Know!", + "slug": "easy-linq-tips-every-developer-should-know", + "url": "/csharp/easy-linq-tips-every-developer-should-know/" + }, + "videos:7fk7jDrtvTs": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Make Entity Framework Faster with Parameterized Queries", + "slug": "make-entity-framework-faster-with-parameterized-queries", + "url": "/data/make-entity-framework-faster-with-parameterized-queries/" + }, + "videos:87ZEZpCCyUw": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Better C# Anonymous Functions & Lambdas", + "slug": "better-csharp-anonymous-functions-and-lambdas", + "url": "/csharp/better-csharp-anonymous-functions-and-lambdas/" + }, + "videos:922cq8unreM": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "Can One Letter Break Your App!?", + "note": "Title gives nothing away. Best guess from the surrounding C# run. Worth a human look.", + "slug": "can-one-letter-break-your-app", + "url": "/csharp/can-one-letter-break-your-app/" + }, + "videos:9nXXWOHjU24": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Mastering CSV with VS Code", + "slug": "mastering-csv-with-vs-code", + "url": "/windows/mastering-csv-with-vs-code/" + }, + "videos:A4hNd2AS_VI": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Stop misspelling code in VS Code!", + "slug": "stop-misspelling-code-in-vs-code", + "url": "/windows/stop-misspelling-code-in-vs-code/" + }, + "videos:AFrMhIvvGZU": { + "primaryTopic": "blazor", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": ".NET Blazor movie trailer", + "slug": "net-blazor-movie-trailer", + "url": "/blazor/net-blazor-movie-trailer/" + }, + "videos:aqAJhgTAJFI": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 3, + "needsReview": false, + "reviewed": false, + "title": "Stack vs. Heap in .NET", + "slug": "stack-vs-heap-in-net", + "url": "/csharp/stack-vs-heap-in-net/" + }, + "videos:Au-mvccHuC8": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Screenshot your Code in VS Code", + "slug": "screenshot-your-code-in-vs-code", + "url": "/windows/screenshot-your-code-in-vs-code/" + }, + "videos:B9C4iK8IGbQ": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Soft Deletes: The Upgrade Your EF Core Needs", + "slug": "soft-deletes-the-upgrade-your-ef-core-needs", + "url": "/data/soft-deletes-the-upgrade-your-ef-core-needs/" + }, + "videos:BdnpTrviJko": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Should you await Inside Your C# Loops?", + "slug": "should-you-await-inside-your-csharp-loops", + "url": "/csharp/should-you-await-inside-your-csharp-loops/" + }, + "videos:BGvYjLgo-Uk": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "Bongo cat loves my code! ", + "slug": "bongo-cat-loves-my-code", + "url": "/dev-life/bongo-cat-loves-my-code/" + }, + "videos:bKdu1eDFu04": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 3, + "needsReview": false, + "reviewed": false, + "title": "C# Has New Primary Constructors", + "slug": "csharp-has-new-primary-constructors", + "url": "/csharp/csharp-has-new-primary-constructors/" + }, + "videos:BKeaojX45w0": { + "primaryTopic": "copilot", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Building AI with .NET: ChatGPT 4o, Dall-E 3 & Whisper", + "slug": "building-ai-with-net-chatgpt-4o-dall-e-3-and-whisper", + "url": "/copilot/building-ai-with-net-chatgpt-4o-dall-e-3-and-whisper/" + }, + "videos:Bwp7PxsfMCI": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Should LINQ Be Banned from C#!?", + "slug": "should-linq-be-banned-from-csharp", + "url": "/csharp/should-linq-be-banned-from-csharp/" + }, + "videos:BWSX0cQEh8k": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "How to Create a Custom HttpClient Logger (2024)", + "slug": "how-to-create-a-custom-httpclient-logger-2024", + "url": "/csharp/how-to-create-a-custom-httpclient-logger-2024/" + }, + "videos:CFKhuEGY8IU": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "How to REALLY use git stash (save your work!)", + "slug": "how-to-really-use-git-stash-save-your-work", + "url": "/dev-life/how-to-really-use-git-stash-save-your-work/" + }, + "videos:CLByGM0iATY": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "The Secret to Mastering Queue, Stack and Dictionary in C#!", + "slug": "the-secret-to-mastering-queue-stack-and-dictionary-in-csharp", + "url": "/csharp/the-secret-to-mastering-queue-stack-and-dictionary-in-csharp/" + }, + "videos:CLfz_CDnSV4": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Testing APIs with REST Client in VS Code", + "slug": "testing-apis-with-rest-client-in-vs-code", + "url": "/windows/testing-apis-with-rest-client-in-vs-code/" + }, + "videos:CR2Kigxx2rM": { + "primaryTopic": "copilot", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Why .NET AI Smart Components are game-changing", + "slug": "why-net-ai-smart-components-are-game-changing", + "url": "/copilot/why-net-ai-smart-components-are-game-changing/" + }, + "videos:cu4CUJAcJ-4": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Building Custom Middleware for ASP.NET Core", + "slug": "building-custom-middleware-for-asp-net-core", + "url": "/aspnetcore/building-custom-middleware-for-asp-net-core/" + }, + "videos:d0Eah9-t9tY": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Handle ASP.NET Core Exceptions Globally", + "slug": "handle-asp-net-core-exceptions-globally", + "url": "/aspnetcore/handle-asp-net-core-exceptions-globally/" + }, + "videos:DNzAoLwXLzc": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "Stop Using ToLower() for Comparisons! The Fast, Correct Way in C#", + "slug": "stop-using-tolower-for-comparisons-the-fast-correct-way-in-csharp", + "url": "/csharp/stop-using-tolower-for-comparisons-the-fast-correct-way-in-csharp/" + }, + "videos:eq3z_ZiLraw": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "You Won't Believe The Hidden Dangers Of Lazy Loading", + "slug": "you-wont-believe-the-hidden-dangers-of-lazy-loading", + "url": "/data/you-wont-believe-the-hidden-dangers-of-lazy-loading/" + }, + "videos:Fi5bTG7yqsM": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "Write Better TailwindCSS in VS Code", + "note": "TailwindCSS, but the video is about the VS Code extension so the tooling topic fits better than a front end topic that does not exist.", + "slug": "write-better-tailwindcss-in-vs-code", + "url": "/windows/write-better-tailwindcss-in-vs-code/" + }, + "videos:G9ikl4r2ijo": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "How Pattern Matching Saves Your Day!", + "slug": "how-pattern-matching-saves-your-day", + "url": "/csharp/how-pattern-matching-saves-your-day/" + }, + "videos:HAybBV-A1Gg": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 3, + "needsReview": false, + "reviewed": false, + "title": "C#: Class, Struct or Record - Which Should You Choose?", + "slug": "csharp-class-struct-or-record-which-should-you-choose", + "url": "/csharp/csharp-class-struct-or-record-which-should-you-choose/" + }, + "videos:hF4rRRQDY1g": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Screenshot VS Code like a pro 📸", + "slug": "screenshot-vs-code-like-a-pro", + "url": "/windows/screenshot-vs-code-like-a-pro/" + }, + "videos:i4jsvC_mzPI": { + "primaryTopic": "dev-life", + "alsoFiled": [ + "copilot" + ], + "source": "ai", + "reviewed": false, + "title": "What if AI takes developer jobs!?", + "slug": "what-if-ai-takes-developer-jobs", + "url": "/dev-life/what-if-ai-takes-developer-jobs/" + }, + "videos:IZveVNSzrqY": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Don't Make These Entity Framework Core Mistakes", + "slug": "dont-make-these-entity-framework-core-mistakes", + "url": "/data/dont-make-these-entity-framework-core-mistakes/" + }, + "videos:jDb8WXFqqFQ": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "How I Added a Full eSignature Workflow to my ASP.NET Core App", + "slug": "how-i-added-a-full-esignature-workflow-to-my-asp-net-core-app", + "url": "/aspnetcore/how-i-added-a-full-esignature-workflow-to-my-asp-net-core-app/" + }, + "videos:JkvYc1u9Fl4": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "What is GitHub Gist?", + "slug": "what-is-github-gist", + "url": "/dev-life/what-is-github-gist/" + }, + "videos:jqG5hYArC_Q": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Stop Using the var Keyword!", + "slug": "stop-using-the-var-keyword", + "url": "/csharp/stop-using-the-var-keyword/" + }, + "videos:kOpWDo6pcCU": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Format Your Code in VS Code with Prettier", + "slug": "format-your-code-in-vs-code-with-prettier", + "url": "/windows/format-your-code-in-vs-code-with-prettier/" + }, + "videos:KQtYl4tIivI": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "HTML in VS Code = Easy Mode", + "slug": "html-in-vs-code-easy-mode", + "url": "/windows/html-in-vs-code-easy-mode/" + }, + "videos:ku2K9mTMJBU": { + "primaryTopic": "windows", + "alsoFiled": [ + "dev-life" + ], + "source": "ai", + "reviewed": false, + "title": "Edit GitHub Gists in VS Code!", + "slug": "edit-github-gists-in-vs-code", + "url": "/windows/edit-github-gists-in-vs-code/" + }, + "videos:ls1ngodlPZ8": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 2, + "needsReview": true, + "reviewed": false, + "title": "String or string in C#?", + "slug": "string-or-string-in-csharp", + "url": "/csharp/string-or-string-in-csharp/" + }, + "videos:m50iQuELqeQ": { + "primaryTopic": "data", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Why Your OnModelCreating Is a Hot Mess (And How to Fix It)", + "slug": "why-your-onmodelcreating-is-a-hot-mess-and-how-to-fix-it", + "url": "/data/why-your-onmodelcreating-is-a-hot-mess-and-how-to-fix-it/" + }, + "videos:Mccqa_Z8-DY": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Fix Ambiguous Constructors in ASP.NET Dependency Injection!", + "slug": "fix-ambiguous-constructors-in-asp-net-dependency-injection", + "url": "/aspnetcore/fix-ambiguous-constructors-in-asp-net-dependency-injection/" + }, + "videos:MQciYVuS6cM": { + "primaryTopic": "dev-life", + "alsoFiled": [ + "copilot" + ], + "source": "ai", + "reviewed": false, + "title": "I Tried Voice Coding, It Was A Disaster!", + "slug": "i-tried-voice-coding-it-was-a-disaster", + "url": "/dev-life/i-tried-voice-coding-it-was-a-disaster/" + }, + "videos:NfgYfqQBc_8": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Lint Markdown in VS Code", + "slug": "lint-markdown-in-vs-code", + "url": "/windows/lint-markdown-in-vs-code/" + }, + "videos:nIq2YPPm6es": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "I Don't Hate YAML Anymore! ", + "slug": "i-dont-hate-yaml-anymore", + "url": "/windows/i-dont-hate-yaml-anymore/" + }, + "videos:NNvuABk_XtY": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "How has .NET not had this before!?", + "slug": "how-has-net-not-had-this-before", + "url": "/csharp/how-has-net-not-had-this-before/" + }, + "videos:NZ-4z3J2xy0": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Dependency Injection Mistakes You Need to Avoid!", + "slug": "dependency-injection-mistakes-you-need-to-avoid", + "url": "/aspnetcore/dependency-injection-mistakes-you-need-to-avoid/" + }, + "videos:OBcWUJZuceA": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Build Unity games in VS Code!", + "slug": "build-unity-games-in-vs-code", + "url": "/windows/build-unity-games-in-vs-code/" + }, + "videos:OjkbonKOzec": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "VSCode's New YAML Support is AWESOME", + "slug": "vscodes-new-yaml-support-is-awesome", + "url": "/windows/vscodes-new-yaml-support-is-awesome/" + }, + "videos:p24vnBYWSQQ": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Bracket Pair Colorizer 2 - VS Code Extension Highlight", + "slug": "bracket-pair-colorizer-2-vs-code-extension-highlight", + "url": "/windows/bracket-pair-colorizer-2-vs-code-extension-highlight/" + }, + "videos:q7J050yovuo": { + "primaryTopic": "cloud", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "Azure File Shares as Container Volume Mounts", + "slug": "azure-file-shares-as-container-volume-mounts", + "url": "/cloud/azure-file-shares-as-container-volume-mounts/" + }, + "videos:s7fK0owVO3s": { + "primaryTopic": "windows", + "alsoFiled": [ + "dev-life" + ], + "source": "ai", + "reviewed": false, + "title": "I Tried NeoVIM", + "slug": "i-tried-neovim", + "url": "/windows/i-tried-neovim/" + }, + "videos:sEZstSgt-vo": { + "primaryTopic": "csharp", + "alsoFiled": [ + "dev-life" + ], + "source": "ai", + "reviewed": false, + "title": "Are People Wrong About .NET?", + "slug": "are-people-wrong-about-net", + "url": "/csharp/are-people-wrong-about-net/" + }, + "videos:tgEBSuqD4w4": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "I’ve Never Built this for a Client", + "slug": "ive-never-built-this-for-a-client", + "url": "/dev-life/ive-never-built-this-for-a-client/" + }, + "videos:tnTzsR1K8Eo": { + "primaryTopic": "aspnetcore", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "It's ALWAYS CORS!!!!", + "slug": "its-always-cors", + "url": "/aspnetcore/its-always-cors/" + }, + "videos:ToFqISWq4is": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "Should my Services be Transient, Scoped, or Singleton?", + "slug": "should-my-services-be-transient-scoped-or-singleton", + "url": "/aspnetcore/should-my-services-be-transient-scoped-or-singleton/" + }, + "videos:tP5bhciEyHE": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Take Me Home VS Code", + "slug": "take-me-home-vs-code", + "url": "/windows/take-me-home-vs-code/" + }, + "videos:U3u4PEkW33E": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Stop Using == null: The Safer C# Pattern You Need Today!", + "slug": "stop-using-null-the-safer-csharp-pattern-you-need-today", + "url": "/csharp/stop-using-null-the-safer-csharp-pattern-you-need-today/" + }, + "videos:v-nKgRil02A": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "Where's my code!?", + "note": "Reads as a git video from the neighbouring titles. Worth a human look.", + "slug": "wheres-my-code", + "url": "/dev-life/wheres-my-code/" + }, + "videos:VWbHiXN3mno": { + "primaryTopic": "windows", + "alsoFiled": [ + "dev-life" + ], + "source": "ai", + "reviewed": false, + "title": "Manage GitHub Pull Requests & Issues with VS Code", + "slug": "manage-github-pull-requests-and-issues-with-vs-code", + "url": "/windows/manage-github-pull-requests-and-issues-with-vs-code/" + }, + "videos:VwIf_3TN3Us": { + "primaryTopic": "csharp", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Reference Types in C#", + "slug": "reference-types-in-csharp", + "url": "/csharp/reference-types-in-csharp/" + }, + "videos:VYKtLWCv0tY": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "What is git clean 🤯", + "slug": "what-is-git-clean", + "url": "/dev-life/what-is-git-clean/" + }, + "videos:wUSoZ3Bw_xY": { + "primaryTopic": "windows", + "alsoFiled": [ + "dev-life" + ], + "source": "ai", + "reviewed": false, + "title": "Manage GitHub Gists in VS Code", + "slug": "manage-github-gists-in-vs-code", + "url": "/windows/manage-github-gists-in-vs-code/" + }, + "videos:X2DlvgynJpM": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Navigate faster in VS Code with Footsteps", + "slug": "navigate-faster-in-vs-code-with-footsteps", + "url": "/windows/navigate-faster-in-vs-code-with-footsteps/" + }, + "videos:x53lUlTml5k": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Work with Others Using Live Share in VS Code", + "slug": "work-with-others-using-live-share-in-vs-code", + "url": "/windows/work-with-others-using-live-share-in-vs-code/" + }, + "videos:xgyclPKGllQ": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "What IS git switch!?", + "slug": "what-is-git-switch", + "url": "/dev-life/what-is-git-switch/" + }, + "videos:xl004KsPKGE": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "What is GitHub Gist? (Explained)", + "slug": "what-is-github-gist-explained", + "url": "/dev-life/what-is-github-gist-explained/" + }, + "videos:Xw66RmohdeU": { + "primaryTopic": "aspnetcore", + "alsoFiled": [ + "csharp" + ], + "source": "ai", + "reviewed": false, + "title": "IExceptionHandler Makes ASP.NET Exceptions Easy", + "slug": "iexceptionhandler-makes-asp-net-exceptions-easy", + "url": "/aspnetcore/iexceptionhandler-makes-asp-net-exceptions-easy/" + }, + "videos:Yo4wKXlnLMc": { + "primaryTopic": "windows", + "alsoFiled": [ + "cloud" + ], + "source": "ai", + "reviewed": false, + "title": "Write Code in Containers with VS Code and Remote Containers", + "slug": "write-code-in-containers-with-vs-code-and-remote-containers", + "url": "/windows/write-code-in-containers-with-vs-code-and-remote-containers/" + }, + "videos:ZxNnOjWetH4": { + "primaryTopic": "windows", + "alsoFiled": [], + "source": "keyword", + "confidence": 1, + "needsReview": true, + "reviewed": false, + "title": "Spell Check in VS Code with Code Spell Checker", + "slug": "spell-check-in-vs-code-with-code-spell-checker", + "url": "/windows/spell-check-in-vs-code-with-code-spell-checker/" + }, + "videos:_8FeXuoYcqU": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "source": "ai", + "reviewed": false, + "title": "What is Git Cherry-Pick?", + "slug": "what-is-git-cherry-pick", + "url": "/dev-life/what-is-git-cherry-pick/" + } + } +} diff --git a/src/config/taxonomy.overrides.json b/src/config/taxonomy.overrides.json new file mode 100644 index 0000000..18186c0 --- /dev/null +++ b/src/config/taxonomy.overrides.json @@ -0,0 +1,137 @@ +{ + "$comment": "AI review pass over the keyword generated taxonomy. Anything listed here wins over the keyword score and is written into taxonomy.json with source set to ai. A human edit in taxonomy.json with reviewed set to true beats both. Only corrections live here, so an item absent from this file means the keyword pass got it right.", + "overrides": { + "blog:ef-core-audit-logging-with-interceptors-that-do-not-clutter-your-dbcontext": { + "primaryTopic": "data", + "alsoFiled": ["csharp"] + }, + "blog:ef-core-query-performance-tips-for-everyone": { + "primaryTopic": "data", + "alsoFiled": [] + }, + "blog:repository-pattern-vs-dbcontext-in-entity-framework-core": { + "primaryTopic": "data", + "alsoFiled": ["csharp"] + }, + "blog:unit-of-work-with-entity-framework-core-done-right": { + "primaryTopic": "data", + "alsoFiled": ["csharp"] + }, + "blog:from-layers-to-slices-how-i-ship-faster-aspnet-core-apis": { + "primaryTopic": "aspnetcore", + "alsoFiled": ["csharp"] + }, + "blog:how-net-10-speeds-up-api-validation-without-code-changes": { + "primaryTopic": "aspnetcore", + "alsoFiled": ["csharp"] + }, + "blog:stop-breaking-clocks-in-aspnet-core-with-utc-and-timezoneinfo": { + "primaryTopic": "aspnetcore", + "alsoFiled": ["csharp"] + }, + "blog:tame-configuration-in-aspnet-core-with-ivalidateoptions": { + "primaryTopic": "aspnetcore", + "alsoFiled": ["csharp"] + }, + "blog:using-auto-mapper-with-asp-net-core-3": { + "primaryTopic": "aspnetcore", + "alsoFiled": ["csharp"] + }, + "blog:five-di-anti-patterns-haunting-net-apps-and-how-to-fix-them": { + "primaryTopic": "aspnetcore", + "alsoFiled": ["csharp"] + }, + "blog:sentiment-analysis-with-opentok-and-azure-face-api": { + "primaryTopic": "cloud", + "alsoFiled": ["csharp"] + }, + "blog:from-sln-to-slnx-in-minutes-cleaner-diffs-faster-merges": { + "primaryTopic": "windows", + "alsoFiled": ["csharp"] + }, + "blog:using-apollo-to-query-graph-ql-from-node-js": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "note": "No topic covers Node and GraphQL. Filed under dev-life as the least wrong home. See the topic coverage gap." + }, + "blog:integrating-notion-with-astro-sites": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "note": "No topic covers Astro or front end web. Same gap as the Apollo post." + }, + "blog:choosing-between-blazor-server-or-web-assembly": { + "primaryTopic": "blazor", + "alsoFiled": ["csharp"] + }, + "blog:cross-platform-nuget-dotnet": { + "primaryTopic": "csharp", + "alsoFiled": ["dev-life"] + }, + "blog:automating-release-notes-with-git-hub-app-veyor-and-octopus-deploy": { + "primaryTopic": "cloud", + "alsoFiled": ["dev-life"] + }, + "blog:building-404-pages-that-bring-joy": { + "primaryTopic": "dev-life", + "alsoFiled": [] + }, + "blog:10-visual-studio-code-extensions-you-need-today": { + "primaryTopic": "windows", + "alsoFiled": [] + }, + + "videos:AFrMhIvvGZU": { "primaryTopic": "blazor", "alsoFiled": ["csharp"] }, + "videos:CR2Kigxx2rM": { "primaryTopic": "copilot", "alsoFiled": ["csharp"] }, + "videos:d0Eah9-t9tY": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:jDb8WXFqqFQ": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:Mccqa_Z8-DY": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:Xw66RmohdeU": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:ToFqISWq4is": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:4YcSDHCttLg": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:NZ-4z3J2xy0": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:nIq2YPPm6es": { "primaryTopic": "windows", "alsoFiled": [] }, + "videos:VWbHiXN3mno": { "primaryTopic": "windows", "alsoFiled": ["dev-life"] }, + "videos:wUSoZ3Bw_xY": { "primaryTopic": "windows", "alsoFiled": ["dev-life"] }, + "videos:ku2K9mTMJBU": { "primaryTopic": "windows", "alsoFiled": ["dev-life"] }, + "videos:s7fK0owVO3s": { "primaryTopic": "windows", "alsoFiled": ["dev-life"] }, + "videos:Yo4wKXlnLMc": { "primaryTopic": "windows", "alsoFiled": ["cloud"] }, + "videos:i4jsvC_mzPI": { "primaryTopic": "dev-life", "alsoFiled": ["copilot"] }, + "videos:MQciYVuS6cM": { "primaryTopic": "dev-life", "alsoFiled": ["copilot"] }, + "videos:sEZstSgt-vo": { "primaryTopic": "csharp", "alsoFiled": ["dev-life"] }, + "videos:BKeaojX45w0": { "primaryTopic": "copilot", "alsoFiled": ["csharp"] }, + "videos:6I7v_mHbRYI": { "primaryTopic": "data", "alsoFiled": [] }, + "videos:B9C4iK8IGbQ": { "primaryTopic": "data", "alsoFiled": ["csharp"] }, + "videos:m50iQuELqeQ": { "primaryTopic": "data", "alsoFiled": ["csharp"] }, + "videos:IZveVNSzrqY": { "primaryTopic": "data", "alsoFiled": ["csharp"] }, + "videos:eq3z_ZiLraw": { "primaryTopic": "data", "alsoFiled": ["csharp"] }, + "videos:7fk7jDrtvTs": { "primaryTopic": "data", "alsoFiled": ["csharp"] }, + "videos:0NUUMMRwUbA": { "primaryTopic": "data", "alsoFiled": ["csharp"] }, + "videos:922cq8unreM": { + "primaryTopic": "csharp", + "alsoFiled": [], + "note": "Title gives nothing away. Best guess from the surrounding C# run. Worth a human look." + }, + "videos:v-nKgRil02A": { + "primaryTopic": "dev-life", + "alsoFiled": [], + "note": "Reads as a git video from the neighbouring titles. Worth a human look." + }, + "videos:tgEBSuqD4w4": { "primaryTopic": "dev-life", "alsoFiled": [] }, + "videos:CFKhuEGY8IU": { "primaryTopic": "dev-life", "alsoFiled": [] }, + "videos:VYKtLWCv0tY": { "primaryTopic": "dev-life", "alsoFiled": [] }, + "videos:xgyclPKGllQ": { "primaryTopic": "dev-life", "alsoFiled": [] }, + "videos:_8FeXuoYcqU": { "primaryTopic": "dev-life", "alsoFiled": [] }, + "videos:JkvYc1u9Fl4": { "primaryTopic": "dev-life", "alsoFiled": [] }, + "videos:xl004KsPKGE": { "primaryTopic": "dev-life", "alsoFiled": [] }, + "videos:BGvYjLgo-Uk": { "primaryTopic": "dev-life", "alsoFiled": [] }, + "videos:70jllnMbGTY": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:cu4CUJAcJ-4": { "primaryTopic": "aspnetcore", "alsoFiled": ["csharp"] }, + "videos:tnTzsR1K8Eo": { "primaryTopic": "aspnetcore", "alsoFiled": [] }, + "videos:q7J050yovuo": { "primaryTopic": "cloud", "alsoFiled": [] }, + "videos:Fi5bTG7yqsM": { + "primaryTopic": "windows", + "alsoFiled": [], + "note": "TailwindCSS, but the video is about the VS Code extension so the tooling topic fits better than a front end topic that does not exist." + } + } +} diff --git a/src/lib/content.ts b/src/lib/content.ts new file mode 100644 index 0000000..900f76b --- /dev/null +++ b/src/lib/content.ts @@ -0,0 +1,163 @@ +/* + The bridge between the content submodule and the topic first URLs. + + Content lives in michaeljolley/content and is read only from here. taxonomy.json says + which topic owns each item and what its slug is. Nothing else in the site should read + taxonomy.json directly, so that the day the nightly bot starts writing topics into + frontmatter there is exactly one place to change. +*/ + +import { getCollection, type CollectionEntry } from 'astro:content'; +import taxonomy from '../config/taxonomy.json'; +import { topicBySlug, type Topic } from '../config/site'; + +export type ItemKind = 'article' | 'video'; + +export interface Item { + /** collection:id, the key used by taxonomy.json and START_HERE. */ + key: string; + kind: ItemKind; + slug: string; + url: string; + topic: string; + alsoFiled: string[]; + title: string; + description: string; + date: Date; + /** Reading time for an article, running time for a video. Already formatted. */ + length: string; + /** Views for a video, null for an article until likes land in phase five. */ + views: number | null; + thumbnail: string | null; + /** YouTube watch URL. Only set on videos. */ + external: string | null; + /** + * Dated in the future. The nightly bot stages posts ahead of time. They build, so the + * URL is live and shareable the moment the date passes and nothing 404s in between, + * but they stay out of every listing until then. + */ + draft: boolean; +} + +interface TaxonomyEntry { + primaryTopic: string; + alsoFiled: string[]; + slug: string; + url: string; + title: string; +} + +const entries = taxonomy.entries as unknown as Record; + +/** + * Roughly 220 words a minute, which is the number most reading time estimates settle on. + * Deliberately not exact. A reader wants to know if this is a coffee or a commute. + */ +function readingTime(body: string): string { + const words = body.trim().split(/\s+/).length; + return `${Math.max(1, Math.round(words / 220))} min`; +} + +/** 00:52 stays 00:52. 01:05:30 becomes 1:05:30. */ +function runtime(duration: string): string { + return duration.replace(/^0(?=\d:)/, '').replace(/^00:(?=\d)/, '0:'); +} + +let cache: Item[] | null = null; + +export async function allItems(): Promise { + if (cache) return cache; + + const [blog, videos] = await Promise.all([getCollection('blog'), getCollection('videos')]); + const now = Date.now(); + const items: Item[] = []; + + for (const post of blog as CollectionEntry<'blog'>[]) { + const key = `blog:${post.id}`; + const t = entries[key]; + if (!t) continue; + items.push({ + key, + kind: 'article', + slug: t.slug, + url: t.url, + topic: t.primaryTopic, + alsoFiled: t.alsoFiled ?? [], + title: post.data.title, + description: post.data.summary || post.data.description, + date: post.data.pubDate, + length: readingTime(post.body ?? ''), + views: null, + thumbnail: post.data.image ?? null, + external: null, + draft: post.data.pubDate.getTime() > now + }); + } + + for (const video of videos as CollectionEntry<'videos'>[]) { + const key = `videos:${video.data.id}`; + const t = entries[key]; + if (!t) continue; + items.push({ + key, + kind: 'video', + slug: t.slug, + url: t.url, + topic: t.primaryTopic, + alsoFiled: t.alsoFiled ?? [], + title: video.data.title, + // Videos carry no description in the collection. The transcript work in phase + // seven is what eventually fills this. + description: '', + date: video.data.date, + length: runtime(video.data.duration), + views: video.data.views ?? null, + thumbnail: video.data.thumbnail, + external: video.data.link, + draft: video.data.date.getTime() > now + }); + } + + items.sort((a, b) => b.date.getTime() - a.date.getTime()); + cache = items; + return items; +} + +export async function itemsInTopic(slug: string): Promise { + return (await allItems()).filter((i) => i.topic === slug && !i.draft); +} + +export async function itemByUrl(url: string): Promise { + return (await allItems()).find((i) => i.url === url); +} + +export async function itemsByKeys(keys: readonly string[]): Promise { + const all = await allItems(); + return keys.map((k) => all.find((i) => i.key === k)).filter((i): i is Item => Boolean(i)); +} + +export interface TopicView { + topic: Topic; + items: Item[]; + articles: number; + videos: number; +} + +export async function topicView(slug: string): Promise { + const topic = topicBySlug(slug); + if (!topic) return null; + const items = await itemsInTopic(slug); + return { + topic, + items, + articles: items.filter((i) => i.kind === 'article').length, + videos: items.filter((i) => i.kind === 'video').length + }; +} + +/** + * Sub paths a topic serves that are filters rather than content. A content slug can + * never be one of these, which tests/taxonomy.test.mjs enforces. + */ +export const TOPIC_FILTERS = ['articles', 'videos'] as const; +export type TopicFilter = (typeof TOPIC_FILTERS)[number]; diff --git a/src/lib/ec-themes.generated.mjs b/src/lib/ec-themes.generated.mjs index fd9584a..fa1c09a 100644 --- a/src/lib/ec-themes.generated.mjs +++ b/src/lib/ec-themes.generated.mjs @@ -1,10 +1,15 @@ // Generated by scripts/gen-themes.mjs. Do not hand edit. // A module rather than JSON so ec.config.mjs can import it without a resolver that // changes meaning once the config gets bundled. +// +// One theme, whose token colors are var(--tok-*) references rather than copies. +// Sixteen themes made Expressive Code inline sixteen hex values onto every syntax +// span, which took one real article to 926 KB of HTML. This is the same article at +// 56 KB, and the colors now track the chrome exactly instead of approximately. export default [ { - "name": "bbb-dark", + "name": "bbb", "type": "dark", "semanticHighlighting": true, "colors": { @@ -36,2247 +41,17 @@ export default [ }, "tokenColors": [ { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#878e96", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#9bd17f" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#f0a58c" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#e9a83c" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#6fb6ef" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#5fc9b6" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#e9ebee" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#99a1aa" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#e9a83c" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#6fb6ef" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#f0655f" - } - } - ] - }, - { - "name": "bbb-light", - "type": "light", - "semanticHighlighting": true, - "colors": { - "editor.background": "#eceae5", - "editor.foreground": "#1b1a18", - "editor.lineHighlightBackground": "#dfded9", - "editorLineNumber.foreground": "#5f5c57", - "editorLineNumber.activeForeground": "#1b1a18", - "editorGutter.background": "#eceae5", - "editorWidget.background": "#f3f1ed", - "editorWidget.border": "#ddd9d2", - "panel.border": "#ddd9d2", - "focusBorder": "#915f0f", - "editorError.foreground": "#c0392b", - "editorWarning.foreground": "#8a6300", - "editorInfo.foreground": "#1a63c7", - "editorHint.foreground": "#6b6862", - "titleBar.activeBackground": "#f3f1ed", - "titleBar.activeForeground": "#5f5c57", - "tab.activeBackground": "#eceae5", - "tab.activeForeground": "#1b1a18", - "tab.inactiveBackground": "#f3f1ed", - "tab.inactiveForeground": "#5f5c57", - "tab.border": "#ddd9d2", - "editorGroupHeader.tabsBackground": "#f3f1ed", - "editorGroupHeader.tabsBorder": "#ddd9d2", - "terminal.background": "#eceae5", - "terminal.foreground": "#1b1a18" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#6b6861", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#3f6b2f" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#a44a2a" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#915f0f" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#1a63c7" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#0f6f63" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#1b1a18" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#5f5c57" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#915f0f" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#1a63c7" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#c0392b" - } - } - ] - }, - { - "name": "hotdog-stand", - "type": "light", - "semanticHighlighting": true, - "colors": { - "editor.background": "#c0c0c0", - "editor.foreground": "#000000", - "editor.lineHighlightBackground": "#b4b4b4", - "editorLineNumber.foreground": "#4a4a4a", - "editorLineNumber.activeForeground": "#000000", - "editorGutter.background": "#c0c0c0", - "editorWidget.background": "#ffffff", - "editorWidget.border": "#ff0000", - "panel.border": "#ff0000", - "focusBorder": "#a30000", - "editorError.foreground": "#a30000", - "editorWarning.foreground": "#704400", - "editorInfo.foreground": "#0000cc", - "editorHint.foreground": "#4a4a4a", - "titleBar.activeBackground": "#ffffff", - "titleBar.activeForeground": "#4a4a4a", - "tab.activeBackground": "#c0c0c0", - "tab.activeForeground": "#000000", - "tab.inactiveBackground": "#ffffff", - "tab.inactiveForeground": "#4a4a4a", - "tab.border": "#ff0000", - "editorGroupHeader.tabsBackground": "#ffffff", - "editorGroupHeader.tabsBorder": "#ff0000", - "terminal.background": "#c0c0c0", - "terminal.foreground": "#000000" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#4a4a4a", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#005c00" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#704400" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#a30000" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#0000cc" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#005858" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#000000" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#4a4a4a" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#a30000" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#0000cc" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#a30000" - } - } - ] - }, - { - "name": "github-dark", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#2f363d", - "editor.foreground": "#e1e4e8", - "editor.lineHighlightBackground": "#3a4047", - "editorLineNumber.foreground": "#979fa7", - "editorLineNumber.activeForeground": "#e1e4e8", - "editorGutter.background": "#2f363d", - "editorWidget.background": "#1f2428", - "editorWidget.border": "#1b1f23", - "panel.border": "#1b1f23", - "focusBorder": "#79b8ff", - "editorError.foreground": "#f97583", - "editorWarning.foreground": "#ffea7f", - "editorInfo.foreground": "#79b8ff", - "editorHint.foreground": "#9a9fa4", - "titleBar.activeBackground": "#1f2428", - "titleBar.activeForeground": "#979fa7", - "tab.activeBackground": "#2f363d", - "tab.activeForeground": "#e1e4e8", - "tab.inactiveBackground": "#1f2428", - "tab.inactiveForeground": "#979fa7", - "tab.border": "#1b1f23", - "editorGroupHeader.tabsBackground": "#1f2428", - "editorGroupHeader.tabsBorder": "#1b1f23", - "terminal.background": "#2f363d", - "terminal.foreground": "#e1e4e8" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#9aa0a7", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#9aa0a7" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#79b8ff" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#f97583" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#79b8ff" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#79b8ff" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#e1e4e8" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#979fa7" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#f97583" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#79b8ff" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#f97583" - } - } - ] - }, - { - "name": "github-light", - "type": "light", - "semanticHighlighting": true, - "colors": { - "editor.background": "#fafbfc", - "editor.foreground": "#24292e", - "editor.lineHighlightBackground": "#edeef0", - "editorLineNumber.foreground": "#6a737d", - "editorLineNumber.activeForeground": "#24292e", - "editorGutter.background": "#fafbfc", - "editorWidget.background": "#f6f8fa", - "editorWidget.border": "#e1e4e8", - "panel.border": "#e1e4e8", - "focusBorder": "#0366d6", - "editorError.foreground": "#cb2431", - "editorWarning.foreground": "#8b6e0b", - "editorInfo.foreground": "#0366d6", - "editorHint.foreground": "#1b1f23", - "titleBar.activeBackground": "#f6f8fa", - "titleBar.activeForeground": "#6a737d", - "tab.activeBackground": "#fafbfc", - "tab.activeForeground": "#24292e", - "tab.inactiveBackground": "#f6f8fa", - "tab.inactiveForeground": "#6a737d", - "tab.border": "#e1e4e8", - "editorGroupHeader.tabsBackground": "#f6f8fa", - "editorGroupHeader.tabsBorder": "#e1e4e8", - "terminal.background": "#fafbfc", - "terminal.foreground": "#24292e" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#6a737d", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#6a737d" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#005cc5" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#ce3846" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#0366d6" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#0366d6" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#24292e" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#6a737d" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#ce3846" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#0366d6" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#cb2431" - } - } - ] - }, - { - "name": "dracula", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#282a36", - "editor.foreground": "#f8f8f2", - "editor.lineHighlightBackground": "#343641", - "editorLineNumber.foreground": "#8591b8", - "editorLineNumber.activeForeground": "#f8f8f2", - "editorGutter.background": "#282a36", - "editorWidget.background": "#21222c", - "editorWidget.border": "#bd93f9", - "panel.border": "#bd93f9", - "focusBorder": "#50fa7b", - "editorError.foreground": "#ff5555", - "editorWarning.foreground": "#8be9fd", - "editorInfo.foreground": "#50fa7b", - "editorHint.foreground": "#8591b8", - "titleBar.activeBackground": "#21222c", - "titleBar.activeForeground": "#8591b8", - "tab.activeBackground": "#282a36", - "tab.activeForeground": "#f8f8f2", - "tab.inactiveBackground": "#21222c", - "tab.inactiveForeground": "#8591b8", - "tab.border": "#bd93f9", - "editorGroupHeader.tabsBackground": "#21222c", - "editorGroupHeader.tabsBorder": "#bd93f9", - "terminal.background": "#282a36", - "terminal.foreground": "#f8f8f2" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#8591b8", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#ff79c6" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#bd93f9" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#bd93f9" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#50fa7b" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#8be9fd" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#f8f8f2" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#8591b8" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#bd93f9" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#50fa7b" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#ff5555" - } - } - ] - }, - { - "name": "one-dark-pro", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#1d1f23", - "editor.foreground": "#abb2bf", - "editor.lineHighlightBackground": "#26282c", - "editorLineNumber.foreground": "#abb2bf", - "editorLineNumber.activeForeground": "#abb2bf", - "editorGutter.background": "#1d1f23", - "editorWidget.background": "#21252b", - "editorWidget.border": "#3e4452", - "panel.border": "#3e4452", - "focusBorder": "#61afef", - "editorError.foreground": "#d47974", - "editorWarning.foreground": "#e5c07b", - "editorInfo.foreground": "#61afef", - "editorHint.foreground": "#8e939e", - "titleBar.activeBackground": "#21252b", - "titleBar.activeForeground": "#abb2bf", - "tab.activeBackground": "#1d1f23", - "tab.activeForeground": "#abb2bf", - "tab.inactiveBackground": "#21252b", - "tab.inactiveForeground": "#abb2bf", - "tab.border": "#3e4452", - "editorGroupHeader.tabsBackground": "#21252b", - "editorGroupHeader.tabsBorder": "#3e4452", - "terminal.background": "#1d1f23", - "terminal.foreground": "#abb2bf" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#abb2bf", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#98c379" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#d19a66" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#c678dd" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#61afef" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#e5c07b" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#abb2bf" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#abb2bf" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#c678dd" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#61afef" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#d47974" - } - } - ] - }, - { - "name": "night-owl", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#0b253a", - "editor.foreground": "#d6deeb", - "editor.lineHighlightBackground": "#173045", - "editorLineNumber.foreground": "#7a8c9c", - "editorLineNumber.activeForeground": "#d6deeb", - "editorGutter.background": "#0b253a", - "editorWidget.background": "#011627", - "editorWidget.border": "#5f7e97", - "panel.border": "#5f7e97", - "focusBorder": "#c792ea", - "editorError.foreground": "#ef5654", - "editorWarning.foreground": "#b39554", - "editorInfo.foreground": "#c792ea", - "editorHint.foreground": "#7a8c9c", - "titleBar.activeBackground": "#011627", - "titleBar.activeForeground": "#7a8c9c", - "tab.activeBackground": "#0b253a", - "tab.activeForeground": "#d6deeb", - "tab.inactiveBackground": "#011627", - "tab.inactiveForeground": "#7a8c9c", - "tab.border": "#5f7e97", - "editorGroupHeader.tabsBackground": "#011627", - "editorGroupHeader.tabsBorder": "#5f7e97", - "terminal.background": "#0b253a", - "terminal.foreground": "#d6deeb" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#7c8d8d", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#ecc48d" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#f78c6c" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#c792ea" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#c792ea" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#ffcb8b" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#d6deeb" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#7a8c9c" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#c792ea" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#c792ea" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#ef5654" - } - } - ] - }, - { - "name": "tokyo-night", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#14141b", - "editor.foreground": "#a9b1d6", - "editor.lineHighlightBackground": "#1d1d26", - "editorLineNumber.foreground": "#828598", - "editorLineNumber.activeForeground": "#a9b1d6", - "editorGutter.background": "#14141b", - "editorWidget.background": "#16161e", - "editorWidget.border": "#101014", - "panel.border": "#101014", - "focusBorder": "#6485bc", - "editorError.foreground": "#dd5656", - "editorWarning.foreground": "#e0af68", - "editorInfo.foreground": "#0da0ba", - "editorHint.foreground": "#0da0ba", - "titleBar.activeBackground": "#16161e", - "titleBar.activeForeground": "#828598", - "tab.activeBackground": "#14141b", - "tab.activeForeground": "#a9b1d6", - "tab.inactiveBackground": "#16161e", - "tab.inactiveForeground": "#828598", - "tab.border": "#101014", - "editorGroupHeader.tabsBackground": "#16161e", - "editorGroupHeader.tabsBorder": "#101014", - "terminal.background": "#14141b", - "terminal.foreground": "#a9b1d6" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#7e849f", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#7e849f" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#ff9e64" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#7b82a3" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#0db9d7" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#73daca" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#a9b1d6" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#828598" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#7b82a3" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#0db9d7" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#dd5656" - } - } - ] - }, - { - "name": "catppuccin-mocha", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#313244", - "editor.foreground": "#cdd6f4", - "editor.lineHighlightBackground": "#3a3c4f", - "editorLineNumber.foreground": "#cdd6f4", - "editorLineNumber.activeForeground": "#cdd6f4", - "editorGutter.background": "#313244", - "editorWidget.background": "#181825", - "editorWidget.border": "#585b70", - "panel.border": "#585b70", - "focusBorder": "#89b4fa", - "editorError.foreground": "#f38ba8", - "editorWarning.foreground": "#fab387", - "editorInfo.foreground": "#89b4fa", - "editorHint.foreground": "#969aae", - "titleBar.activeBackground": "#181825", - "titleBar.activeForeground": "#cdd6f4", - "tab.activeBackground": "#313244", - "tab.activeForeground": "#cdd6f4", - "tab.inactiveBackground": "#181825", - "tab.inactiveForeground": "#cdd6f4", - "tab.border": "#585b70", - "editorGroupHeader.tabsBackground": "#181825", - "editorGroupHeader.tabsBorder": "#585b70", - "terminal.background": "#313244", - "terminal.foreground": "#cdd6f4" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#959bb4", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#a6e3a1" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#fab387" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#fab387" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#89b4fa" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#f9e2af" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#cdd6f4" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#cdd6f4" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#fab387" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#89b4fa" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#f38ba8" - } - } - ] - }, - { - "name": "catppuccin-latte", - "type": "light", - "semanticHighlighting": true, - "colors": { - "editor.background": "#ccd0da", - "editor.foreground": "#4c4f69", - "editor.lineHighlightBackground": "#c4c8d3", - "editorLineNumber.foreground": "#4c4f69", - "editorLineNumber.activeForeground": "#4c4f69", - "editorGutter.background": "#ccd0da", - "editorWidget.background": "#e6e9ef", - "editorWidget.border": "#acb0be", - "panel.border": "#acb0be", - "focusBorder": "#1750bf", - "editorError.foreground": "#b00d30", - "editorWarning.foreground": "#983c07", - "editorInfo.foreground": "#1750bf", - "editorHint.foreground": "#575964", - "titleBar.activeBackground": "#e6e9ef", - "titleBar.activeForeground": "#4c4f69", - "tab.activeBackground": "#ccd0da", - "tab.activeForeground": "#4c4f69", - "tab.inactiveBackground": "#e6e9ef", - "tab.inactiveForeground": "#4c4f69", - "tab.border": "#acb0be", - "editorGroupHeader.tabsBackground": "#e6e9ef", - "editorGroupHeader.tabsBorder": "#acb0be", - "terminal.background": "#ccd0da", - "terminal.foreground": "#4c4f69" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#545664", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#29661c" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#983c07" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#983c07" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#1750bf" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#784d10" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#4c4f69" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#4c4f69" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#983c07" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#1750bf" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#b00d30" - } - } - ] - }, - { - "name": "vitesse-dark", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#181818", - "editor.foreground": "#dbd7ca", - "editor.lineHighlightBackground": "#242323", - "editorLineNumber.foreground": "#dedcd5", - "editorLineNumber.activeForeground": "#dbd7ca", - "editorGutter.background": "#181818", - "editorWidget.background": "#121212", - "editorWidget.border": "#191919", - "panel.border": "#191919", - "focusBorder": "#4d9375", - "editorError.foreground": "#cb7676", - "editorWarning.foreground": "#5da994", - "editorInfo.foreground": "#6394bf", - "editorHint.foreground": "#4d9375", - "titleBar.activeBackground": "#121212", - "titleBar.activeForeground": "#dedcd5", - "tab.activeBackground": "#181818", - "tab.activeForeground": "#dbd7ca", - "tab.inactiveBackground": "#121212", - "tab.inactiveForeground": "#dedcd5", - "tab.border": "#191919", - "editorGroupHeader.tabsBackground": "#121212", - "editorGroupHeader.tabsBorder": "#191919", - "terminal.background": "#181818", - "terminal.foreground": "#dbd7ca" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#758575", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#758575" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#4c9a91" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#828282" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#80a665" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#5da994" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#dbd7ca" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#dedcd5" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#828282" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#80a665" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#cb7676" - } - } - ] - }, - { - "name": "vitesse-light", - "type": "light", - "semanticHighlighting": true, - "colors": { - "editor.background": "#f7f7f7", - "editor.foreground": "#393a34", - "editor.lineHighlightBackground": "#ececeb", - "editorLineNumber.foreground": "#393a34", - "editorLineNumber.activeForeground": "#393a34", - "editorGutter.background": "#f7f7f7", - "editorWidget.background": "#ffffff", - "editorWidget.border": "#f0f0f0", - "panel.border": "#f0f0f0", - "focusBorder": "#1c6b48", - "editorError.foreground": "#ab5959", - "editorWarning.foreground": "#287e72", - "editorInfo.foreground": "#296aa3", - "editorHint.foreground": "#1e754f", - "titleBar.activeBackground": "#ffffff", - "titleBar.activeForeground": "#393a34", - "tab.activeBackground": "#f7f7f7", - "tab.activeForeground": "#393a34", - "tab.inactiveBackground": "#ffffff", - "tab.inactiveForeground": "#393a34", - "tab.border": "#f0f0f0", - "editorGroupHeader.tabsBackground": "#ffffff", - "editorGroupHeader.tabsBorder": "#f0f0f0", - "terminal.background": "#f7f7f7", - "terminal.foreground": "#393a34" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#6a726a", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#6a726a" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#2f798a" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#717171" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#527c35" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#287e72" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#393a34" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#393a34" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#717171" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#527c35" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#ab5959" - } - } - ] - }, - { - "name": "solarized-light", - "type": "light", - "semanticHighlighting": true, - "colors": { - "editor.background": "#ddd6c1", - "editor.foreground": "#4f6066", - "editor.lineHighlightBackground": "#d4cfbc", - "editorLineNumber.foreground": "#595e5b", - "editorLineNumber.activeForeground": "#4f6066", - "editorGutter.background": "#ddd6c1", - "editorWidget.background": "#eee8d5", - "editorWidget.border": "#ddd6c1", - "panel.border": "#ddd6c1", - "focusBorder": "#1b6193", - "editorError.foreground": "#b02826", - "editorWarning.foreground": "#7b5400", - "editorInfo.foreground": "#1b6193", - "editorHint.foreground": "#555d5d", - "titleBar.activeBackground": "#eee8d5", - "titleBar.activeForeground": "#595e5b", - "tab.activeBackground": "#ddd6c1", - "tab.activeForeground": "#4f6066", - "tab.inactiveBackground": "#eee8d5", - "tab.inactiveForeground": "#595e5b", - "tab.border": "#ddd6c1", - "editorGroupHeader.tabsBackground": "#eee8d5", - "editorGroupHeader.tabsBorder": "#ddd6c1", - "terminal.background": "#ddd6c1", - "terminal.foreground": "#4f6066" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#555d5d", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#1b6761" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#a52a65" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#556200" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#1b6193" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#a23c12" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#4f6066" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#595e5b" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#556200" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], - "settings": { - "foreground": "#1b6193" - } - }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#b02826" - } - } - ] - }, - { - "name": "nord", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#3b4252", - "editor.foreground": "#d8dee9", - "editor.lineHighlightBackground": "#444b5b", - "editorLineNumber.foreground": "#d8dee9", - "editorLineNumber.activeForeground": "#d8dee9", - "editorGutter.background": "#3b4252", - "editorWidget.background": "#2e3440", - "editorWidget.border": "#3b4252", - "panel.border": "#3b4252", - "focusBorder": "#88c0d0", - "editorError.foreground": "#d9a0a6", - "editorWarning.foreground": "#ebcb8b", - "editorInfo.foreground": "#88c0d0", - "editorHint.foreground": "#ebcb8b", - "titleBar.activeBackground": "#2e3440", - "titleBar.activeForeground": "#d8dee9", - "tab.activeBackground": "#3b4252", - "tab.activeForeground": "#d8dee9", - "tab.inactiveBackground": "#2e3440", - "tab.inactiveForeground": "#d8dee9", - "tab.border": "#3b4252", - "editorGroupHeader.tabsBackground": "#2e3440", - "editorGroupHeader.tabsBorder": "#3b4252", - "terminal.background": "#3b4252", - "terminal.foreground": "#d8dee9" - }, - "tokenColors": [ - { - "scope": [ - "comment", - "punctuation.definition.comment" - ], - "settings": { - "foreground": "#a7aebc", - "fontStyle": "italic" - } - }, - { - "scope": [ - "string", - "string.quoted", - "string.template", - "punctuation.definition.string" - ], - "settings": { - "foreground": "#a3be8c" - } - }, - { - "scope": [ - "constant.numeric", - "constant.language", - "constant.character", - "constant" - ], - "settings": { - "foreground": "#c3a5bd" - } - }, - { - "scope": [ - "keyword", - "storage", - "storage.type", - "storage.modifier", - "keyword.control", - "keyword.operator.expression", - "variable.language" - ], - "settings": { - "foreground": "#98b2cc" - } - }, - { - "scope": [ - "entity.name.function", - "support.function", - "meta.function-call.generic", - "entity.name.function.member" - ], - "settings": { - "foreground": "#88c0d0" - } - }, - { - "scope": [ - "entity.name.type", - "entity.name.class", - "entity.name.namespace", - "support.type", - "support.class", - "entity.other.inherited-class" - ], - "settings": { - "foreground": "#8fbcbb" - } - }, - { - "scope": [ - "variable", - "variable.other", - "meta.definition.variable", - "entity.name.variable" - ], - "settings": { - "foreground": "#d8dee9" - } - }, - { - "scope": [ - "keyword.operator", - "punctuation" - ], - "settings": { - "foreground": "#d8dee9" - } - }, - { - "scope": [ - "entity.name.tag" - ], - "settings": { - "foreground": "#98b2cc" - } - }, - { - "scope": [ - "entity.other.attribute-name" - ], "settings": { - "foreground": "#88c0d0" + "foreground": "var(--fg)" } }, - { - "scope": [ - "invalid", - "invalid.illegal" - ], - "settings": { - "foreground": "#d9a0a6" - } - } - ] - }, - { - "name": "monokai", - "type": "dark", - "semanticHighlighting": true, - "colors": { - "editor.background": "#414339", - "editor.foreground": "#f8f8f2", - "editor.lineHighlightBackground": "#4c4e44", - "editorLineNumber.foreground": "#afafab", - "editorLineNumber.activeForeground": "#f8f8f2", - "editorGutter.background": "#414339", - "editorWidget.background": "#1e1f1c", - "editorWidget.border": "#414339", - "panel.border": "#414339", - "focusBorder": "#a6e22e", - "editorError.foreground": "#f89191", - "editorWarning.foreground": "#ceab0a", - "editorInfo.foreground": "#a6e22e", - "editorHint.foreground": "#afafab", - "titleBar.activeBackground": "#1e1f1c", - "titleBar.activeForeground": "#afafab", - "tab.activeBackground": "#414339", - "tab.activeForeground": "#f8f8f2", - "tab.inactiveBackground": "#1e1f1c", - "tab.inactiveForeground": "#afafab", - "tab.border": "#414339", - "editorGroupHeader.tabsBackground": "#1e1f1c", - "editorGroupHeader.tabsBorder": "#414339", - "terminal.background": "#414339", - "terminal.foreground": "#f8f8f2" - }, - "tokenColors": [ { "scope": [ "comment", "punctuation.definition.comment" ], "settings": { - "foreground": "#b0aea0", + "foreground": "var(--tok-com)", "fontStyle": "italic" } }, @@ -2288,7 +63,7 @@ export default [ "punctuation.definition.string" ], "settings": { - "foreground": "#e6db74" + "foreground": "var(--tok-str)" } }, { @@ -2299,7 +74,7 @@ export default [ "constant" ], "settings": { - "foreground": "#c09dff" + "foreground": "var(--tok-num)" } }, { @@ -2313,7 +88,7 @@ export default [ "variable.language" ], "settings": { - "foreground": "#fc8ab3" + "foreground": "var(--tok-key)" } }, { @@ -2324,7 +99,7 @@ export default [ "entity.name.function.member" ], "settings": { - "foreground": "#a6e22e" + "foreground": "var(--tok-fn)" } }, { @@ -2337,7 +112,7 @@ export default [ "entity.other.inherited-class" ], "settings": { - "foreground": "#a6e22e" + "foreground": "var(--tok-type)" } }, { @@ -2348,7 +123,7 @@ export default [ "entity.name.variable" ], "settings": { - "foreground": "#f8f8f2" + "foreground": "var(--fg)" } }, { @@ -2357,7 +132,7 @@ export default [ "punctuation" ], "settings": { - "foreground": "#afafab" + "foreground": "var(--fg-dim)" } }, { @@ -2365,7 +140,7 @@ export default [ "entity.name.tag" ], "settings": { - "foreground": "#fc8ab3" + "foreground": "var(--tok-key)" } }, { @@ -2373,7 +148,7 @@ export default [ "entity.other.attribute-name" ], "settings": { - "foreground": "#a6e22e" + "foreground": "var(--tok-fn)" } }, { @@ -2382,7 +157,7 @@ export default [ "invalid.illegal" ], "settings": { - "foreground": "#f89191" + "foreground": "var(--err)" } } ] diff --git a/src/pages/[topic]/[...filter].astro b/src/pages/[topic]/[...filter].astro new file mode 100644 index 0000000..f066b97 --- /dev/null +++ b/src/pages/[topic]/[...filter].astro @@ -0,0 +1,119 @@ +--- +/* + Topic index. Also serves the two filter views at /[topic]/articles/ and + /[topic]/videos/. + + The filters are real prerendered URLs rather than client side toggles. Decision 39 is + about controls that only act on what has already loaded, and a client side filter over + a partially rendered list is exactly that bug. Real URLs are linkable, work with + JavaScript off, and cost nothing to build. + + Sort is newest only at launch. Most liked cannot be honest until like counts exist, + and a sort control that does nothing is worse than no sort control. +*/ +import Base from '../../layouts/Base.astro'; +import FeedItem from '../../components/FeedItem.astro'; +import { TOPICS, VISIBLE_TOPICS } from '../../config/site'; +import { topicView, TOPIC_FILTERS, type TopicFilter } from '../../lib/content'; + +export async function getStaticPaths() { + const paths: Array<{ params: { topic: string; filter?: string }; props: { filter: TopicFilter | null } }> = []; + for (const t of TOPICS) { + paths.push({ params: { topic: t.slug, filter: undefined }, props: { filter: null } }); + for (const f of TOPIC_FILTERS) { + paths.push({ params: { topic: t.slug, filter: f }, props: { filter: f } }); + } + } + return paths; +} + +const { topic: slug } = Astro.params; +const { filter } = Astro.props as { filter: TopicFilter | null }; + +const view = await topicView(slug!); +if (!view) return Astro.rewrite('/404'); + +const { topic, items, articles, videos } = view; + +const shown = + filter === 'articles' + ? items.filter((i) => i.kind === 'article') + : filter === 'videos' + ? items.filter((i) => i.kind === 'video') + : items; + +const base = `/${topic.slug}/`; +const filters = [ + { href: base, label: 'Everything', n: items.length, on: filter === null }, + { href: `${base}articles/`, label: 'Articles', n: articles, on: filter === 'articles' }, + { href: `${base}videos/`, label: 'Videos', n: videos, on: filter === 'videos' } +]; + +const related = VISIBLE_TOPICS.filter((t) => t.slug !== topic.slug); +const title = filter ? `${topic.title}, ${filter}` : topic.title; +--- + + +
+
+
+ topics/{topic.slug} +

/{topic.slug}

+

{topic.blurb}

+
+ + { + items.length > 0 && ( +
+ + Show + + +
+ ) + } + + { + shown.length > 0 ? ( +
+ {shown.map((item) => ( + + ))} +
+ ) : ( +
+

+ Nothing filed under {topic.slug} yet. It is a real topic with real work + coming, it just has not landed. +

+

+ Head back to the front page where the newest work lives. +

+
+ ) + } + +
+

Other topics

+
+ {related.map((t) => {t.slug})} +
+
+
+
+ diff --git a/src/pages/[topic]/[slug].astro b/src/pages/[topic]/[slug].astro new file mode 100644 index 0000000..e12a963 --- /dev/null +++ b/src/pages/[topic]/[slug].astro @@ -0,0 +1,111 @@ +--- +/* + Article and video detail, both served from the topic first URL. + + Videos render the embed, the stats and the link out. Decision 22 says no transcript no + page, and transcripts are phase seven work, so until then a video page carries a clear + pointer to YouTube rather than pretending to be a substitute for it. +*/ +import { getCollection, render } from 'astro:content'; +import Base from '../../layouts/Base.astro'; +import { topicBySlug } from '../../config/site'; +import { allItems, type Item } from '../../lib/content'; + +export async function getStaticPaths() { + const [items, blog] = await Promise.all([allItems(), getCollection('blog')]); + const posts = new Map(blog.map((p) => [p.id, p])); + return items.map((item) => ({ + params: { topic: item.topic, slug: item.slug }, + props: { item, post: item.kind === 'article' ? posts.get(item.key.slice(5)) : undefined } + })); +} + +type Post = Awaited>>[number]; +const { item, post } = Astro.props as { item: Item; post?: Post }; + +const topic = topicBySlug(item.topic)!; +const Content = post ? (await render(post)).Content : null; + +const dateLabel = item.date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' +}); + +const alsoFiled = item.alsoFiled.map((slug) => topicBySlug(slug)).filter(Boolean); +--- + + +
+
+
+
+ + {topic.slug}/{item.slug} + +

{item.title}

+ {item.description &&

{item.description}

} +

+ + {item.length} + {item.views !== null && {item.views.toLocaleString('en-US')} views} +

+
+ + { + item.kind === 'video' && item.external && ( +
+