From b8cc14c8c232d945e6700dd15bcd9e49d9a496c1 Mon Sep 17 00:00:00 2001 From: bienzaaron Date: Mon, 11 May 2026 09:08:19 -0400 Subject: [PATCH 1/6] react port --- .github/workflows/ci.yml | 2 +- .github/workflows/e2e.yml | 8 +- .gitignore | 3 +- .husky/pre-commit | 0 .oxfmtignore | 6 + .oxlintrc.json | 3 + .prettierignore | 16 - eslint.config.js | 135 - index.html | 18 + package.json | 85 +- playwright.config.ts | 4 +- pnpm-lock.yaml | 2555 ++++++++--------- postcss.config.mjs | 4 - {static => public}/family.webp | Bin public/favicon.png | Bin 0 -> 3195 bytes {static => public}/robots.txt | 0 src/app.css | 84 - src/app.d.ts | 17 - src/app.html | 16 - src/components/Command.tsx | 5 + src/components/PostList.tsx | 21 + src/components/Shell.tsx | 32 + src/components/SocialLinks.tsx | 13 + src/data.ts | 76 + src/highlight.css | 122 - src/lib/actions/click-outside.ts | 15 - src/lib/components/family.svelte | 12 - src/lib/components/icons/github.svelte | 9 - src/lib/components/icons/linkedin.svelte | 9 - src/lib/components/icons/menu.svelte | 9 - src/lib/components/icons/npm.svelte | 9 - src/lib/markdown/about.md | 7 - src/lib/markdown/family.md | 7 - src/lib/markdown/intro.md | 4 - src/lib/types.ts | 28 - src/main.tsx | 14 + src/markdown.d.ts | 16 - src/markdown/about.md | 7 + .../posts}/1-building-this-site.md | 0 .../blog => markdown/posts}/2-another-post.md | 2 +- src/pages/About.tsx | 11 + src/pages/Blog.tsx | 11 + src/pages/Home.tsx | 34 + src/pages/NotFound.tsx | 15 + src/pages/PostPage.tsx | 15 + src/routeTree.gen.ts | 113 + src/router.tsx | 17 + src/routes/+layout.svelte | 144 - src/routes/+layout.ts | 2 - src/routes/+page.svelte | 160 -- src/routes/__root.tsx | 28 + src/routes/about.tsx | 8 + src/routes/about/+page.svelte | 5 - src/routes/api/post/[postId]/+server.ts | 17 - src/routes/api/posts/+server.ts | 21 - src/routes/blog.tsx | 8 + src/routes/blog/+layout.svelte | 70 - src/routes/blog/+layout.ts | 11 - src/routes/blog/+page.svelte | 36 - src/routes/blog/[postId]/+page.svelte | 23 - src/routes/blog/[postId]/+page.ts | 12 - src/routes/blog_.$postId.tsx | 27 + src/routes/index.tsx | 8 + src/styles.css | 321 +++ src/vite-env.d.ts | 8 + static/favicon.png | Bin 7363 -> 0 bytes svelte.config.js | 30 - tailwind.config.mjs | 12 - tests/about.spec.ts | 14 +- tests/blog-entry.spec.ts | 32 +- tests/blog.spec.ts | 53 +- tests/hi.spec.ts | 48 - tests/home.spec.ts | 17 + tests/layout.spec.ts | 113 +- tsconfig.json | 19 +- tsconfig.node.json | 18 - vite.config.ts | 45 +- 77 files changed, 2173 insertions(+), 2726 deletions(-) mode change 100755 => 100644 .husky/pre-commit create mode 100644 .oxfmtignore create mode 100644 .oxlintrc.json delete mode 100644 .prettierignore delete mode 100644 eslint.config.js create mode 100644 index.html delete mode 100644 postcss.config.mjs rename {static => public}/family.webp (100%) create mode 100644 public/favicon.png rename {static => public}/robots.txt (100%) delete mode 100644 src/app.css delete mode 100644 src/app.d.ts delete mode 100644 src/app.html create mode 100644 src/components/Command.tsx create mode 100644 src/components/PostList.tsx create mode 100644 src/components/Shell.tsx create mode 100644 src/components/SocialLinks.tsx create mode 100644 src/data.ts delete mode 100644 src/highlight.css delete mode 100644 src/lib/actions/click-outside.ts delete mode 100644 src/lib/components/family.svelte delete mode 100644 src/lib/components/icons/github.svelte delete mode 100644 src/lib/components/icons/linkedin.svelte delete mode 100644 src/lib/components/icons/menu.svelte delete mode 100644 src/lib/components/icons/npm.svelte delete mode 100644 src/lib/markdown/about.md delete mode 100644 src/lib/markdown/family.md delete mode 100644 src/lib/markdown/intro.md delete mode 100644 src/lib/types.ts create mode 100644 src/main.tsx delete mode 100644 src/markdown.d.ts create mode 100644 src/markdown/about.md rename src/{lib/markdown/blog => markdown/posts}/1-building-this-site.md (100%) rename src/{lib/markdown/blog => markdown/posts}/2-another-post.md (69%) create mode 100644 src/pages/About.tsx create mode 100644 src/pages/Blog.tsx create mode 100644 src/pages/Home.tsx create mode 100644 src/pages/NotFound.tsx create mode 100644 src/pages/PostPage.tsx create mode 100644 src/routeTree.gen.ts create mode 100644 src/router.tsx delete mode 100644 src/routes/+layout.svelte delete mode 100644 src/routes/+layout.ts delete mode 100644 src/routes/+page.svelte create mode 100644 src/routes/__root.tsx create mode 100644 src/routes/about.tsx delete mode 100644 src/routes/about/+page.svelte delete mode 100644 src/routes/api/post/[postId]/+server.ts delete mode 100644 src/routes/api/posts/+server.ts create mode 100644 src/routes/blog.tsx delete mode 100644 src/routes/blog/+layout.svelte delete mode 100644 src/routes/blog/+layout.ts delete mode 100644 src/routes/blog/+page.svelte delete mode 100644 src/routes/blog/[postId]/+page.svelte delete mode 100644 src/routes/blog/[postId]/+page.ts create mode 100644 src/routes/blog_.$postId.tsx create mode 100644 src/routes/index.tsx create mode 100644 src/styles.css create mode 100644 src/vite-env.d.ts delete mode 100644 static/favicon.png delete mode 100644 svelte.config.js delete mode 100644 tailwind.config.mjs delete mode 100644 tests/hi.spec.ts create mode 100644 tests/home.spec.ts delete mode 100644 tsconfig.node.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 62b5abb..104652b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 22 + node-version: 26 - uses: pnpm/action-setup@a0ea98b2dc7d387a59324835f7421c1d5f8357b4 # v6.0.5 - run: pnpm install --frozen-lockfile - run: pnpm run ci diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 549784a..ae011d9 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 22 + node-version: 26 - uses: pnpm/action-setup@a0ea98b2dc7d387a59324835f7421c1d5f8357b4 # v6.0.5 - name: Install dependencies run: pnpm install --frozen-lockfile @@ -38,9 +38,3 @@ jobs: run: pnpm run e2e env: E2E_BASE_URL: ${{ needs.test_setup.outputs.preview_url }} - # - uses: actions/upload-artifact@v4 - # if: always() - # with: - # name: playwright-report - # path: playwright-report/ - # retention-days: 30 diff --git a/.gitignore b/.gitignore index e7ec336..062e951 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .DS_Store node_modules /build -/public +/dist /.svelte-kit /package .env @@ -13,3 +13,4 @@ node_modules /playwright/.cache/ actions-runner +tsconfig.tsbuildinfo diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100755 new mode 100644 diff --git a/.oxfmtignore b/.oxfmtignore new file mode 100644 index 0000000..5bfdf55 --- /dev/null +++ b/.oxfmtignore @@ -0,0 +1,6 @@ +dist +node_modules +playwright-report +src/routeTree.gen.ts +test-results +tsconfig.tsbuildinfo diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..1fcf2e1 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,3 @@ +{ + "plugins": ["react", "jsx-a11y", "import"] +} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index c56c0ce..0000000 --- a/.prettierignore +++ /dev/null @@ -1,16 +0,0 @@ -pnpm-lock.yaml -.DS_Store -node_modules -/build -/public -/.svelte-kit -/package -.env -.env.* -!.env.example -.vscode -/test-results/ -/playwright-report/ -/playwright/.cache/ - -actions-runner diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 42117d3..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,135 +0,0 @@ -import js from "@eslint/js"; -import tseslint from "@typescript-eslint/eslint-plugin"; -import tsparser from "@typescript-eslint/parser"; -import svelte from "eslint-plugin-svelte"; -import svelteParser from "svelte-eslint-parser"; -import prettier from "eslint-config-prettier"; - -export default [ - { - ignores: [ - "*.css", - "*.html", - "pnpm-lock.yaml", - "build/**", - ".svelte-kit/**", - "dist/**", - "node_modules/**", - "playwright-report/**", - "test-results/**", - "public/**", - "static/**", - "actions-runner/**", - ], - }, - { - files: ["**/*.js", "**/*.mjs"], - languageOptions: { - ecmaVersion: 2020, - sourceType: "module", - globals: { - console: "readonly", - process: "readonly", - }, - }, - ...js.configs.recommended, - }, - { - files: ["**/*.ts", "**/*.tsx"], - languageOptions: { - parser: tsparser, - parserOptions: { - ecmaVersion: 2020, - sourceType: "module", - project: "./tsconfig.node.json", - }, - }, - plugins: { - "@typescript-eslint": tseslint, - }, - rules: { - ...tseslint.configs.recommended.rules, - "@typescript-eslint/no-unused-vars": [ - "error", - { argsIgnorePattern: "^_" }, - ], - "@typescript-eslint/no-explicit-any": "warn", - }, - }, - { - files: ["src/**/*.ts", "src/**/*.tsx"], - languageOptions: { - parser: tsparser, - parserOptions: { - ecmaVersion: 2020, - sourceType: "module", - project: "./tsconfig.json", - }, - }, - }, - { - files: ["**/*.config.ts", "tests/**/*.ts", "*.ts"], - languageOptions: { - parser: tsparser, - parserOptions: { - ecmaVersion: 2020, - sourceType: "module", - }, - }, - plugins: { - "@typescript-eslint": tseslint, - }, - rules: { - ...tseslint.configs.recommended.rules, - "@typescript-eslint/no-unused-vars": [ - "error", - { argsIgnorePattern: "^_" }, - ], - "@typescript-eslint/no-explicit-any": "warn", - }, - }, - { - files: ["**/*.svelte"], - languageOptions: { - parser: svelteParser, - parserOptions: { - parser: tsparser, - extraFileExtensions: [".svelte"], - }, - }, - plugins: { - svelte, - }, - rules: { - ...svelte.configs.recommended.rules, - "svelte/no-target-blank": "error", - "svelte/no-at-debug-tags": "warn", - }, - }, - { - files: ["src/**/*"], - languageOptions: { - globals: { - window: "readonly", - document: "readonly", - navigator: "readonly", - fetch: "readonly", - }, - }, - }, - - { - files: ["tests/**/*", "**/*.spec.ts", "**/*.test.ts"], - languageOptions: { - globals: { - test: "readonly", - expect: "readonly", - describe: "readonly", - it: "readonly", - beforeEach: "readonly", - afterEach: "readonly", - }, - }, - }, - prettier, -]; diff --git a/index.html b/index.html new file mode 100644 index 0000000..af8ae5d --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ + + + + + + + + + AJ Bienz + + +
+ + + diff --git a/package.json b/package.json index 3fc0ef5..59b3431 100644 --- a/package.json +++ b/package.json @@ -3,58 +3,55 @@ "version": "0.0.1", "private": true, "type": "module", - "engines": { - "node": ">=22" - }, - "packageManager": "pnpm@11.0.8", "scripts": { "dev": "vite dev", "build": "vite build", "preview": "vite preview", - "prepare": "svelte-kit sync && husky", - "check": "svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --plugin prettier-plugin-svelte --check . && eslint .", - "lint:fix": "prettier --plugin prettier-plugin-svelte --write . && eslint --fix .", - "ci": "pnpm run lint && pnpm run check && pnpm run build", + "prepare": "husky", + "check": "tsc", + "format": "oxfmt --ignore-path .oxfmtignore --write .", + "format:check": "oxfmt --ignore-path .oxfmtignore --check .", + "lint": "oxlint .", + "lint:fix": "oxlint --fix .", + "ci": "pnpm run format:check && pnpm run lint && pnpm run check && pnpm run build", "e2e": "playwright test" }, + "dependencies": { + "@tanstack/react-router": "1.169.2", + "@tanstack/react-router-devtools": "1.166.13", + "react": "19.2.6", + "react-dom": "19.2.6" + }, "devDependencies": { - "@eslint/js": "^10.0.1", - "@opentelemetry/api": "^1.9.1", - "@playwright/test": "^1.59.1", - "@sveltejs/adapter-static": "3.0.10", - "@sveltejs/kit": "2.59.1", - "@sveltejs/vite-plugin-svelte": "^7.1.2", - "@tailwindcss/postcss": "^4.2.4", - "@tailwindcss/vite": "^4.2.4", - "@types/node": "^25.6.2", - "@typescript-eslint/eslint-plugin": "^8.59.2", - "@typescript-eslint/parser": "^8.59.2", - "autoprefixer": "^10.5.0", - "eslint": "^10.3.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-svelte": "^3.17.1", - "husky": "^9.1.7", - "lint-staged": "^17.0.2", - "mdsvex": "^0.12.7", - "postcss": "^8.5.14", - "prettier": "^3.8.3", - "prettier-plugin-svelte": "^3.5.1", - "prism-themes": "^1.9.0", - "svelte": "^5.55.5", - "svelte-check": "^4.4.8", - "svelte-eslint-parser": "^1.6.1", - "tailwindcss": "^4.2.4", - "tslib": "^2.8.1", - "typescript": "^6.0.3", - "vite": "^8.0.11" + "@playwright/test": "1.59.1", + "@tanstack/router-plugin": "1.167.35", + "@types/markdown-it": "14.1.2", + "@types/node": "25.6.2", + "@types/prismjs": "1.26.5", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.1", + "husky": "9.1.7", + "lint-staged": "17.0.4", + "markdown-it": "14.1.0", + "oxfmt": "0.48.0", + "oxlint": "1.63.0", + "prismjs": "1.30.0", + "typescript": "6.0.3", + "vite": "8.0.11", + "vite-plugin-markdown": "2.2.0" }, "lint-staged": { - "*.{js,jsx,ts,tsx,json,cjs,mjs,svelte}": [ - "bash -c 'pnpm run check'", - "prettier --plugin prettier-plugin-svelte --write", - "eslint --fix" + "*.{js,jsx,ts,tsx,json,cjs,mjs,css,md,yml,yaml}": [ + "oxfmt --write" + ], + "*.{js,jsx,ts,tsx}": [ + "oxlint --fix", + "bash -c 'pnpm run check'" ] - } + }, + "engines": { + "node": ">=26" + }, + "packageManager": "pnpm@11.0.8" } diff --git a/playwright.config.ts b/playwright.config.ts index b93e964..cb81dca 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -10,15 +10,12 @@ const config: PlaywrightTestConfig = { fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - // workers: process.env.CI ? 1 : undefined, reporter: "html", use: { actionTimeout: 0, baseURL: process.env.E2E_BASE_URL ?? "http://localhost:4173", trace: "on-first-retry", }, - projects: [ { name: "chromium", @@ -55,6 +52,7 @@ const config: PlaywrightTestConfig = { webServer: { command: "pnpm run build && pnpm run preview", port: 4173, + reuseExistingServer: !process.env.CI, }, }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92801e8..2093d42 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,168 +7,165 @@ settings: importers: .: + dependencies: + '@tanstack/react-router': + specifier: 1.169.2 + version: 1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-router-devtools': + specifier: 1.166.13 + version: 1.166.13(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.169.2)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: + specifier: 19.2.6 + version: 19.2.6 + react-dom: + specifier: 19.2.6 + version: 19.2.6(react@19.2.6) devDependencies: - '@eslint/js': - specifier: ^10.0.1 - version: 10.0.1(eslint@10.3.0(jiti@2.7.0)) - '@opentelemetry/api': - specifier: ^1.9.1 - version: 1.9.1 '@playwright/test': - specifier: ^1.59.1 + specifier: 1.59.1 version: 1.59.1 - '@sveltejs/adapter-static': - specifier: 3.0.10 - version: 3.0.10(@sveltejs/kit@2.59.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4))) - '@sveltejs/kit': - specifier: 2.59.1 - version: 2.59.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) - '@sveltejs/vite-plugin-svelte': - specifier: ^7.1.2 - version: 7.1.2(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) - '@tailwindcss/postcss': - specifier: ^4.2.4 - version: 4.2.4 - '@tailwindcss/vite': - specifier: ^4.2.4 - version: 4.2.4(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) + '@tanstack/router-plugin': + specifier: 1.167.35 + version: 1.167.35(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) + '@types/markdown-it': + specifier: 14.1.2 + version: 14.1.2 '@types/node': - specifier: ^25.6.2 + specifier: 25.6.2 version: 25.6.2 - '@typescript-eslint/eslint-plugin': - specifier: ^8.59.2 - version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': - specifier: ^8.59.2 - version: 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) - autoprefixer: - specifier: ^10.5.0 - version: 10.5.0(postcss@8.5.14) - eslint: - specifier: ^10.3.0 - version: 10.3.0(jiti@2.7.0) - eslint-config-prettier: - specifier: ^10.1.8 - version: 10.1.8(eslint@10.3.0(jiti@2.7.0)) - eslint-plugin-svelte: - specifier: ^3.17.1 - version: 3.17.1(eslint@10.3.0(jiti@2.7.0))(svelte@5.55.5(@typescript-eslint/types@8.59.2)) + '@types/prismjs': + specifier: 1.26.5 + version: 1.26.5 + '@types/react': + specifier: 19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: 6.0.1 + version: 6.0.1(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) husky: - specifier: ^9.1.7 + specifier: 9.1.7 version: 9.1.7 lint-staged: - specifier: ^17.0.2 - version: 17.0.2 - mdsvex: - specifier: ^0.12.7 - version: 0.12.7(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - postcss: - specifier: ^8.5.14 - version: 8.5.14 - prettier: - specifier: ^3.8.3 - version: 3.8.3 - prettier-plugin-svelte: - specifier: ^3.5.1 - version: 3.5.1(prettier@3.8.3)(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - prism-themes: - specifier: ^1.9.0 - version: 1.9.0 - svelte: - specifier: ^5.55.5 - version: 5.55.5(@typescript-eslint/types@8.59.2) - svelte-check: - specifier: ^4.4.8 - version: 4.4.8(picomatch@4.0.4)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@6.0.3) - svelte-eslint-parser: - specifier: ^1.6.1 - version: 1.6.1(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - tailwindcss: - specifier: ^4.2.4 - version: 4.2.4 - tslib: - specifier: ^2.8.1 - version: 2.8.1 + specifier: 17.0.4 + version: 17.0.4 + markdown-it: + specifier: 14.1.0 + version: 14.1.0 + oxfmt: + specifier: 0.48.0 + version: 0.48.0 + oxlint: + specifier: 1.63.0 + version: 1.63.0 + prismjs: + specifier: 1.30.0 + version: 1.30.0 typescript: - specifier: ^6.0.3 + specifier: 6.0.3 version: 6.0.3 vite: - specifier: ^8.0.11 + specifier: 8.0.11 version: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) + vite-plugin-markdown: + specifier: 2.2.0 + version: 2.2.0(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) packages: - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} - '@emnapi/core@1.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + engines: {node: '>=6.9.0'} - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} - '@eslint/config-helpers@0.5.5': - resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true - '@eslint/js@10.0.1': - resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} peerDependencies: - eslint: ^10.0.0 - peerDependenciesMeta: - eslint: - optional: true + '@babel/core': ^7.0.0-0 - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@eslint/plugin-kit@0.7.1': - resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} - engines: {node: '>=18.18.0'} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -192,21 +189,258 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@opentelemetry/api@1.9.1': - resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} - engines: {node: '>=8.0.0'} - '@oxc-project/types@0.128.0': resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} + '@oxfmt/binding-android-arm-eabi@0.48.0': + resolution: {integrity: sha512-uwqk+/KhQvBIpULD8SMM/zAafMRC/+DV/xsEQjkkIsJ/kLmEI/2bxonVowcYTiXqqZ/a0FEW8DPkZY3VvwELDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.48.0': + resolution: {integrity: sha512-VUCiKuXK5+McVssgHEJdrcGK7hRJzrRb36zm9/jwzMholyYt4BgXhw5Nm1V1DX6Ce717Zi/1jk432b/tgmQgtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.48.0': + resolution: {integrity: sha512-IkKp8rnIyQLW6Jt+6jragCbUVYSayk55lapiprLjIVvt4NczLyO/nwX2GgefLQ5iaBdfS8UEAFgCs/pLO6Cl0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.48.0': + resolution: {integrity: sha512-+aFuhsGIuvnoOjXyKVHMhPKJZR1kQkAl8QyrKoMlA7yJsSTC3N0Asl53La8TChSHhW8epToQ/Q0nvLmEmfNmLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.48.0': + resolution: {integrity: sha512-fbqzQL8FjI9gGnktI7RIo0dksDziTAYBy7xlI7jU7eID5fxLF/25fS4Xj6GydD8Y5oWHL83U4NK160QaOAxtyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.48.0': + resolution: {integrity: sha512-hn4i0zhAyTiB3ZHjQfYUZkDvrbVkohw1S7pySWxWUoZ87HnkDoTFThj7QTxk40hNPOTUP0vHbPRNamFIv1HBJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.48.0': + resolution: {integrity: sha512-R4WBD9qF3QM9hqgdAa+fBGXmquTvDUujrPQ36t2Sjk8RPOSKGHDeN7l/khr10hqbQaOq9KCgPHG9ubNET/X/RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.48.0': + resolution: {integrity: sha512-5bVdwSwlm1M8wbYCorLOxWxUBw/8tBvHYyQNIfwWVPwOJaj5vg1APSGJQVpwJfV5VNE9PSrR91UKEpoNwHhqUA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.48.0': + resolution: {integrity: sha512-vCS3Fk7gFslTqE1lUE2IlroyVV7u/9SmMA/uBqDoshuck2psGWcjW0ePyPZI3rM3+qtf2pDaMVIKMHozraifuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.48.0': + resolution: {integrity: sha512-gKtfFfueUClXDumyoHUbymqRf7prHejOOyzJK0eIJn93GF9JBdFHdo60TM1ZBHxkEwZvjuOgHmKtneKbEOc/Eg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.48.0': + resolution: {integrity: sha512-SYt0UhOvZD/UwZz9sXq6J2uAw8o24f5VZpLB2DH01f6MevshmlgakQlZe2lwek2sZJkd07eLu7mZa0g7yeiw7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.48.0': + resolution: {integrity: sha512-JLbrwck2AopG4ud/XklZO5N+qxGC7cS7ROvXZVNfx0MCLDDL2kGOLvzuWORkVjnjAM0CMAfIMU2zNBtQbM+4dw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.48.0': + resolution: {integrity: sha512-mdxt5L8OQLxkQH+JVpdC/lknZNe0lX4hlO3d8+xvw2wToo+iDrid9tiGOd5bmHfUVd5wVhrUry0qlu5vq66NkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.48.0': + resolution: {integrity: sha512-oEz1BQwMrV7OMEFx/3VPDU3n9TM0AnxpktDYXjEg5i6nTX87wo18wSfBvkl4tzAICdKtoAQAdBIl7Y7hsPlx5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.48.0': + resolution: {integrity: sha512-g2SKTTurP5mWjd8Ecait0erYqmltL4IqW1EwttM25BxM6NiTt4ubobJYMR1uox1V2QgG4UfHH10CGRvWlUixjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.48.0': + resolution: {integrity: sha512-CIg24VgheEpvolHL2gQuax5qcQ602bRMHrJ9g8XsQr3iVj9aSPgopigBKuMqrXsupwkrU+RQCn5cG8PgFntR6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.48.0': + resolution: {integrity: sha512-zeaWkcxcEULwkGF3I/HgEvcDPN8buYDrxibBUa/IFh5Vmwyge+KpLO+hEwSovW349H0O/C0Z2kaFmEzEDm00/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.48.0': + resolution: {integrity: sha512-yiEKnIAGvx5CyZQOlMaNlZkAbwT7/Quk0j3WLt+PR5hK+qYjPTRRJYDfD77wCBPLvEYAG41v4KG3iL0H+uxoxg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.48.0': + resolution: {integrity: sha512-GSD2+7t2UoVMV2NgxXypa4bKewflPMAjYnF0Xw9/ht82ZfafAHhb8STwrEd7wlH2PFogt5zw3WVCxYJaHUdbeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.63.0': + resolution: {integrity: sha512-A9xLtQt7i0OA1PoB/meog6kikXI9CdwEp7ZwQqmgnpKn3G3b1orvTDy8CQ6T7w1HvDrgWGB78PkFKcWgibcTCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.63.0': + resolution: {integrity: sha512-SQo+ZMvdR9l3CxZp5W5gFNxSiDxclY6lOzzNpKYLF8asESpm3Pwumx0gER5T7aHLF1/2BAAtLD3DiDkdgy4V1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.63.0': + resolution: {integrity: sha512-6W82XjJDTmMnjg30427l0dufpnyLoq7wEukKdM6/g2VIybRVuQiBVh43EA4b+UxZ3+tLcKm+Or/pXGNgLCEU8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.63.0': + resolution: {integrity: sha512-CnWd/YCuVG5W1BYkjJEVbJG11o526O9qAwBEQM+nh8K19CRFUkFdROXCyYkGmroHEYQe4vgQ6+lh3550Lp35Xw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.63.0': + resolution: {integrity: sha512-a4eZAqrmtajqcxfdAzC+l7g3PaE3V8hpAYqqeD3fTxLXOMFdK3eNTZrU80n4dDEVm0JXy1aL5PqvqWldBl6zYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.63.0': + resolution: {integrity: sha512-tYUtU9TdbU3uXF5D62g5zXJ13iniFGhXQx5vp9cyEjGdbSAY3VdFBSaldYvyoDmgMZ0ZYuwQP1Y4t2Fhejwa0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.63.0': + resolution: {integrity: sha512-I5r3twFf776UZg9dmRo2xbrKt00tTkORXEVe0ctg4vdTkQvJAjiCHxnbAU2HL1AiJ9cqADA76MAliuilsAWnvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.63.0': + resolution: {integrity: sha512-t7ltUkg6FFh4b564QyGir8xIj/QZbXu8FlcRkcyW9+ztr/mfRHlvUOFd95pJCXi9s/L5DrUeWWgpXRS+V+6igQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.63.0': + resolution: {integrity: sha512-Q5mmZy/XWjuYFUuQyYjOvZ5U/JkKEwnpir6hGxhh6HcdP0V/BKxLo8dqkfF/t7r7AguB17dfS/8+go5AQDRR6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.63.0': + resolution: {integrity: sha512-uBGtuZ0TzLB4x5wVa82HGNvYqY8buwDhyCnCP0R0gkk9szqVsP0MeTtD5HX7EsEuFIt+aYmYxuxeVxs3nTSwtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.63.0': + resolution: {integrity: sha512-h4s6FwxE+9MeA181o0dnDwHP32Y/bG8EiB/vrD6Ib+AMt6haigDc/0bUtI/sLmQDBMJnUfaCmtSSrEAqjtEVrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.63.0': + resolution: {integrity: sha512-2EaNcCBR8Mcjl5ARtuN3BdEpVkX7KpjSjMGZ/mJMIeaXgTtdz5ytg2VwygMSStA/k0ixfvZFoZOfjDEcouV5vQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.63.0': + resolution: {integrity: sha512-p4hlf/fd7TrYYl3QrWWD0GocqJefwMu3cHQhmi2FvEB/YOvFb5DZN3SMBaPi7B1TM5DeypkEtrVib674q1KKPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.63.0': + resolution: {integrity: sha512-Vgq9rkRVcPcjbcH+ihYTfpeR7vCXfqpd+z5ItTGc0yYUV59L5ceHYN1iV4H9bKGV7Rn5hkVc7x3mSvHegduENA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.63.0': + resolution: {integrity: sha512-3/Lkq/ncooA61rorrC+ZQed1Bc4VpGj+WnGsp58zmxKgvZ2vhreu+dcVyr3mX8NUpq7mfZ4gDDTou/yrF1Pd7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.63.0': + resolution: {integrity: sha512-0/EdD/6hDkx5Mfd769PTjvEM8mZ/6Dfukp1dBCL/2PjlIVGEtYdNZyok6ChqYPsT9JcFnlQnUeQzO0/1L/oC9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.63.0': + resolution: {integrity: sha512-wb0CUkN8ngwPiRQBjD1Cj0LsHeNvm+Xt6YBHDMtj2DVQVD6Oj8Ri7g6BD+KICf6LaBqZlmzOvy6nF9E/8yyGOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.63.0': + resolution: {integrity: sha512-BX5iq+ovdNlVYhSn5qPMUIT0uwAwt2lmEnCnzK+Gkhw4DovIvhGb96OFhV8yzQNUnQxn/xGkOR+X+BLrLDNm8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.63.0': + resolution: {integrity: sha512-QeN/WELOfsXMeYwxvfgQrl6CbVftYUCZsGXHjXQd5Trccm8+i4gmtxaOui4xbJQaiDlviF8F3yLSBloQUeFsfA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@playwright/test@1.59.1': resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} engines: {node: '>=18'} hasBin: true - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@rolldown/binding-android-arm64@1.0.0-rc.18': resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -305,237 +539,127 @@ packages: '@rolldown/pluginutils@1.0.0-rc.18': resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@sveltejs/acorn-typescript@1.0.9': - resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==} - peerDependencies: - acorn: ^8.9.0 + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} - '@sveltejs/adapter-static@3.0.10': - resolution: {integrity: sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==} - peerDependencies: - '@sveltejs/kit': ^2.0.0 + '@tanstack/history@1.161.6': + resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} + engines: {node: '>=20.19'} - '@sveltejs/kit@2.59.1': - resolution: {integrity: sha512-d8OON70AphLdDesuTIl//M2O6fRTIicX8aYv8vhCiYEhTTI2OboKqey0Hu1A4VFhqwgqtq0vKDmPFGkw8kKmgw==} - engines: {node: '>=18.13'} - hasBin: true + '@tanstack/react-router-devtools@1.166.13': + resolution: {integrity: sha512-6yKRFFJrEEOiGp5RAAuGCYsl81M4XAhJmLcu9PKj+HZle4A3dsP60lwHoqQYWHMK9nKKFkdXR+D8qxzxqtQbEA==} + engines: {node: '>=20.19'} peerDependencies: - '@opentelemetry/api': ^1.0.0 - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - typescript: ^5.3.3 || ^6.0.0 - vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0 + '@tanstack/react-router': ^1.168.15 + '@tanstack/router-core': ^1.168.11 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' peerDependenciesMeta: - '@opentelemetry/api': - optional: true - typescript: + '@tanstack/router-core': optional: true - '@sveltejs/vite-plugin-svelte@7.1.2': - resolution: {integrity: sha512-DrUBA2UXRfDmUX/ZTiEopd3X40yavsJF1FX2RygcuIScHL7o5YX1fMvoYnDhjeJQC4weCOklirpNWlcb2NiSeA==} - engines: {node: ^20.19 || ^22.12 || >=24} + '@tanstack/react-router@1.169.2': + resolution: {integrity: sha512-OJM7Kguc7ERnweaNRWsyWgIKcl3z23rD1B4jaxjzd9RGdnzpt2HfrWa9rggbT0Hfzhfo4D2ZmsfoTme035tniQ==} + engines: {node: '>=20.19'} peerDependencies: - svelte: ^5.46.4 - vite: ^8.0.0-beta.7 || ^8.0.0 - - '@tailwindcss/node@4.2.4': - resolution: {integrity: sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==} - - '@tailwindcss/oxide-android-arm64@4.2.4': - resolution: {integrity: sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.2.4': - resolution: {integrity: sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.2.4': - resolution: {integrity: sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.2.4': - resolution: {integrity: sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': - resolution: {integrity: sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': - resolution: {integrity: sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [glibc] + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': - resolution: {integrity: sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': - resolution: {integrity: sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] + '@tanstack/router-core@1.169.2': + resolution: {integrity: sha512-5sm0DJF1A7Mz+9gy4Gz/lLovNailK3yot4vYvz9MkBUPw26uLnhQiR8hSCYxucjE0wD6Mdlc5l+Z0/XTlZ7xHw==} + engines: {node: '>=20.19'} - '@tailwindcss/oxide-linux-x64-musl@4.2.4': - resolution: {integrity: sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] + '@tanstack/router-devtools-core@1.167.3': + resolution: {integrity: sha512-fJ1VMhyQgnoashTrP763c2HRc9kofgF61L7Jb3F6eTHAmCKtGVx8BRtiFt37sr3U0P0jmaaiiSPGP6nT5JtVNg==} + engines: {node: '>=20.19'} + peerDependencies: + '@tanstack/router-core': ^1.168.11 + csstype: ^3.0.10 + peerDependenciesMeta: + csstype: + optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.4': - resolution: {integrity: sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': - resolution: {integrity: sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] + '@tanstack/router-generator@1.166.42': + resolution: {integrity: sha512-2qBWC0t78r6b3vI+AbnvCZcFAvbYBDlLuWZrTjQbcjUmwG3qyeQp983tJyDuj9wb5//adG1tgAGXZkJ3aDwdBg==} + engines: {node: '>=20.19'} - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': - resolution: {integrity: sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] + '@tanstack/router-plugin@1.167.35': + resolution: {integrity: sha512-UAScU5VAzLYVY4FML/Cbc5S5TucT4I8Ata05yozGOe4ZfepTKRffA5xWLtD2N+ov5svdv0KTX/kqlZnYPe28mA==} + engines: {node: '>=20.19'} + peerDependencies: + '@rsbuild/core': '>=1.0.2 || ^2.0.0' + '@tanstack/react-router': ^1.169.2 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite-plugin-solid: ^2.11.10 || ^3.0.0-0 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true - '@tailwindcss/oxide@4.2.4': - resolution: {integrity: sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==} - engines: {node: '>= 20'} + '@tanstack/router-utils@1.161.8': + resolution: {integrity: sha512-xyiLWEKjfBAVhauDSSjXxyf7s8elU6SM+V050sbkofvGmIIvkwPFtDsX7Gvwh14kBd6iCwAT+RiPvXTxAptY0Q==} + engines: {node: '>=20.19'} - '@tailwindcss/postcss@4.2.4': - resolution: {integrity: sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==} + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} - '@tailwindcss/vite@4.2.4': - resolution: {integrity: sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 || ^8 + '@tanstack/virtual-file-routes@1.161.7': + resolution: {integrity: sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==} + engines: {node: '>=20.19'} + hasBin: true '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} '@types/node@25.6.2': resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - - '@typescript-eslint/eslint-plugin@8.59.2': - resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.59.2 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/parser@8.59.2': - resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.59.2': - resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@8.59.2': - resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.59.2': - resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.59.2': - resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@8.59.2': - resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.59.2': - resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} - '@typescript-eslint/utils@8.59.2': - resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + '@types/react': ^19.2.0 - '@typescript-eslint/visitor-keys@8.59.2': - resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + '@vitejs/plugin-react@6.0.1': + resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} @@ -549,33 +673,35 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - aria-query@5.3.1: - resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} - engines: {node: '>= 0.4'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} - autoprefixer@10.5.0: - resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} - baseline-browser-mapping@2.10.27: - resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} - engines: {node: 18 || 20 || >=22} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browserslist@4.28.2: resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} @@ -585,9 +711,9 @@ packages: caniuse-lite@1.0.30001792: resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} @@ -601,18 +727,14 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -623,135 +745,59 @@ packages: supports-color: optional: true - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devalue@5.8.0: - resolution: {integrity: sha512-2zA9pFEsnp7vWBZbXF5JAgAq0fsUIt/1XPbRiAmRV3lp/2C3upzH+sADiyy66aFCihoLEsrQHxNM5w1gIDfsBg==} - - electron-to-chromium@1.5.352: - resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} - engines: {node: '>=10.13.0'} - - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - eslint-plugin-svelte@3.17.1: - resolution: {integrity: sha512-NyiXHtS3Ni7e532RBwS9OXlMKDIrENg3gY+/+ODjZzQx2xhU3NlJ+nIl1a93iUUQeiJL3lS8KLmY+W8hklzweQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.1 || ^9.0.0 || ^10.0.0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - svelte: - optional: true - - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + electron-to-chromium@1.5.353: + resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} - eslint@10.3.0: - resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - esm-env@1.2.2: - resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + entities@2.1.0: + resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} - esrap@2.2.6: - resolution: {integrity: sha512-WN0clHt0a4mzC780UBVVBpsj4vSSjOFNRd2WjYtduB9HeKxm1sjHMNUwLEHVjI3FdCQD/Hurgz9ftbKEzP79Ow==} - peerDependencies: - '@typescript-eslint/types': ^8.2.0 - peerDependenciesMeta: - '@typescript-eslint/types': - optional: true - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -761,23 +807,12 @@ packages: picomatch: optional: true - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + front-matter@4.0.2: + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -789,37 +824,34 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - globals@16.5.0: - resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} - engines: {node: '>=18'} + goober@2.1.18: + resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} + peerDependencies: + csstype: ^3.0.10 - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} hasBin: true - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -833,38 +865,34 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-reference@3.0.3: - resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isbot@5.1.40: + resolution: {integrity: sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ==} + engines: {node: '>=18'} jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} + hasBin: true - known-css-properties@0.37.0: - resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} @@ -940,12 +968,14 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + linkify-it@3.0.3: + resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@17.0.2: - resolution: {integrity: sha512-Rbr6rdmbCn1fIDHBZpn0madg0hEkdlh+QwajnL3Qq0ZUq/icAJfLGj9BVBajAXi7657ZzKQ7kobGP9S5XOHYRw==} + lint-staged@17.0.4: + resolution: {integrity: sha512-+rU9lSUyVOZ/hDUmRLVGzyS2v73cDdQjX+XQz1AaOdIE4RysLq0HoPW2HrrgeNCLklkhi904VBU1bmgWLHVnkA==} engines: {node: '>=22.22.1'} hasBin: true @@ -953,40 +983,33 @@ packages: resolution: {integrity: sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==} engines: {node: '>=22.13.0'} - locate-character@3.0.0: - resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - mdsvex@0.12.7: - resolution: {integrity: sha512-gx4bReLCUvq+MPErHXYeyX+TEq1hsS2KfiZtEOMNTcbibSouFy8AHc5h04KbGCl+g5tLuo4/lbgRVYRnc7bJZw==} - peerDependencies: - svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 + markdown-it@12.3.2: + resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} + hasBin: true - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} - engines: {node: 18 || 20 || >=22} + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -996,42 +1019,42 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-releases@2.0.38: resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + oxfmt@0.48.0: + resolution: {integrity: sha512-AVaLh+7XeGx+R1zfFV+f6VV61nT2MWVJXVUDhbTm5LBWGyNt64xAyh3NYYyjeY2WykNt9AvqSQLPHcbWquYF9g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + oxlint@1.63.0: + resolution: {integrity: sha512-9TGXetdjgIHOJ9OiReomP7nnrMkV9HxC1xM2ramJSLQpzxjsAJtQwa4wqkJN2f/uCrqZuJseFuSlWDdvcruveg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.22.1' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -1046,73 +1069,35 @@ packages: engines: {node: '>=18'} hasBin: true - postcss-load-config@3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-safe-parser@7.0.1: - resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} - engines: {node: '>=18.0'} - peerDependencies: - postcss: ^8.4.31 - - postcss-scss@4.0.9: - resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.4.29 - - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.14: resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-plugin-svelte@3.5.1: - resolution: {integrity: sha512-65+fr5+cgIKWKiqM1Doum4uX6bY8iFCdztvvp2RcF+AJoieaw9kJOFMNcJo/bkmKYsxFaM9OsVZK/gWauG/5mg==} - peerDependencies: - prettier: ^3.0.0 - svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 - prettier@3.8.3: resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true - prism-svelte@0.4.7: - resolution: {integrity: sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==} - - prism-themes@1.9.0: - resolution: {integrity: sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw==} - prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} + peerDependencies: + react: ^19.2.6 + + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} + engines: {node: '>=0.10.0'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} @@ -1126,34 +1111,27 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - set-cookie-parser@3.1.0: - resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + seroval-plugins@1.5.4: + resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + seroval@1.5.4: + resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} + engines: {node: '>=10'} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sirv@3.0.2: - resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} - engines: {node: '>=18'} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -1166,6 +1144,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -1182,34 +1163,6 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} - svelte-check@4.4.8: - resolution: {integrity: sha512-67adfgBox5eNSNIvIIwgFizKGdcRrGpiMoNO2obHcYuLz7iTa8Xgm/NGU3ntMFnNm8K1grFOIG6HhMLX/vcN8w==} - engines: {node: '>= 18.0.0'} - hasBin: true - peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - typescript: '>=5.0.0' - - svelte-eslint-parser@1.6.1: - resolution: {integrity: sha512-hhvSH6kRj46UzrBVO5TaotD+Iuvruj5ccKBcO4wAhVcPTLmIc/c32D8UllBTYO0on4LzYuM0rNzf1lM/gBlkSQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.33.0} - peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - svelte: - optional: true - - svelte@5.55.5: - resolution: {integrity: sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw==} - engines: {node: '>=18'} - - tailwindcss@4.2.4: - resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} - - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} - tinyexec@1.1.2: resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} @@ -1218,42 +1171,34 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} @@ -1261,14 +1206,15 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vite-plugin-markdown@2.2.0: + resolution: {integrity: sha512-eH2tXMZcx3EHb5okd+/0VIyoR8Gp9pGe24UXitOOcGkzObbJ1vl48aGOAbakoT88FBdzC8MXNkMfBIB9VK0Ndg==} + peerDependencies: + vite: '>= 2.0.0' vite@8.0.11: resolution: {integrity: sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==} @@ -1313,22 +1259,8 @@ packages: yaml: optional: true - vitefu@1.1.3: - resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - vite: - optional: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} wrap-ansi@10.0.0: resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} @@ -1338,91 +1270,146 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} - yaml@1.10.3: - resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} - engines: {node: '>= 6'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yaml@2.8.4: resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} engines: {node: '>= 14.6'} hasBin: true - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zimmerframe@1.1.4: - resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: - '@alloc/quick-lru@5.2.0': {} - - '@emnapi/core@1.10.0': + '@babel/code-frame@7.29.0': dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - optional: true + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@emnapi/runtime@1.10.0': + '@babel/compat-data@7.29.3': {} + + '@babel/core@7.29.0': dependencies: - tslib: 2.8.1 - optional: true + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@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 - '@emnapi/wasi-threads@1.2.1': + '@babel/generator@7.29.1': dependencies: - tslib: 2.8.1 - optional: true + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.7.0))': + '@babel/helper-compilation-targets@7.28.6': dependencies: - eslint: 10.3.0(jiti@2.7.0) - eslint-visitor-keys: 3.4.3 + '@babel/compat-data': 7.29.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 - '@eslint-community/regexpp@4.12.2': {} + '@babel/helper-globals@7.28.0': {} - '@eslint/config-array@0.23.5': + '@babel/helper-module-imports@7.28.6': dependencies: - '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.5': + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': dependencies: - '@eslint/core': 1.2.1 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 - '@eslint/core@1.2.1': + '@babel/parser@7.29.3': dependencies: - '@types/json-schema': 7.0.15 + '@babel/types': 7.29.0 - '@eslint/js@10.0.1(eslint@10.3.0(jiti@2.7.0))': - optionalDependencies: - eslint: 10.3.0(jiti@2.7.0) + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@eslint/object-schema@3.0.5': {} + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@eslint/plugin-kit@0.7.1': + '@babel/template@7.28.6': dependencies: - '@eslint/core': 1.2.1 - levn: 0.4.1 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 - '@humanfs/core@0.19.2': + '@babel/traverse@7.29.0': dependencies: - '@humanfs/types': 0.15.0 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - '@humanfs/node@0.16.8': + '@babel/types@7.29.0': dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@humanfs/types@0.15.0': {} + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true - '@humanwhocodes/module-importer@1.0.1': {} + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true - '@humanwhocodes/retry@0.4.3': {} + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -1443,23 +1430,133 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@oxc-project/types@0.128.0': {} + + '@oxfmt/binding-android-arm-eabi@0.48.0': + optional: true + + '@oxfmt/binding-android-arm64@0.48.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.48.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.48.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.48.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.48.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.48.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.48.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.48.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.48.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.48.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.63.0': + optional: true + + '@oxlint/binding-android-arm64@1.63.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.63.0': + optional: true + + '@oxlint/binding-darwin-x64@1.63.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.63.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.63.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.63.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.63.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.63.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.63.0': optional: true - '@opentelemetry/api@1.9.1': {} + '@oxlint/binding-openharmony-arm64@1.63.0': + optional: true - '@oxc-project/types@0.128.0': {} + '@oxlint/binding-win32-arm64-msvc@1.63.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.63.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.63.0': + optional: true '@playwright/test@1.59.1': dependencies: playwright: 1.59.1 - '@polka/url@1.0.0-next.29': {} - '@rolldown/binding-android-arm64@1.0.0-rc.18': optional: true @@ -1511,250 +1608,136 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.18': {} - '@standard-schema/spec@1.1.0': {} - - '@sveltejs/acorn-typescript@1.0.9(acorn@8.16.0)': - dependencies: - acorn: 8.16.0 - - '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.59.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)))': - dependencies: - '@sveltejs/kit': 2.59.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) - - '@sveltejs/kit@2.59.1(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@6.0.3)(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4))': - dependencies: - '@standard-schema/spec': 1.1.0 - '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 7.1.2(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) - '@types/cookie': 0.6.0 - acorn: 8.16.0 - cookie: 0.6.0 - devalue: 5.8.0 - esm-env: 1.2.2 - kleur: 4.1.5 - magic-string: 0.30.21 - mrmime: 2.0.1 - set-cookie-parser: 3.1.0 - sirv: 3.0.2 - svelte: 5.55.5(@typescript-eslint/types@8.59.2) - vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) - optionalDependencies: - '@opentelemetry/api': 1.9.1 - typescript: 6.0.3 + '@rolldown/pluginutils@1.0.0-rc.7': {} - '@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4))': - dependencies: - deepmerge: 4.3.1 - magic-string: 0.30.21 - obug: 2.1.1 - svelte: 5.55.5(@typescript-eslint/types@8.59.2) - vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) - vitefu: 1.1.3(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)) + '@tanstack/history@1.161.6': {} - '@tailwindcss/node@4.2.4': + '@tanstack/react-router-devtools@1.166.13(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@tanstack/router-core@1.169.2)(csstype@3.2.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.21.0 - jiti: 2.7.0 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.2.4 - - '@tailwindcss/oxide-android-arm64@4.2.4': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.2.4': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.2.4': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.2.4': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.2.4': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': - optional: true - - '@tailwindcss/oxide@4.2.4': + '@tanstack/react-router': 1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-devtools-core': 1.167.3(@tanstack/router-core@1.169.2)(csstype@3.2.3) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-x64': 4.2.4 - '@tailwindcss/oxide-freebsd-x64': 4.2.4 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.4 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.4 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-x64-musl': 4.2.4 - '@tailwindcss/oxide-wasm32-wasi': 4.2.4 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 - - '@tailwindcss/postcss@4.2.4': - dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.2.4 - '@tailwindcss/oxide': 4.2.4 - postcss: 8.5.14 - tailwindcss: 4.2.4 + '@tanstack/router-core': 1.169.2 + transitivePeerDependencies: + - csstype - '@tailwindcss/vite@4.2.4(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4))': + '@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tailwindcss/node': 4.2.4 - '@tailwindcss/oxide': 4.2.4 - tailwindcss: 4.2.4 - vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) + '@tanstack/history': 1.161.6 + '@tanstack/react-store': 0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.169.2 + isbot: 5.1.40 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) - '@tybys/wasm-util@0.10.2': + '@tanstack/react-store@0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - tslib: 2.8.1 - optional: true - - '@types/cookie@0.6.0': {} - - '@types/esrecurse@4.3.1': {} - - '@types/estree@1.0.9': {} + '@tanstack/store': 0.9.3 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + use-sync-external-store: 1.6.0(react@19.2.6) - '@types/json-schema@7.0.15': {} - - '@types/mdast@4.0.4': + '@tanstack/router-core@1.169.2': dependencies: - '@types/unist': 2.0.11 + '@tanstack/history': 1.161.6 + cookie-es: 3.1.1 + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) - '@types/node@25.6.2': + '@tanstack/router-devtools-core@1.167.3(@tanstack/router-core@1.169.2)(csstype@3.2.3)': dependencies: - undici-types: 7.19.2 - - '@types/trusted-types@2.0.7': {} - - '@types/unist@2.0.11': {} + '@tanstack/router-core': 1.169.2 + clsx: 2.1.1 + goober: 2.1.18(csstype@3.2.3) + optionalDependencies: + csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': + '@tanstack/router-generator@1.166.42': dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.2 - eslint: 10.3.0(jiti@2.7.0) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.169.2 + '@tanstack/router-utils': 1.161.8 + '@tanstack/virtual-file-routes': 1.161.7 + jiti: 2.7.0 + magic-string: 0.30.21 + prettier: 3.8.3 + zod: 3.25.76 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.2 - debug: 4.4.3 - eslint: 10.3.0(jiti@2.7.0) - typescript: 6.0.3 + '@tanstack/router-plugin@1.167.35(@tanstack/react-router@1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.169.2 + '@tanstack/router-generator': 1.166.42 + '@tanstack/router-utils': 1.161.8 + '@tanstack/virtual-file-routes': 1.161.7 + chokidar: 3.6.0 + unplugin: 3.0.0 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.169.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': + '@tanstack/router-utils@1.161.8': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) - '@typescript-eslint/types': 8.59.2 - debug: 4.4.3 - typescript: 6.0.3 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + ansis: 4.2.0 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.4 + pathe: 2.0.3 + tinyglobby: 0.2.16 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.2': - dependencies: - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/visitor-keys': 8.59.2 + '@tanstack/store@0.9.3': {} - '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': - dependencies: - typescript: 6.0.3 + '@tanstack/virtual-file-routes@1.161.7': {} - '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': + '@tybys/wasm-util@0.10.2': dependencies: - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.3.0(jiti@2.7.0) - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color + tslib: 2.8.1 + optional: true - '@typescript-eslint/types@8.59.2': {} + '@types/linkify-it@5.0.0': {} - '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': + '@types/markdown-it@14.1.2': dependencies: - '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/visitor-keys': 8.59.2 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 - '@typescript-eslint/utils@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.59.2 - '@typescript-eslint/types': 8.59.2 - '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - eslint: 10.3.0(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color + '@types/mdurl@2.0.0': {} - '@typescript-eslint/visitor-keys@8.59.2': + '@types/node@25.6.2': dependencies: - '@typescript-eslint/types': 8.59.2 - eslint-visitor-keys: 5.0.1 + undici-types: 7.19.2 + + '@types/prismjs@1.26.5': {} - acorn-jsx@5.3.2(acorn@8.16.0): + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: - acorn: 8.16.0 + '@types/react': 19.2.14 - acorn@8.16.0: {} + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 - ajv@6.15.0: + '@vitejs/plugin-react@6.0.1(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4))': dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) ansi-escapes@7.3.0: dependencies: @@ -1764,40 +1747,57 @@ snapshots: ansi-styles@6.2.3: {} - aria-query@5.3.1: {} + ansis@4.2.0: {} - autoprefixer@10.5.0(postcss@8.5.14): + anymatch@3.1.3: dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001792 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.14 - postcss-value-parser: 4.2.0 + normalize-path: 3.0.0 + picomatch: 2.3.2 - axobject-query@4.1.0: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.3 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color - balanced-match@4.0.4: {} + baseline-browser-mapping@2.10.29: {} - baseline-browser-mapping@2.10.27: {} + binary-extensions@2.3.0: {} - brace-expansion@5.0.5: + braces@3.0.3: dependencies: - balanced-match: 4.0.4 + fill-range: 7.1.1 browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.27 + baseline-browser-mapping: 2.10.29 caniuse-lite: 1.0.30001792 - electron-to-chromium: 1.5.352 + electron-to-chromium: 1.5.353 node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) caniuse-lite@1.0.30001792: {} - chokidar@4.0.3: + chokidar@3.6.0: dependencies: - readdirp: 4.1.2 + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 cli-cursor@5.0.0: dependencies: @@ -1810,181 +1810,67 @@ snapshots: clsx@2.1.1: {} - cookie@0.6.0: {} + convert-source-map@2.0.0: {} - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + cookie-es@3.1.1: {} - cssesc@3.0.0: {} + csstype@3.2.3: {} debug@4.4.3: dependencies: ms: 2.1.3 - deep-is@0.1.4: {} - - deepmerge@4.3.1: {} - detect-libc@2.1.2: {} - devalue@5.8.0: {} - - electron-to-chromium@1.5.352: {} - - emoji-regex@10.6.0: {} - - enhanced-resolve@5.21.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - - environment@1.1.0: {} - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eslint-config-prettier@10.1.8(eslint@10.3.0(jiti@2.7.0)): - dependencies: - eslint: 10.3.0(jiti@2.7.0) + diff@8.0.4: {} - eslint-plugin-svelte@3.17.1(eslint@10.3.0(jiti@2.7.0))(svelte@5.55.5(@typescript-eslint/types@8.59.2)): + dom-serializer@1.4.1: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) - '@jridgewell/sourcemap-codec': 1.5.5 - eslint: 10.3.0(jiti@2.7.0) - esutils: 2.0.3 - globals: 16.5.0 - known-css-properties: 0.37.0 - postcss: 8.5.14 - postcss-load-config: 3.1.4(postcss@8.5.14) - postcss-safe-parser: 7.0.1(postcss@8.5.14) - semver: 7.7.4 - svelte-eslint-parser: 1.6.1(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - optionalDependencies: - svelte: 5.55.5(@typescript-eslint/types@8.59.2) - transitivePeerDependencies: - - ts-node + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 - eslint-scope@8.4.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 + domelementtype@2.3.0: {} - eslint-scope@9.1.2: + domhandler@4.3.1: dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint-visitor-keys@5.0.1: {} + domelementtype: 2.3.0 - eslint@10.3.0(jiti@2.7.0): + domutils@2.8.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.5.5 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 - ajv: 6.15.0 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.7.0 - transitivePeerDependencies: - - supports-color + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 - esm-env@1.2.2: {} + electron-to-chromium@1.5.353: {} - espree@10.4.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 4.2.1 + emoji-regex@10.6.0: {} - espree@11.2.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 5.0.1 + entities@2.1.0: {} - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 + entities@2.2.0: {} - esrap@2.2.6(@typescript-eslint/types@8.59.2): - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - optionalDependencies: - '@typescript-eslint/types': 8.59.2 + entities@4.5.0: {} - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 + environment@1.1.0: {} - estraverse@5.3.0: {} + escalade@3.2.0: {} - esutils@2.0.3: {} + esprima@4.0.1: {} eventemitter3@5.0.4: {} - fast-deep-equal@3.1.3: {} - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - find-up@5.0.0: + fill-range@7.1.1: dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 + to-regex-range: 5.0.1 - flat-cache@4.0.1: + front-matter@4.0.2: dependencies: - flatted: 3.4.2 - keyv: 4.5.4 - - flatted@3.4.2: {} - - fraction.js@5.3.4: {} + js-yaml: 3.14.2 fsevents@2.3.2: optional: true @@ -1992,60 +1878,57 @@ snapshots: fsevents@2.3.3: optional: true - get-east-asian-width@1.5.0: {} + gensync@1.0.0-beta.2: {} + + get-east-asian-width@1.6.0: {} - glob-parent@6.0.2: + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - globals@16.5.0: {} + goober@2.1.18(csstype@3.2.3): + dependencies: + csstype: 3.2.3 - graceful-fs@4.2.11: {} + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 husky@9.1.7: {} - ignore@5.3.2: {} - - ignore@7.0.5: {} - - imurmurhash@0.1.4: {} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 is-extglob@2.1.1: {} is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-reference@3.0.3: - dependencies: - '@types/estree': 1.0.9 + is-number@7.0.0: {} - isexe@2.0.0: {} + isbot@5.1.40: {} jiti@2.7.0: {} - json-buffer@3.0.1: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} + js-tokens@4.0.0: {} - keyv@4.5.4: + js-yaml@3.14.2: dependencies: - json-buffer: 3.0.1 + argparse: 1.0.10 + esprima: 4.0.1 - kleur@4.1.5: {} + jsesc@3.1.0: {} - known-css-properties@0.37.0: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 + json5@2.2.3: {} lightningcss-android-arm64@1.32.0: optional: true @@ -2096,9 +1979,15 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - lilconfig@2.1.0: {} + linkify-it@3.0.3: + dependencies: + uc.micro: 1.0.6 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 - lint-staged@17.0.2: + lint-staged@17.0.4: dependencies: listr2: 10.2.1 picomatch: 4.0.4 @@ -2115,12 +2004,6 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 10.0.0 - locate-character@3.0.0: {} - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - log-update@6.1.0: dependencies: ansi-escapes: 7.3.0 @@ -2129,67 +2012,101 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - mdsvex@0.12.7(svelte@5.55.5(@typescript-eslint/types@8.59.2)): + markdown-it@12.3.2: dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 2.0.11 - prism-svelte: 0.4.7 - prismjs: 1.30.0 - svelte: 5.55.5(@typescript-eslint/types@8.59.2) - unist-util-visit: 2.0.3 - vfile-message: 2.0.4 - - mimic-function@5.0.1: {} + argparse: 2.0.1 + entities: 2.1.0 + linkify-it: 3.0.3 + mdurl: 1.0.1 + uc.micro: 1.0.6 - minimatch@10.2.5: + markdown-it@14.1.0: dependencies: - brace-expansion: 5.0.5 + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 - mri@1.2.0: {} + mdurl@1.0.1: {} - mrmime@2.0.1: {} + mdurl@2.0.0: {} + + mimic-function@5.0.1: {} ms@2.1.3: {} nanoid@3.3.12: {} - natural-compare@1.4.0: {} - node-releases@2.0.38: {} - obug@2.1.1: {} + normalize-path@3.0.0: {} onetime@7.0.0: dependencies: mimic-function: 5.0.1 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: + oxfmt@0.48.0: dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-key@3.1.1: {} + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.48.0 + '@oxfmt/binding-android-arm64': 0.48.0 + '@oxfmt/binding-darwin-arm64': 0.48.0 + '@oxfmt/binding-darwin-x64': 0.48.0 + '@oxfmt/binding-freebsd-x64': 0.48.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.48.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.48.0 + '@oxfmt/binding-linux-arm64-gnu': 0.48.0 + '@oxfmt/binding-linux-arm64-musl': 0.48.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.48.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.48.0 + '@oxfmt/binding-linux-riscv64-musl': 0.48.0 + '@oxfmt/binding-linux-s390x-gnu': 0.48.0 + '@oxfmt/binding-linux-x64-gnu': 0.48.0 + '@oxfmt/binding-linux-x64-musl': 0.48.0 + '@oxfmt/binding-openharmony-arm64': 0.48.0 + '@oxfmt/binding-win32-arm64-msvc': 0.48.0 + '@oxfmt/binding-win32-ia32-msvc': 0.48.0 + '@oxfmt/binding-win32-x64-msvc': 0.48.0 + + oxlint@1.63.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.63.0 + '@oxlint/binding-android-arm64': 1.63.0 + '@oxlint/binding-darwin-arm64': 1.63.0 + '@oxlint/binding-darwin-x64': 1.63.0 + '@oxlint/binding-freebsd-x64': 1.63.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.63.0 + '@oxlint/binding-linux-arm-musleabihf': 1.63.0 + '@oxlint/binding-linux-arm64-gnu': 1.63.0 + '@oxlint/binding-linux-arm64-musl': 1.63.0 + '@oxlint/binding-linux-ppc64-gnu': 1.63.0 + '@oxlint/binding-linux-riscv64-gnu': 1.63.0 + '@oxlint/binding-linux-riscv64-musl': 1.63.0 + '@oxlint/binding-linux-s390x-gnu': 1.63.0 + '@oxlint/binding-linux-x64-gnu': 1.63.0 + '@oxlint/binding-linux-x64-musl': 1.63.0 + '@oxlint/binding-openharmony-arm64': 1.63.0 + '@oxlint/binding-win32-arm64-msvc': 1.63.0 + '@oxlint/binding-win32-ia32-msvc': 1.63.0 + '@oxlint/binding-win32-x64-msvc': 1.63.0 + + pathe@2.0.3: {} picocolors@1.1.1: {} + picomatch@2.3.2: {} + picomatch@4.0.4: {} playwright-core@1.59.1: {} @@ -2200,52 +2117,28 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - postcss-load-config@3.1.4(postcss@8.5.14): - dependencies: - lilconfig: 2.1.0 - yaml: 1.10.3 - optionalDependencies: - postcss: 8.5.14 - - postcss-safe-parser@7.0.1(postcss@8.5.14): - dependencies: - postcss: 8.5.14 - - postcss-scss@4.0.9(postcss@8.5.14): - dependencies: - postcss: 8.5.14 - - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-value-parser@4.2.0: {} - postcss@8.5.14: dependencies: nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 - prelude-ls@1.2.1: {} - - prettier-plugin-svelte@3.5.1(prettier@3.8.3)(svelte@5.55.5(@typescript-eslint/types@8.59.2)): - dependencies: - prettier: 3.8.3 - svelte: 5.55.5(@typescript-eslint/types@8.59.2) - prettier@3.8.3: {} - prism-svelte@0.4.7: {} + prismjs@1.30.0: {} - prism-themes@1.9.0: {} + punycode.js@2.3.1: {} - prismjs@1.30.0: {} + react-dom@19.2.6(react@19.2.6): + dependencies: + react: 19.2.6 + scheduler: 0.27.0 - punycode@2.3.1: {} + react@19.2.6: {} - readdirp@4.1.2: {} + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 restore-cursor@5.1.0: dependencies: @@ -2275,28 +2168,18 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 - sade@1.8.1: - dependencies: - mri: 1.2.0 - - semver@7.7.4: {} + scheduler@0.27.0: {} - set-cookie-parser@3.1.0: {} + semver@6.3.1: {} - shebang-command@2.0.0: + seroval-plugins@1.5.4(seroval@1.5.4): dependencies: - shebang-regex: 3.0.0 + seroval: 1.5.4 - shebang-regex@3.0.0: {} + seroval@1.5.4: {} signal-exit@4.1.0: {} - sirv@3.0.2: - dependencies: - '@polka/url': 1.0.0-next.29 - mrmime: 2.0.1 - totalist: 3.0.1 - slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -2309,72 +2192,25 @@ snapshots: source-map-js@1.2.1: {} + sprintf-js@1.0.3: {} + string-argv@0.3.2: {} string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 string-width@8.2.1: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 - svelte-check@4.4.8(picomatch@4.0.4)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@6.0.3): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - chokidar: 4.0.3 - fdir: 6.5.0(picomatch@4.0.4) - picocolors: 1.1.1 - sade: 1.8.1 - svelte: 5.55.5(@typescript-eslint/types@8.59.2) - typescript: 6.0.3 - transitivePeerDependencies: - - picomatch - - svelte-eslint-parser@1.6.1(svelte@5.55.5(@typescript-eslint/types@8.59.2)): - dependencies: - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - postcss: 8.5.14 - postcss-scss: 4.0.9(postcss@8.5.14) - postcss-selector-parser: 7.1.1 - semver: 7.7.4 - optionalDependencies: - svelte: 5.55.5(@typescript-eslint/types@8.59.2) - - svelte@5.55.5(@typescript-eslint/types@8.59.2): - dependencies: - '@jridgewell/remapping': 2.3.5 - '@jridgewell/sourcemap-codec': 1.5.5 - '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@types/estree': 1.0.9 - '@types/trusted-types': 2.0.7 - acorn: 8.16.0 - aria-query: 5.3.1 - axobject-query: 4.1.0 - clsx: 2.1.1 - devalue: 5.8.0 - esm-env: 1.2.2 - esrap: 2.2.6(@typescript-eslint/types@8.59.2) - is-reference: 3.0.3 - locate-character: 3.0.0 - magic-string: 0.30.21 - zimmerframe: 1.1.4 - transitivePeerDependencies: - - '@typescript-eslint/types' - - tailwindcss@4.2.4: {} - - tapable@2.3.3: {} - tinyexec@1.1.2: {} tinyglobby@0.2.16: @@ -2382,38 +2218,28 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - totalist@3.0.1: {} + tinypool@2.1.0: {} - ts-api-utils@2.5.0(typescript@6.0.3): + to-regex-range@5.0.1: dependencies: - typescript: 6.0.3 - - tslib@2.8.1: {} + is-number: 7.0.0 - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 + tslib@2.8.1: + optional: true typescript@6.0.3: {} - undici-types@7.19.2: {} - - unist-util-is@4.1.0: {} + uc.micro@1.0.6: {} - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.11 + uc.micro@2.1.0: {} - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 + undici-types@7.19.2: {} - unist-util-visit@2.0.3: + unplugin@3.0.0: dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: @@ -2421,16 +2247,17 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uri-js@4.4.1: + use-sync-external-store@1.6.0(react@19.2.6): dependencies: - punycode: 2.3.1 + react: 19.2.6 - util-deprecate@1.0.2: {} - - vfile-message@2.0.4: + vite-plugin-markdown@2.2.0(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)): dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position: 2.0.3 + domhandler: 4.3.1 + front-matter: 4.0.2 + htmlparser2: 6.1.0 + markdown-it: 12.3.2 + vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4): dependencies: @@ -2445,15 +2272,7 @@ snapshots: jiti: 2.7.0 yaml: 2.8.4 - vitefu@1.1.3(vite@8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4)): - optionalDependencies: - vite: 8.0.11(@types/node@25.6.2)(jiti@2.7.0)(yaml@2.8.4) - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - word-wrap@1.2.5: {} + webpack-virtual-modules@0.6.2: {} wrap-ansi@10.0.0: dependencies: @@ -2467,11 +2286,9 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 - yaml@1.10.3: {} + yallist@3.1.1: {} yaml@2.8.4: optional: true - yocto-queue@0.1.0: {} - - zimmerframe@1.1.4: {} + zod@3.25.76: {} diff --git a/postcss.config.mjs b/postcss.config.mjs deleted file mode 100644 index 8168db8..0000000 --- a/postcss.config.mjs +++ /dev/null @@ -1,4 +0,0 @@ -export default { - "@tailwindcss/postcss": {}, - autoprefixer: {}, -}; diff --git a/static/family.webp b/public/family.webp similarity index 100% rename from static/family.webp rename to public/family.webp diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..36224a543c991031eb0312e62a5f5a601a6a32d3 GIT binary patch literal 3195 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 u@pOy$|A0=*;qOa8 - -// See https://kit.svelte.dev/docs/types#the-app-namespace -// for information about these interfaces -declare namespace App { - // interface Locals {} - // interface Platform {} - // interface Session {} - // interface Stuff {} -} - -declare module "*.svelte" { - import type { Component } from "svelte"; - - const component: Component; - export default component; -} diff --git a/src/app.html b/src/app.html deleted file mode 100644 index c00d228..0000000 --- a/src/app.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - %sveltekit.head% - - -
%sveltekit.body%
- - diff --git a/src/components/Command.tsx b/src/components/Command.tsx new file mode 100644 index 0000000..9038f15 --- /dev/null +++ b/src/components/Command.tsx @@ -0,0 +1,5 @@ +import type { ReactNode } from "react"; + +export function Command({ children }: { children: ReactNode }) { + return

aj@rva $ {children}

; +} diff --git a/src/components/PostList.tsx b/src/components/PostList.tsx new file mode 100644 index 0000000..ebaf036 --- /dev/null +++ b/src/components/PostList.tsx @@ -0,0 +1,21 @@ +import { Link } from "@tanstack/react-router"; + +import { posts } from "../data"; + +export function PostList() { + return ( +
    + {posts.map((post) => ( +
  • +
    + + {post.title} + + {post.tags.join(" / ")} +
    +
    {post.description}
    +
  • + ))} +
+ ); +} diff --git a/src/components/Shell.tsx b/src/components/Shell.tsx new file mode 100644 index 0000000..54118a2 --- /dev/null +++ b/src/components/Shell.tsx @@ -0,0 +1,32 @@ +import { Link, Outlet } from "@tanstack/react-router"; +import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"; + +export function Shell({ title }: { title: string }) { + return ( +
+
+ + AJ Bienz + + +
+ +
+ +
+ +
+
+ +
+ ); +} diff --git a/src/components/SocialLinks.tsx b/src/components/SocialLinks.tsx new file mode 100644 index 0000000..3aede8b --- /dev/null +++ b/src/components/SocialLinks.tsx @@ -0,0 +1,13 @@ +import { socials } from "../data"; + +export function SocialLinks() { + return ( + + ); +} diff --git a/src/data.ts b/src/data.ts new file mode 100644 index 0000000..c5fb35d --- /dev/null +++ b/src/data.ts @@ -0,0 +1,76 @@ +import { html as aboutHtml } from "./markdown/about.md"; + +type Frontmatter = { + title: string; + description: string; + tags: string[]; +}; + +type MarkdownDocument = { + attributes: Record; + html: string; +}; + +export type Post = Frontmatter & { + id: string; + html: string; +}; + +const modules = import.meta.glob("./markdown/posts/*.md", { + eager: true, +}); + +export const posts: Post[] = Object.entries(modules) + .map(([path, document]) => { + const id = path.split("/").pop()?.replace(/\.md$/, ""); + + if (!id || !isMarkdownDocument(document)) { + throw new Error(`Invalid post import: ${path}`); + } + + const frontmatter = parsePostFrontmatter(document.attributes, path); + + return { + id, + ...frontmatter, + html: document.html, + }; + }) + .sort((a, b) => a.id.localeCompare(b.id)); + +export const about = { + html: aboutHtml, +}; + +export const socials = [ + { label: "GitHub", href: "https://github.com/bienzaaron" }, + { label: "LinkedIn", href: "https://www.linkedin.com/in/abienz" }, + { label: "npm", href: "https://www.npmjs.com/~ajbienz" }, +]; + +function isMarkdownDocument(value: unknown): value is MarkdownDocument { + return ( + typeof value === "object" && + value !== null && + "attributes" in value && + "html" in value && + typeof value.html === "string" + ); +} + +function parsePostFrontmatter(fields: Record, path: string): Frontmatter { + if ( + typeof fields.title !== "string" || + typeof fields.description !== "string" || + !Array.isArray(fields.tags) || + !fields.tags.every((tag) => typeof tag === "string") + ) { + throw new Error(`Invalid frontmatter in ${path}`); + } + + return { + title: fields.title, + description: fields.description, + tags: fields.tags, + }; +} diff --git a/src/highlight.css b/src/highlight.css deleted file mode 100644 index d79ac80..0000000 --- a/src/highlight.css +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Dracula Theme originally by Zeno Rocha [@zenorocha] - * https://draculatheme.com/ - * - * Ported for PrismJS by Albert Vallverdu [@byverdu] - */ - -code[class*="language-"], -pre[class*="language-"] { - color: #f8f8f2; - background: none; - text-shadow: 0 1px rgba(0, 0, 0, 0.3); - font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - margin: 0.5em 0; - overflow: auto; - border-radius: 0.3em; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background: #282a36; -} - -/* Inline code */ -:not(pre) > code[class*="language-"] { - padding: 0.1em; - border-radius: 0.3em; - white-space: normal; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #6272a4; -} - -.token.punctuation { - color: #f8f8f2; -} - -.namespace { - opacity: 0.7; -} - -.token.property, -.token.tag, -.token.constant, -.token.symbol, -.token.deleted { - color: #ff79c6; -} - -.token.boolean, -.token.number { - color: #bd93f9; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: #50fa7b; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string, -.token.variable { - color: #f8f8f2; -} - -.token.atrule, -.token.attr-value, -.token.function, -.token.class-name { - color: #f1fa8c; -} - -.token.keyword { - color: #8be9fd; -} - -.token.regex, -.token.important { - color: #ffb86c; -} - -.token.important, -.token.bold { - font-weight: bold; -} - -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} diff --git a/src/lib/actions/click-outside.ts b/src/lib/actions/click-outside.ts deleted file mode 100644 index e85a5ef..0000000 --- a/src/lib/actions/click-outside.ts +++ /dev/null @@ -1,15 +0,0 @@ -export default function clickOutside(node: HTMLElement, handler: () => void) { - const onClick = (event: MouseEvent) => { - if (!node.contains(event.target as Node)) { - handler(); - } - }; - - document.addEventListener("click", onClick, true); - - return { - destroy() { - document.removeEventListener("click", onClick, true); - }, - }; -} diff --git a/src/lib/components/family.svelte b/src/lib/components/family.svelte deleted file mode 100644 index bf0270b..0000000 --- a/src/lib/components/family.svelte +++ /dev/null @@ -1,12 +0,0 @@ -
- me, my wife, dog, and two cats -
diff --git a/src/lib/components/icons/github.svelte b/src/lib/components/icons/github.svelte deleted file mode 100644 index b8f7bf1..0000000 --- a/src/lib/components/icons/github.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/src/lib/components/icons/linkedin.svelte b/src/lib/components/icons/linkedin.svelte deleted file mode 100644 index 46fb530..0000000 --- a/src/lib/components/icons/linkedin.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/src/lib/components/icons/menu.svelte b/src/lib/components/icons/menu.svelte deleted file mode 100644 index 2599126..0000000 --- a/src/lib/components/icons/menu.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/src/lib/components/icons/npm.svelte b/src/lib/components/icons/npm.svelte deleted file mode 100644 index 4e4361b..0000000 --- a/src/lib/components/icons/npm.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/src/lib/markdown/about.md b/src/lib/markdown/about.md deleted file mode 100644 index 3a4685d..0000000 --- a/src/lib/markdown/about.md +++ /dev/null @@ -1,7 +0,0 @@ -# About Me - -Hey, there! Thanks for checking out my site. I'm a full-stack software engineer, currently employed at Capital One and living in Richmond, Virgina with my wife, dog, and two cats. - -My technical interests include systems programming and embedded systems (although, I don't get to work on that sort of technology much in a professional capacity these days). For work, I work with TypeScript and Node.js quite a lot, and also work on some vanilla JS web frontend stuff. I don't do a whole lot of frontend application development or design work, but I'll do it if you twist my arm - I always try to find tooling that makes it as easy as possible though. For example, this site is mostly written in markdown, and almost all of the styles come from [Tailwind](https://tailwindcss.com/). More about how this site is built over on my [blog](/blog/). - -When I'm not writing code, I can usually be found sipping on a cup of coffee or pursuing one of my many hobbies. I enjoy camping, backpacking, fishing, and just generally anything that gets me outdoors - bonus points if I can bring my pup with me! I'm also an avid woodworker, motorcyclist, home mechanic, and general tinkerer. I always have a project going on (or more realisitically, several), so you'll never find me without something to work on - lately I've been juggling a few home renovation projects. You can check out my [blog pages](/blog/) to find our more about my projects and hobbies. diff --git a/src/lib/markdown/family.md b/src/lib/markdown/family.md deleted file mode 100644 index 71caf26..0000000 --- a/src/lib/markdown/family.md +++ /dev/null @@ -1,7 +0,0 @@ - - -Also, here's a picture of me, my wife, and all my pets 🐶 😸 - - diff --git a/src/lib/markdown/intro.md b/src/lib/markdown/intro.md deleted file mode 100644 index dd7934f..0000000 --- a/src/lib/markdown/intro.md +++ /dev/null @@ -1,4 +0,0 @@ -Hey! I'm AJ. I'm a software engineer and general computer nerd, currently living in Richmond, VA and employed at Capital -One. - -This is my little corner of the internet. Feel free to click around to find more about me, read some of my partially-coherent ramblings, and even download my resume if you are interested in hiring me. 😱 diff --git a/src/lib/types.ts b/src/lib/types.ts deleted file mode 100644 index 1f17a9c..0000000 --- a/src/lib/types.ts +++ /dev/null @@ -1,28 +0,0 @@ -export type TagMetadata = { count: number; selected: boolean }; - -export type PostMetadata = { - tags: string[]; - title: string; - description: string; -}; - -export type PostPreview = { - id: string; - metadata: PostMetadata; -}; - -export type Post = PostPreview & { - content: string; -}; - -export type GetPostRequest = { - params: { - postId: string; - }; -}; - -export type GetPostsResponse = PostPreview[]; - -export type SvelteStore = { - subscribe: (run: (value: T) => unknown, invalidate?: unknown) => unknown; -}; diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..1ea2294 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; +import { RouterProvider } from "@tanstack/react-router"; + +import { getRouter } from "./router"; +import "./styles.css"; + +const router = getRouter(); + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/src/markdown.d.ts b/src/markdown.d.ts deleted file mode 100644 index 43d69c1..0000000 --- a/src/markdown.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -declare module "blog/*.md" { - import { SvelteComponent } from "svelte"; - import type { PostMetadata } from "$lib/types"; - export default class MarkdownComponent extends SvelteComponent< - Record - > {} - export type metadata = PostMetadata; -} - -declare module "*.md" { - import { SvelteComponent } from "svelte"; - export default class MarkdownComponent extends SvelteComponent< - Record - > {} - export type metadata = Record; -} diff --git a/src/markdown/about.md b/src/markdown/about.md new file mode 100644 index 0000000..be7ecf5 --- /dev/null +++ b/src/markdown/about.md @@ -0,0 +1,7 @@ +# About Me + +Hey, there! Thanks for checking out my site. I'm a full-stack software engineer, currently employed at Capital One and living in Richmond, Virginia with my wife, dog, and two cats. + +My technical interests include systems programming and embedded systems although I don't get to work on that sort of technology much in a professional capacity these days. For work, I work with TypeScript and Node.js quite a lot, and also work on some vanilla JS web frontend stuff. + +When I'm not writing code, I can usually be found sipping on a cup of coffee or pursuing one of my many hobbies. I enjoy camping, backpacking, fishing, woodworking, motorcycling, home mechanics, and general tinkering. diff --git a/src/lib/markdown/blog/1-building-this-site.md b/src/markdown/posts/1-building-this-site.md similarity index 100% rename from src/lib/markdown/blog/1-building-this-site.md rename to src/markdown/posts/1-building-this-site.md diff --git a/src/lib/markdown/blog/2-another-post.md b/src/markdown/posts/2-another-post.md similarity index 69% rename from src/lib/markdown/blog/2-another-post.md rename to src/markdown/posts/2-another-post.md index cec2a0d..34fe49a 100644 --- a/src/lib/markdown/blog/2-another-post.md +++ b/src/markdown/posts/2-another-post.md @@ -4,4 +4,4 @@ title: "Just Messin' Around" description: "blah blah blah" --- -This is really just here for testing purposes +This is really just here for testing purposes. diff --git a/src/pages/About.tsx b/src/pages/About.tsx new file mode 100644 index 0000000..8c27ab1 --- /dev/null +++ b/src/pages/About.tsx @@ -0,0 +1,11 @@ +import { Command } from "../components/Command"; +import { about } from "../data"; + +export function About() { + return ( + <> + cat about.md +
+ + ); +} diff --git a/src/pages/Blog.tsx b/src/pages/Blog.tsx new file mode 100644 index 0000000..b23d86c --- /dev/null +++ b/src/pages/Blog.tsx @@ -0,0 +1,11 @@ +import { Command } from "../components/Command"; +import { PostList } from "../components/PostList"; + +export function Blog() { + return ( + <> + ls notes + + + ); +} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx new file mode 100644 index 0000000..20e5155 --- /dev/null +++ b/src/pages/Home.tsx @@ -0,0 +1,34 @@ +import { Command } from "../components/Command"; +import { PostList } from "../components/PostList"; +import { SocialLinks } from "../components/SocialLinks"; + +export function Home() { + return ( + <> + whoami +
+

+ Hey! I'm AJ. I'm a software engineer and general computer nerd, currently living + in Richmond, VA and employed at Capital One. +

+

+ This is my little corner of the internet. Feel free to click around to find more about me, + read some of my partially-coherent ramblings, and even download my resume if you are + interested in hiring me. +

+
+ + ls notes + + + cat family.webp +
+ me, my wife, dog, and two cats +
Me, my wife, and the pets who run the house.
+
+ + cat socials.md + + + ); +} diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx new file mode 100644 index 0000000..7544691 --- /dev/null +++ b/src/pages/NotFound.tsx @@ -0,0 +1,15 @@ +import { Command } from "../components/Command"; + +export function NotFound() { + return ( + <> + cat missing-file +
+

Not Found

+

+ That page does not exist. Try heading home. +

+
+ + ); +} diff --git a/src/pages/PostPage.tsx b/src/pages/PostPage.tsx new file mode 100644 index 0000000..e01ef1f --- /dev/null +++ b/src/pages/PostPage.tsx @@ -0,0 +1,15 @@ +import type { Post } from "../data"; +import { Command } from "../components/Command"; + +export function PostPage({ post }: { post: Post }) { + return ( + <> + cat notes/{post.id}.md +
+

{post.title}

+

{post.description}

+
+
+ + ); +} diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts new file mode 100644 index 0000000..157debe --- /dev/null +++ b/src/routeTree.gen.ts @@ -0,0 +1,113 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from "./routes/__root"; +import { Route as BlogRouteImport } from "./routes/blog"; +import { Route as AboutRouteImport } from "./routes/about"; +import { Route as IndexRouteImport } from "./routes/index"; +import { Route as BlogPostIdRouteImport } from "./routes/blog_.$postId"; + +const BlogRoute = BlogRouteImport.update({ + id: "/blog", + path: "/blog", + getParentRoute: () => rootRouteImport, +} as any); +const AboutRoute = AboutRouteImport.update({ + id: "/about", + path: "/about", + getParentRoute: () => rootRouteImport, +} as any); +const IndexRoute = IndexRouteImport.update({ + id: "/", + path: "/", + getParentRoute: () => rootRouteImport, +} as any); +const BlogPostIdRoute = BlogPostIdRouteImport.update({ + id: "/blog_/$postId", + path: "/blog/$postId", + getParentRoute: () => rootRouteImport, +} as any); + +export interface FileRoutesByFullPath { + "/": typeof IndexRoute; + "/about": typeof AboutRoute; + "/blog": typeof BlogRoute; + "/blog/$postId": typeof BlogPostIdRoute; +} +export interface FileRoutesByTo { + "/": typeof IndexRoute; + "/about": typeof AboutRoute; + "/blog": typeof BlogRoute; + "/blog/$postId": typeof BlogPostIdRoute; +} +export interface FileRoutesById { + __root__: typeof rootRouteImport; + "/": typeof IndexRoute; + "/about": typeof AboutRoute; + "/blog": typeof BlogRoute; + "/blog_/$postId": typeof BlogPostIdRoute; +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath; + fullPaths: "/" | "/about" | "/blog" | "/blog/$postId"; + fileRoutesByTo: FileRoutesByTo; + to: "/" | "/about" | "/blog" | "/blog/$postId"; + id: "__root__" | "/" | "/about" | "/blog" | "/blog_/$postId"; + fileRoutesById: FileRoutesById; +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute; + AboutRoute: typeof AboutRoute; + BlogRoute: typeof BlogRoute; + BlogPostIdRoute: typeof BlogPostIdRoute; +} + +declare module "@tanstack/react-router" { + interface FileRoutesByPath { + "/blog": { + id: "/blog"; + path: "/blog"; + fullPath: "/blog"; + preLoaderRoute: typeof BlogRouteImport; + parentRoute: typeof rootRouteImport; + }; + "/about": { + id: "/about"; + path: "/about"; + fullPath: "/about"; + preLoaderRoute: typeof AboutRouteImport; + parentRoute: typeof rootRouteImport; + }; + "/": { + id: "/"; + path: "/"; + fullPath: "/"; + preLoaderRoute: typeof IndexRouteImport; + parentRoute: typeof rootRouteImport; + }; + "/blog_/$postId": { + id: "/blog_/$postId"; + path: "/blog/$postId"; + fullPath: "/blog/$postId"; + preLoaderRoute: typeof BlogPostIdRouteImport; + parentRoute: typeof rootRouteImport; + }; + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AboutRoute: AboutRoute, + BlogRoute: BlogRoute, + BlogPostIdRoute: BlogPostIdRoute, +}; +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes(); diff --git a/src/router.tsx b/src/router.tsx new file mode 100644 index 0000000..9e1670a --- /dev/null +++ b/src/router.tsx @@ -0,0 +1,17 @@ +import { createRouter } from "@tanstack/react-router"; + +import { routeTree } from "./routeTree.gen"; + +export function getRouter() { + return createRouter({ + routeTree, + defaultPreload: "intent", + scrollRestoration: true, + }); +} + +declare module "@tanstack/react-router" { + interface Register { + router: ReturnType; + } +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte deleted file mode 100644 index b6e49c2..0000000 --- a/src/routes/+layout.svelte +++ /dev/null @@ -1,144 +0,0 @@ - - - - AJ Bienz - - - -
- -
-
-
(showMenu = false)}> - -
-
- {#if showMenu} - - {/if} -
-
-
-
- {@render children?.()} -
- - -
- - diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts deleted file mode 100644 index e325c17..0000000 --- a/src/routes/+layout.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const prerender = true; -export const trailingSlash = "always"; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte deleted file mode 100644 index e02f481..0000000 --- a/src/routes/+page.svelte +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -
- {#each commands as command} -
- -
- -
-
- {/each} -
- -{#if useAnimation} - -{/if} - - diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx new file mode 100644 index 0000000..373ea9f --- /dev/null +++ b/src/routes/__root.tsx @@ -0,0 +1,28 @@ +import { createRootRoute, useRouterState } from "@tanstack/react-router"; + +import { Shell } from "../components/Shell"; + +export const Route = createRootRoute({ + component: Root, +}); + +function Root() { + const title = useRouterState({ + select: (state) => { + const loaderData = state.matches.at(-1)?.loaderData; + + return hasShellTitle(loaderData) ? loaderData.title : "not-found"; + }, + }); + + return ; +} + +function hasShellTitle(value: unknown): value is { title: string } { + return ( + typeof value === "object" && + value !== null && + "title" in value && + typeof value.title === "string" + ); +} diff --git a/src/routes/about.tsx b/src/routes/about.tsx new file mode 100644 index 0000000..bedd70f --- /dev/null +++ b/src/routes/about.tsx @@ -0,0 +1,8 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { About } from "../pages/About"; + +export const Route = createFileRoute("/about")({ + loader: () => ({ title: "about" }), + component: About, +}); diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte deleted file mode 100644 index 415e3a6..0000000 --- a/src/routes/about/+page.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/src/routes/api/post/[postId]/+server.ts b/src/routes/api/post/[postId]/+server.ts deleted file mode 100644 index cc6fe2c..0000000 --- a/src/routes/api/post/[postId]/+server.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { render } from "svelte/server"; -import type { GetPostRequest, Post } from "$lib/types"; -import { json, type RequestHandler } from "@sveltejs/kit"; -import type { SvelteComponent } from "svelte"; - -export const GET: RequestHandler = async ({ - params, -}) => { - const post: SvelteComponent> = await import( - `../../../../lib/markdown/blog/${params.postId}.md` - ); - return json({ - id: params.postId, - metadata: post.metadata, - content: render(post.default).body, - }); -}; diff --git a/src/routes/api/posts/+server.ts b/src/routes/api/posts/+server.ts deleted file mode 100644 index 82d0b9b..0000000 --- a/src/routes/api/posts/+server.ts +++ /dev/null @@ -1,21 +0,0 @@ -import path from "node:path"; -import type { GetPostsResponse, Post, PostPreview } from "$lib/types"; -import { json, type RequestHandler } from "@sveltejs/kit"; - -// I love vite, this is so cool !?!?!?! -const posts = import.meta.glob("$lib/markdown/blog/*.md"); - -export const GET: RequestHandler = async () => { - return json( - await Promise.all( - Object.entries(posts).map(async ([filePath, resolver]) => { - const id = path.basename(filePath, path.extname(filePath)); - const post: Post = await resolver(); - return { - id, - metadata: post.metadata, - }; - }), - ), - ); -}; diff --git a/src/routes/blog.tsx b/src/routes/blog.tsx new file mode 100644 index 0000000..a9e8c3e --- /dev/null +++ b/src/routes/blog.tsx @@ -0,0 +1,8 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { Blog } from "../pages/Blog"; + +export const Route = createFileRoute("/blog")({ + loader: () => ({ title: "notes" }), + component: Blog, +}); diff --git a/src/routes/blog/+layout.svelte b/src/routes/blog/+layout.svelte deleted file mode 100644 index c57305c..0000000 --- a/src/routes/blog/+layout.svelte +++ /dev/null @@ -1,70 +0,0 @@ - - -
- {#if isRoot} -
-

Tags

- {#each sortedTags as tag} - - {/each} -
- {/if} -
- {@render children?.()} -
-
diff --git a/src/routes/blog/+layout.ts b/src/routes/blog/+layout.ts deleted file mode 100644 index b80d9b8..0000000 --- a/src/routes/blog/+layout.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { PostPreview } from "$lib/types"; -import type { LayoutLoad } from "./$types"; - -export const load: LayoutLoad<{ posts: PostPreview[] }> = async ({ fetch }) => { - const response = await fetch("/api/posts"); - const posts = await response.json(); - - return { - posts, - }; -}; diff --git a/src/routes/blog/+page.svelte b/src/routes/blog/+page.svelte deleted file mode 100644 index 0eaf323..0000000 --- a/src/routes/blog/+page.svelte +++ /dev/null @@ -1,36 +0,0 @@ - - -
-

Posts

- - {#each filteredPosts as post} - -

{post.metadata.title}

-

- {post.metadata.description} -

-
- {/each} -
diff --git a/src/routes/blog/[postId]/+page.svelte b/src/routes/blog/[postId]/+page.svelte deleted file mode 100644 index b2514e2..0000000 --- a/src/routes/blog/[postId]/+page.svelte +++ /dev/null @@ -1,23 +0,0 @@ - - -

{post.metadata.title}

-{#if PostContent} - -{/if} diff --git a/src/routes/blog/[postId]/+page.ts b/src/routes/blog/[postId]/+page.ts deleted file mode 100644 index ca09561..0000000 --- a/src/routes/blog/[postId]/+page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { Post } from "$lib/types"; - -import type { PageLoad } from "./$types"; - -export const load: PageLoad<{ post: Post }> = async ({ fetch, params }) => { - const response = await fetch(`/api/post/${params.postId}`); - const post = await response.json(); - - return { - post, - }; -}; diff --git a/src/routes/blog_.$postId.tsx b/src/routes/blog_.$postId.tsx new file mode 100644 index 0000000..a957e47 --- /dev/null +++ b/src/routes/blog_.$postId.tsx @@ -0,0 +1,27 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { posts } from "../data"; +import { NotFound } from "../pages/NotFound"; +import { PostPage } from "../pages/PostPage"; + +export const Route = createFileRoute("/blog_/$postId")({ + loader: ({ params: { postId } }) => { + const post = posts.find((entry) => entry.id === postId); + + return { + post, + title: post?.title.toLowerCase() ?? "not-found", + }; + }, + component: PostComponent, +}); + +function PostComponent() { + const { post } = Route.useLoaderData(); + + if (!post) { + return ; + } + + return ; +} diff --git a/src/routes/index.tsx b/src/routes/index.tsx new file mode 100644 index 0000000..182912e --- /dev/null +++ b/src/routes/index.tsx @@ -0,0 +1,8 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { Home } from "../pages/Home"; + +export const Route = createFileRoute("/")({ + loader: () => ({ title: "home" }), + component: Home, +}); diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..f7f3119 --- /dev/null +++ b/src/styles.css @@ -0,0 +1,321 @@ +:root { + --bg: #f3f0e8; + --window: #fbfaf6; + --chrome: #e7e2d8; + --ink: #202020; + --muted: #66615a; + --faint: #8a8378; + --line: #d2cabd; + --prompt: #5b4b39; + --link: #7a3f16; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + background: var(--bg); + color: var(--ink); + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; + font-size: 13px; + line-height: 1.55; +} + +a { + color: var(--link); + text-underline-offset: 0.2em; +} + +.page { + width: min(780px, calc(100% - 28px)); + margin: 0 auto; + padding: 20px 0 48px; +} + +.site-header { + display: flex; + justify-content: space-between; + gap: 18px; + margin-bottom: 14px; + color: var(--muted); +} + +.brand { + color: var(--ink); + font-weight: 700; + text-decoration: none; +} + +nav { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 12px; +} + +nav a { + color: var(--muted); + text-decoration: none; +} + +nav a:hover, +nav a:focus { + color: var(--link); + text-decoration: underline; +} + +.window { + overflow: hidden; + border: 1px solid rgba(32, 32, 32, 0.16); + border-radius: 8px; + background: var(--window); + box-shadow: 0 12px 34px rgba(32, 32, 32, 0.08); +} + +.bar { + display: flex; + align-items: center; + gap: 7px; + padding: 7px 10px; + border-bottom: 1px solid var(--line); + background: var(--chrome); + color: var(--muted); + font-size: 11px; +} + +.dot { + width: 8px; + height: 8px; + border-radius: 999px; + background: #c96f62; +} + +.dot:nth-child(2) { + background: #c5a35c; +} + +.dot:nth-child(3) { + margin-right: 7px; + background: #8f9a83; +} + +main { + padding: clamp(16px, 4vw, 30px); +} + +.cmd { + margin: 22px 0 8px; + color: var(--prompt); + font-weight: 700; +} + +.cmd:first-child { + margin-top: 0; +} + +.output { + max-width: 72ch; + margin: 0 9ch 12px 7ch; + color: #2f2d2a; + font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + font-size: 1rem; + line-height: 1.62; +} + +.output p { + margin: 0 0 0.85rem; +} + +.muted, +.lede { + color: var(--muted); +} + +.notes { + display: grid; + gap: 0; + max-width: 72ch; + padding: 0; + margin: 0 9ch; + list-style: none; +} + +.notes li { + padding: 11px 0; + border-top: 1px solid var(--line); +} + +.notes li:first-child { + border-top: 0; + padding-top: 0; +} + +.note-head { + display: flex; + justify-content: space-between; + gap: 12px; +} + +.note-head a { + font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + font-size: 1rem; + font-weight: 700; +} + +.tag { + color: var(--faint); + font-size: 11px; + white-space: nowrap; +} + +.note-desc { + margin-top: 3px; + color: var(--muted); + font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + font-size: 0.98rem; +} + +.family { + max-width: 72ch; + margin: 0 9ch; +} + +.family img { + display: block; + width: min(240px, 100%); + height: auto; + margin: 0 auto 10px; + border: 1px solid var(--line); + border-radius: 8px; +} + +.caption { + margin: 0; + color: var(--muted); + font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + font-size: 0.98rem; + text-align: center; +} + +.socials { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 12px; + padding: 0; + margin: 0 9ch; + list-style: none; +} + +.document h1 { + margin: 0 0 0.85rem; + font-size: 1.45rem; + line-height: 1.2; +} + +.document pre { + overflow-x: auto; + padding: 12px; + border: 1px solid var(--line); + border-radius: 6px; + background: #f0ece2; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; + font-size: 0.85rem; +} + +.document code { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; +} + +.document :not(pre) > code { + padding: 0.08rem 0.24rem; + border: 1px solid color-mix(in srgb, var(--line), transparent 35%); + border-radius: 4px; + background: #f0ece2; + color: #5b4b39; + font-size: 0.88em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #777066; +} + +.token.punctuation { + color: #5f5a52; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol { + color: #8a4c25; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #687447; +} + +.token.operator, +.token.entity, +.token.url, +.token.variable { + color: #6b5b45; +} + +.token.atrule, +.token.attr-value, +.token.function, +.token.class-name { + color: #7a3f16; +} + +.token.keyword { + color: #704978; +} + +.token.regex, +.token.important { + color: #9a5b2f; +} + +@media (max-width: 640px) { + .page { + width: calc(100% - 16px); + padding-top: 10px; + } + + .site-header, + .note-head { + display: block; + } + + nav { + justify-content: flex-start; + margin-top: 8px; + } + + .output, + .notes, + .family, + .socials { + margin-right: 0; + margin-left: 0; + } + + .tag { + display: block; + margin-top: 2px; + } +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..211ae17 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,8 @@ +/// + +declare module "*.md" { + const attributes: Record; + const html: string; + + export { attributes, html }; +} diff --git a/static/favicon.png b/static/favicon.png deleted file mode 100644 index 290394c96a4e9e335ab51d0f4c15fa5bca705d81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7363 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 u)g851`1`B$yQ{?ElFw>HlEJ { +test("about page renders markdown content", async ({ page }) => { await page.goto("/about"); -}); -test("the about page renders", async ({ page }) => { - const target = page - .getByText("Hey, there! Thanks for checking out my site.") - .first(); - await expect(target).toBeVisible(); + await expect(page.getByRole("heading", { name: "About Me" })).toBeVisible(); + await expect( + page.getByText("Hey, there! Thanks for checking out my site.").first(), + ).toBeVisible(); }); diff --git a/tests/blog-entry.spec.ts b/tests/blog-entry.spec.ts index ae9c49c..2def484 100644 --- a/tests/blog-entry.spec.ts +++ b/tests/blog-entry.spec.ts @@ -1,30 +1,14 @@ -import { test, expect } from "@playwright/test"; +import { expect, test } from "@playwright/test"; -test("blog entries render correctly", async ({ page }) => { - await page.goto("/blog/2-another-post/"); +test("blog entries render markdown content", async ({ page }) => { + await page.goto("/blog/2-another-post"); - await expect( - page.getByRole("heading", { name: "Just Messin' Around" }), - ).toBeVisible(); - await expect( - page.getByText("This is really just here for testing purposes"), - ).toBeVisible(); + await expect(page.getByRole("heading", { name: "Just Messin' Around" })).toBeVisible(); + await expect(page.getByText("This is really just here for testing purposes")).toBeVisible(); }); -test("blog entries include prerendered content without JavaScript", async ({ - browser, - baseURL, -}) => { - const context = await browser.newContext({ javaScriptEnabled: false }); - const page = await context.newPage(); +test("code blocks are syntax highlighted", async ({ page }) => { + await page.goto("/blog/1-building-this-site"); - await page.goto(`${baseURL}/blog/2-another-post/`); - await expect( - page.getByRole("heading", { name: "Just Messin' Around" }), - ).toBeVisible(); - await expect( - page.getByText("This is really just here for testing purposes"), - ).toBeVisible(); - - await context.close(); + await expect(page.locator("pre code .token.function").first()).toBeVisible(); }); diff --git a/tests/blog.spec.ts b/tests/blog.spec.ts index b4699a1..c6c3d4d 100644 --- a/tests/blog.spec.ts +++ b/tests/blog.spec.ts @@ -1,51 +1,18 @@ -import { test, expect } from "@playwright/test"; +import { expect, test } from "@playwright/test"; test.beforeEach(async ({ page }) => { - await page.goto("/blog/"); + await page.goto("/blog"); }); -test("the Posts heading exists and has the appropriate aria role and level", async ({ - page, -}) => { - // @ts-expect-error not great types here - const heading = page.getByRole("heading[level=1]"); - expect(heading).toBeVisible(); - expect(await heading.textContent()).toEqual("Posts"); +test("blog post list renders", async ({ page }) => { + await expect(page.getByRole("link", { name: "Building This Site" })).toBeVisible(); + await expect(page.getByRole("link", { name: "Just Messin' Around" })).toBeVisible(); + await expect(page.getByText("A peek into the technologies which power this site")).toBeVisible(); }); -test("the post titles and previews render correctly and have appropriate aria roles and levels", async ({ - page, -}) => { - const heading = page.getByTestId("post-title").first(); - expect(heading).toBeVisible(); - expect( - await (await heading.elementHandle())?.evaluate((e) => e.tagName), - ).toEqual("H2"); +test("blog navigation works", async ({ page, baseURL }) => { + await page.getByRole("link", { name: "Just Messin' Around" }).click(); - const preview = page.getByTestId("post-description").first(); - expect(preview).toBeVisible(); - expect( - await (await preview.elementHandle())?.evaluate((e) => e.tagName), - ).toEqual("P"); -}); - -test("the tags column renders correctly", async ({ page }) => { - const tags = page.getByRole("button"); - const tagStrings = await tags.allTextContents(); - tagStrings - .filter((tag) => tag) - .forEach((tagString) => { - expect(tagString).toMatch(/.+ \(\d+\)/); - }); -}); - -test("filtering by tags works", async ({ page }) => { - const tag = page.getByRole("button").filter({ hasText: "something else" }); - const before = await page.getByRole("heading").count(); - - await expect(tag).toBeVisible(); - await tag.click(); - - const after = await page.getByRole("heading").count(); - expect(after).toBeLessThan(before); + await expect(page).toHaveURL(new RegExp(`^${baseURL}/blog/2-another-post/?$`)); + await expect(page.getByRole("heading", { name: "Just Messin' Around" })).toBeVisible(); }); diff --git a/tests/hi.spec.ts b/tests/hi.spec.ts deleted file mode 100644 index 4dea919..0000000 --- a/tests/hi.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test.beforeEach(async ({ page }) => { - await page.goto("/"); -}); - -test("first paragraph shows up", async ({ page }) => { - const target = page.locator("p:visible", { hasText: "Hey!" }).first(); - await expect(target).toBeVisible(); -}); - -test("second paragraph shows up", async ({ page }) => { - const target = page - .locator("p:visible", { - hasText: "This is my little corner of the internet", - }) - .first(); - await expect(target).toBeVisible(); -}); - -test("photo shows up", async ({ page }) => { - const text = page - .locator("p:visible", { - hasText: "picture of me, my wife, and all my pets", - }) - .first(); - const image = page - .locator('img[alt="me, my wife, dog, and two cats"]:visible') - .first(); - - await expect(text).toBeVisible({ timeout: 10000 }); - await expect(image).toBeVisible(); -}); - -test.describe("without JavaScript", () => { - test.use({ javaScriptEnabled: false }); - - test("home content is visible", async ({ page }) => { - await expect(page.getByTestId("home-content")).toBeVisible(); - await expect(page.getByText("Hey!").first()).toBeVisible(); - await expect( - page.getByText("This is my little corner of the internet").first(), - ).toBeVisible(); - await expect( - page.getByAltText("me, my wife, dog, and two cats"), - ).toBeVisible(); - }); -}); diff --git a/tests/home.spec.ts b/tests/home.spec.ts new file mode 100644 index 0000000..fb7ecbe --- /dev/null +++ b/tests/home.spec.ts @@ -0,0 +1,17 @@ +import { expect, test } from "@playwright/test"; + +test.beforeEach(async ({ page }) => { + await page.goto("/"); +}); + +test("home introduction renders", async ({ page }) => { + await expect(page.getByText("Hey! I'm AJ").first()).toBeVisible(); + await expect(page.getByText("This is my little corner of the internet").first()).toBeVisible(); +}); + +test("photo and social links render", async ({ page }) => { + await expect(page.getByAltText("me, my wife, dog, and two cats")).toBeVisible(); + await expect(page.getByRole("link", { name: "GitHub" })).toBeVisible(); + await expect(page.getByRole("link", { name: "LinkedIn" })).toBeVisible(); + await expect(page.getByRole("link", { name: "npm" })).toBeVisible(); +}); diff --git a/tests/layout.spec.ts b/tests/layout.spec.ts index 7ba6d9d..dbf096d 100644 --- a/tests/layout.spec.ts +++ b/tests/layout.spec.ts @@ -1,99 +1,38 @@ -import { test, expect } from "@playwright/test"; +import { expect, test } from "@playwright/test"; test.beforeEach(async ({ page }) => { await page.goto("/"); }); -test("header links show up", async ({ page, isMobile }) => { - if (isMobile) { - await page.getByTestId("menu-button").click(); - } - await expect( - page.getByRole("link").filter({ hasText: "Hi 👋" }), - ).toBeVisible(); - await expect( - page.getByRole("link").filter({ hasText: "About 📕" }), - ).toBeVisible(); - await expect( - page.getByRole("link").filter({ hasText: "Blog ✍️" }), - ).toBeVisible(); - await expect( - page.getByRole("link").filter({ hasText: "Hire Me 💲" }), - ).toBeVisible(); +test("header links render", async ({ page }) => { + await expect(page.getByRole("link", { name: "AJ Bienz" })).toBeVisible(); + await expect(page.getByRole("link", { name: "about" })).toBeVisible(); + await expect(page.getByRole("link", { name: "notes" })).toBeVisible(); + await expect(page.getByRole("link", { name: "rss" })).toBeVisible(); }); -test("footer links show up", async ({ page }) => { - await expect( - page.getByRole("paragraph").filter({ hasText: "AJ Bienz" }), - ).toBeVisible(); - await expect(page.getByTestId("gh-link")).toBeVisible(); - await expect(page.getByTestId("npm-link")).toBeVisible(); - await expect(page.getByTestId("linkedin-link")).toBeVisible(); -}); - -test.describe("header navigation", () => { - test.beforeEach(async ({ page, isMobile }) => { - if (isMobile) { - await page.getByTestId("menu-button").click(); - } - }); - - test("about link", async ({ page, baseURL }) => { - await Promise.all([ - page.getByRole("link").filter({ hasText: "About 📕" }).click(), - ]); - await expect(page).toHaveURL(new RegExp(`^${baseURL}/about/$`)); - }); - - test("blog link", async ({ page, baseURL }) => { - await Promise.all([ - page.getByRole("link").filter({ hasText: "Blog ✍️" }).click(), - page.waitForURL(`${baseURL}/blog/`), - ]); - await expect(page).toHaveURL(new RegExp(`^${baseURL}/blog/$`)); - }); - - test("home link", async ({ page, baseURL }) => { - await Promise.all([ - page.getByRole("link").filter({ hasText: "Hi 👋" }).click(), - ]); - await expect(page).toHaveURL(new RegExp(`^${baseURL}/?$`)); - }); - - test("resume link", async ({ page }) => { - const resumeLink = page.getByRole("link").filter({ hasText: "Hire Me 💲" }); +test("header navigation works", async ({ page, baseURL }) => { + await page.getByRole("link", { name: "about" }).click(); + await expect(page).toHaveURL(new RegExp(`^${baseURL}/about/?$`)); - await expect(resumeLink).toHaveAttribute( - "href", - "https://youtu.be/dQw4w9WgXcQ", - ); - - await resumeLink.click(); - await expect(page).toHaveURL( - /^https:\/\/([^/]+\.)?(youtube\.com|youtu\.be)\//, - ); - }); -}); - -test("blog navigation works", async ({ page, baseURL }) => { - await page.goto("/blog/"); - await Promise.all([page.getByRole("heading", { level: 2 }).first().click()]); - await expect(page).toHaveURL(new RegExp(`^${baseURL}/blog/.+/$`)); -}); - -test("github navigation works", async ({ page }) => { - await Promise.all([page.getByTestId("gh-link").click()]); - await expect(page).toHaveURL("https://github.com/bienzaaron"); -}); + await page.getByRole("link", { name: "notes" }).click(); + await expect(page).toHaveURL(new RegExp(`^${baseURL}/blog/?$`)); -test("npm navigation works", async ({ page }) => { - await Promise.all([page.getByTestId("npm-link").click()]); - await expect(page).toHaveURL("https://www.npmjs.com/~ajbienz"); + await page.getByRole("link", { name: "AJ Bienz" }).click(); + await expect(page).toHaveURL(new RegExp(`^${baseURL}/?$`)); }); -test("linkedin navigation works", async ({ page }) => { - const navigationPromise = page.waitForURL(/linkedin\.com/); - await page.getByTestId("linkedin-link").click(); - await navigationPromise; - expect(page.url()).toEqual("https://www.linkedin.com/in/abienz"); +test("external social links point to the right destinations", async ({ page }) => { + await expect(page.getByRole("link", { name: "GitHub" })).toHaveAttribute( + "href", + "https://github.com/bienzaaron", + ); + await expect(page.getByRole("link", { name: "LinkedIn" })).toHaveAttribute( + "href", + "https://www.linkedin.com/in/abienz", + ); + await expect(page.getByRole("link", { name: "npm" })).toHaveAttribute( + "href", + "https://www.npmjs.com/~ajbienz", + ); }); diff --git a/tsconfig.json b/tsconfig.json index 8eb74e5..1553004 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,20 @@ { - "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { - "allowSyntheticDefaultImports": true + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" }, - "include": ["src/**/*"] + "include": ["src", "vite.config.ts"] } diff --git a/tsconfig.node.json b/tsconfig.node.json deleted file mode 100644 index c07a8e5..0000000 --- a/tsconfig.node.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "strict": true, - "types": ["@playwright/test"] - }, - "include": [ - "tests/**/*", - "playwright.config.ts", - "vite.config.ts", - "eslint.config.js", - "postcss.config.mjs" - ] -} diff --git a/vite.config.ts b/vite.config.ts index cd533d5..bf4b0d3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,40 @@ -import { sveltekit } from "@sveltejs/kit/vite"; -import type { UserConfig } from "vite"; -import tailwindcss from "@tailwindcss/vite"; +import { tanstackRouter } from "@tanstack/router-plugin/vite"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import MarkdownIt from "markdown-it"; +import Prism from "prismjs"; +import "prismjs/components/prism-bash"; +import "prismjs/components/prism-css"; +import "prismjs/components/prism-javascript"; +import "prismjs/components/prism-typescript"; +import { Mode, plugin as mdPlugin } from "vite-plugin-markdown"; -const config: UserConfig = { - plugins: [sveltekit(), tailwindcss()], -}; +const markdownUtils = new MarkdownIt().utils; +const markdownIt: MarkdownIt = new MarkdownIt({ + html: false, + linkify: true, + typographer: true, + highlight(code: string, lang: string): string { + const grammar = lang ? Prism.languages[lang] : undefined; -export default config; + if (!grammar || !lang) { + return markdownUtils.escapeHtml(code); + } + + return Prism.highlight(code, grammar, lang); + }, +}); + +export default defineConfig({ + plugins: [ + mdPlugin({ + mode: [Mode.HTML], + markdownIt, + }), + tanstackRouter({ + target: "react", + autoCodeSplitting: true, + }), + react(), + ], +}); From 35669dd16145f65d39ec0072fd7aa98a4992fc31 Mon Sep 17 00:00:00 2001 From: bienzaaron Date: Mon, 11 May 2026 09:09:53 -0400 Subject: [PATCH 2/6] back to node 24 for vercel --- .github/workflows/ci.yml | 2 +- .github/workflows/e2e.yml | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 104652b..cd1fcd3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 26 + node-version: 24 - uses: pnpm/action-setup@a0ea98b2dc7d387a59324835f7421c1d5f8357b4 # v6.0.5 - run: pnpm install --frozen-lockfile - run: pnpm run ci diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index ae011d9..31dec26 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 26 + node-version: 24 - uses: pnpm/action-setup@a0ea98b2dc7d387a59324835f7421c1d5f8357b4 # v6.0.5 - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/package.json b/package.json index 59b3431..f9d5eef 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ ] }, "engines": { - "node": ">=26" + "node": ">=24" }, "packageManager": "pnpm@11.0.8" } From 2ba97365bf1e2fcc1eef3a907b515664c05a29b3 Mon Sep 17 00:00:00 2001 From: bienzaaron Date: Wed, 20 May 2026 20:52:23 -0400 Subject: [PATCH 3/6] fix build --- vercel.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vercel.json b/vercel.json index 1e9c7bc..00bcf0b 100644 --- a/vercel.json +++ b/vercel.json @@ -1,3 +1,6 @@ { + "buildCommand": "pnpm run build", + "installCommand": "pnpm install --frozen-lockfile", + "outputDirectory": "dist", "trailingSlash": true } From 14b8cf6043b21dc91b070a1672587edf860122a4 Mon Sep 17 00:00:00 2001 From: bienzaaron Date: Wed, 20 May 2026 20:57:28 -0400 Subject: [PATCH 4/6] implement rss feed --- .gitignore | 1 + package.json | 2 +- scripts/rss.mjs | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 scripts/rss.mjs diff --git a/.gitignore b/.gitignore index 062e951..a0e537b 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ node_modules /test-results/ /playwright-report/ /playwright/.cache/ +/public/rss.xml actions-runner tsconfig.tsbuildinfo diff --git a/package.json b/package.json index f9d5eef..33f13c7 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite dev", - "build": "vite build", + "build": "node scripts/rss.mjs && vite build", "preview": "vite preview", "prepare": "husky", "check": "tsc", diff --git a/scripts/rss.mjs b/scripts/rss.mjs new file mode 100644 index 0000000..a140681 --- /dev/null +++ b/scripts/rss.mjs @@ -0,0 +1,87 @@ +import { mkdir, readdir, readFile, writeFile } from "node:fs/promises"; +import { join } from "node:path"; + +const siteUrl = process.env.SITE_URL ?? "https://ajbienz.me"; +const postsDirectory = join(process.cwd(), "src", "markdown", "posts"); +const outputFile = join(process.cwd(), "public", "rss.xml"); + +const postFiles = (await readdir(postsDirectory)).filter((file) => file.endsWith(".md")).sort(); + +const items = await Promise.all( + postFiles.map(async (file) => { + const id = file.replace(/\.md$/, ""); + const raw = await readFile(join(postsDirectory, file), "utf8"); + const metadata = parseFrontmatter(raw, file); + const url = `${siteUrl}/blog/${id}/`; + + return ` + ${escapeXml(metadata.title)} + ${escapeXml(url)} + ${escapeXml(url)} + ${escapeXml(metadata.description)} + `; + }), +); + +const rss = ` + + + AJ Bienz + ${escapeXml(siteUrl)}/ + Technical notes from AJ Bienz. +${items.join("\n")} + + +`; + +await mkdir(join(process.cwd(), "public"), { recursive: true }); +await writeFile(outputFile, rss); + +function parseFrontmatter(raw, file) { + const match = raw.match(/^---\n([\s\S]*?)\n---/); + + if (!match) { + throw new Error(`Missing frontmatter in ${file}`); + } + + const fields = Object.fromEntries( + match[1] + .split("\n") + .filter(Boolean) + .map((line) => { + const separatorIndex = line.indexOf(":"); + + if (separatorIndex === -1) { + throw new Error(`Invalid frontmatter line in ${file}: ${line}`); + } + + return [ + line.slice(0, separatorIndex).trim(), + parseFrontmatterValue(line.slice(separatorIndex + 1).trim()), + ]; + }), + ); + + if (typeof fields.title !== "string" || typeof fields.description !== "string") { + throw new Error(`Invalid RSS frontmatter in ${file}`); + } + + return fields; +} + +function parseFrontmatterValue(value) { + if (value.startsWith("[") || value.startsWith('"')) { + return JSON.parse(value); + } + + return value; +} + +function escapeXml(value) { + return value + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'"); +} From 75a1e0c8a4d54bdcf84ab8c8856dee641aca722c Mon Sep 17 00:00:00 2001 From: bienzaaron Date: Wed, 20 May 2026 21:05:53 -0400 Subject: [PATCH 5/6] rewrite for direct nav --- vercel.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vercel.json b/vercel.json index 00bcf0b..fe6ea1b 100644 --- a/vercel.json +++ b/vercel.json @@ -2,5 +2,11 @@ "buildCommand": "pnpm run build", "installCommand": "pnpm install --frozen-lockfile", "outputDirectory": "dist", + "rewrites": [ + { + "source": "/(.*)", + "destination": "/index.html" + } + ], "trailingSlash": true } From c6f10504d9e6218e82da7695fff095c00273ad3c Mon Sep 17 00:00:00 2001 From: bienzaaron Date: Wed, 20 May 2026 21:07:43 -0400 Subject: [PATCH 6/6] update lint-staged config --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33f13c7..75c4bb9 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "vite-plugin-markdown": "2.2.0" }, "lint-staged": { - "*.{js,jsx,ts,tsx,json,cjs,mjs,css,md,yml,yaml}": [ + "*.{js,jsx,ts,tsx,json,cjs,mjs,css,md,yml,yaml,json}": [ "oxfmt --write" ], "*.{js,jsx,ts,tsx}": [