diff --git a/.cursor/rules/codebase-context.mdc b/.cursor/rules/codebase-context.mdc index 9b1ef995d..b04b1db1d 100644 --- a/.cursor/rules/codebase-context.mdc +++ b/.cursor/rules/codebase-context.mdc @@ -15,13 +15,15 @@ Homarr is an open-source, self-hosted dashboard for managing homelab services. I - **ORM**: Drizzle (supports SQLite via better-sqlite3, MySQL, PostgreSQL) - **API**: tRPC (HTTP + WebSocket subscriptions) with superjson + OpenAPI bridge via `trpc-to-openapi` - **Auth**: NextAuth v5 (database sessions, Credentials/LDAP/OIDC providers) -- **UI**: Mantine v7 (not Tailwind) + Tabler icons +- **UI**: Mantine v9 (not Tailwind) + Tabler icons - **State**: Jotai (atoms), TanStack Query (server state via tRPC) - **Realtime**: WebSocket server (`ws`) for tRPC subscriptions, backed by Redis pub/sub - **Cron**: `node-cron` in a standalone Fastify service (`apps/tasks`) - **i18n**: next-intl with `[locale]` dynamic segment (prefix mode: `"never"`, locale from cookie) - **Testing**: Vitest + jsdom, Playwright for E2E -- **Package manager**: pnpm 10.33.2, Node >= 24.15.0 +- **Lint/Format**: oxlint + oxfmt (not ESLint/Prettier) +- **Docs**: Docusaurus 3 in `apps/docs/` (`@homarr/docs`) +- **Package manager**: pnpm 10.34.1, Node >= 24.16.0 ## Repository Structure @@ -29,6 +31,7 @@ Homarr is an open-source, self-hosted dashboard for managing homelab services. I homarr/ ├── apps/ │ ├── nextjs/ # Main Next.js application (port 3000) +│ ├── docs/ # Docusaurus 3 documentation site (@homarr/docs) │ ├── tasks/ # Cron job runner + Fastify tRPC API (port 3002) │ └── websocket/ # Standalone tRPC WebSocket server (port 3001) ├── packages/ @@ -67,8 +70,6 @@ homarr/ │ ├── old-schema/ # Legacy Homarr zod schemas │ └── cli/ # Node CLI for ops (brocli) ├── tooling/ -│ ├── eslint/ # Shared ESLint configs -│ ├── prettier/ # Shared Prettier config │ ├── typescript/ # Base tsconfig │ └── github/ # CI setup action ├── development/ # Dev docker-compose (Redis, MySQL, PostgreSQL) @@ -176,7 +177,8 @@ Key env vars (from `.env.example`): - `pnpm db:studio` — Drizzle Studio - `pnpm test` — Vitest unit tests - `pnpm test:e2e` — Playwright E2E -- `pnpm lint` / `pnpm format` — ESLint + Prettier +- `pnpm lint` / `pnpm format` — oxlint + oxfmt +- `pnpm dev:docs` — Docusaurus docs site (port 3003) - `pnpm typecheck` — tsc --noEmit across all packages ## Conventions @@ -189,3 +191,16 @@ Key env vars (from `.env.example`): - Drag-and-drop via `@dnd-kit/*` - `typescript.ignoreBuildErrors: true` in next.config (types checked separately via `typecheck`) - `serverExternalPackages`: `dockerode`, `isomorphic-dompurify`, `jsdom` + +## Documentation (`apps/docs`) + +Docusaurus 3 site at `apps/docs/`, package name `@homarr/docs`. + +- Run with `pnpm dev:docs` from root +- Build with `pnpm turbo build --filter=@homarr/docs` +- Uses Tailwind CSS 3 for custom pages (not Mantine) +- Imports `@homarr/definitions` for type-safe integration/widget metadata +- When adding or modifying widgets, integrations, cron jobs, API routes, env vars, or user-facing features, you MUST also update corresponding docs in `apps/docs/docs/` +- Integration docs: `apps/docs/docs/integrations//index.mdx` + `index.ts` +- Widget docs: `apps/docs/docs/widgets//index.mdx` + `index.ts` +- Strict link checking: broken links/anchors cause build failure diff --git a/.cursor/rules/documentation-sync.mdc b/.cursor/rules/documentation-sync.mdc new file mode 100644 index 000000000..a05ca5d84 --- /dev/null +++ b/.cursor/rules/documentation-sync.mdc @@ -0,0 +1,50 @@ +--- +description: Keep documentation in sync with code changes +globs: + - packages/definitions/src/** + - packages/widgets/src/** + - packages/integrations/src/** + - packages/api/src/** + - apps/nextjs/src/** + - apps/docs/** +--- + +# Documentation Sync Rule + +When modifying code that affects user-facing behavior, you MUST also update the documentation in `apps/docs/`. + +## What triggers a doc update + +| Code change | Doc location | +|---|---| +| New integration | `apps/docs/docs/integrations//index.mdx` + `index.ts` | +| New widget | `apps/docs/docs/widgets//index.mdx` + `index.ts` | +| Changed API surface | `apps/docs/docs/management/api.mdx` | +| New/changed env vars | `apps/docs/docs/advanced/` | +| New CLI commands | `apps/docs/docs/advanced/command-line/` | +| Changed auth providers | `apps/docs/docs/advanced/` SSO pages | +| UI/UX changes | Relevant getting-started or management pages | +| New cron job | `apps/docs/docs/management/tasks.mdx` | +| Changed permissions | `apps/docs/docs/management/users.mdx` | + +## Integration doc pattern + +Each integration has a folder under `apps/docs/docs/integrations//`: + +- `index.ts` — exports a typed `IntegrationDefinition` with name, description, iconUrl, path +- `index.mdx` — uses shared components: `IntegrationHeader`, `IntegrationCapabilites`, `IntegrationSecrets` +- Import metadata from `@homarr/definitions` where possible + +## Widget doc pattern + +Each widget has a folder under `apps/docs/docs/widgets//`: + +- `index.ts` — exports a typed `WidgetDefinition` with icon, name, description, path, configuration +- `index.mdx` — uses shared components: `WidgetHeader`, `WidgetConfig`, `WidgetAdding` + +## Development + +- Run docs locally: `pnpm dev:docs` from root +- Build docs: `pnpm turbo build --filter=@homarr/docs` +- The docs app can import from `@homarr/definitions` for type-safe integration/widget metadata +- Docusaurus strict mode throws on broken links — fix any broken references before committing diff --git a/.dockerignore b/.dockerignore index d75e30111..74c010b43 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,6 +10,7 @@ README.md dev .build e2e +apps/docs apps/nextjs/.next .env .env.* diff --git a/.github/workflows/deployment-docs.yml b/.github/workflows/deployment-docs.yml new file mode 100644 index 000000000..571cffce8 --- /dev/null +++ b/.github/workflows/deployment-docs.yml @@ -0,0 +1,56 @@ +name: "[Deployment] Documentation" + +on: + push: + branches: ["dev"] + paths: + - "apps/docs/**" + - "packages/definitions/src/docs/**" + - ".github/workflows/deployment-docs.yml" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: false + +env: + SKIP_ENV_VALIDATION: true + TURBO_API: ${{ secrets.TURBO_API }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_REMOTE_CACHE_SIGNATURE_KEY: ${{ secrets.TURBO_REMOTE_CACHE_SIGNATURE_KEY }} + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v6 + - name: Setup + uses: ./tooling/github/setup + - name: Build docs + run: pnpm turbo build --filter=@homarr/docs + env: + CI: "true" + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload pages artifact + uses: actions/upload-pages-artifact@v4 + with: + path: "apps/docs/build" + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/docs-algolia-recrawl.yml b/.github/workflows/docs-algolia-recrawl.yml new file mode 100644 index 000000000..63b335985 --- /dev/null +++ b/.github/workflows/docs-algolia-recrawl.yml @@ -0,0 +1,58 @@ +name: "[Docs] Algolia Recrawl" + +on: + workflow_run: + workflows: ["[Deployment] Documentation"] + types: [completed] + branches: [dev] + workflow_dispatch: + +permissions: + contents: read + +jobs: + recrawl: + if: >- + ${{ + (github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event != 'pull_request') + || github.event_name == 'workflow_dispatch' + }} + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v6 + + - name: Setup + uses: ./tooling/github/setup + + - name: Check Algolia crawler secrets + run: | + missing=0 + for secret in ALGOLIA_CRAWLER_ID ALGOLIA_CRAWLER_USER_ID ALGOLIA_CRAWLER_API_KEY; do + if [ -z "${!secret}" ]; then + echo "::warning::Missing repository secret: $secret" + missing=1 + fi + done + if [ "$missing" -eq 1 ]; then + echo "Add crawler secrets to enable automatic recrawls." + exit 1 + fi + env: + ALGOLIA_CRAWLER_ID: ${{ secrets.ALGOLIA_CRAWLER_ID }} + ALGOLIA_CRAWLER_USER_ID: ${{ secrets.ALGOLIA_CRAWLER_USER_ID }} + ALGOLIA_CRAWLER_API_KEY: ${{ secrets.ALGOLIA_CRAWLER_API_KEY }} + + - name: Wait for GitHub Pages to serve the new deployment + run: sleep 60 + + - name: Trigger Algolia DocSearch recrawl + uses: cssnr/algolia-crawler-action@v2 + with: + crawler_id: ${{ secrets.ALGOLIA_CRAWLER_ID }} + crawler_user_id: ${{ secrets.ALGOLIA_CRAWLER_USER_ID }} + crawler_api_key: ${{ secrets.ALGOLIA_CRAWLER_API_KEY }} + + - name: Verify search index + working-directory: apps/docs + run: pnpm verify:search diff --git a/.github/workflows/docs-update-contributors.yml b/.github/workflows/docs-update-contributors.yml new file mode 100644 index 000000000..8db1880d2 --- /dev/null +++ b/.github/workflows/docs-update-contributors.yml @@ -0,0 +1,39 @@ +name: "[Docs] Update Contributors" + +on: + schedule: + - cron: "0 12 * * FRI" + workflow_dispatch: + +permissions: + contents: write + +env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + HOMARR_CROWDIN_TOKEN: "${{ secrets.HOMARR_CROWDIN_TOKEN }}" + HOMARR_LABS_CROWDIN_TOKEN: "${{ secrets.HOMARR_LABS_CROWDIN_TOKEN }}" + SKIP_ENV_VALIDATION: true + +jobs: + dump: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v6 + with: + ref: dev + + - name: Setup + uses: ./tooling/github/setup + + - name: Dump contributors + working-directory: apps/docs + run: pnpm api-dump-contributors + + - name: Commit updated contributors + uses: EndBug/add-and-commit@v9 + with: + add: "apps/docs/static" + default_author: github_actor + message: "chore(docs): update contributors" + push: true diff --git a/.github/workflows/docs-update-openapi.yml b/.github/workflows/docs-update-openapi.yml new file mode 100644 index 000000000..62eaee95d --- /dev/null +++ b/.github/workflows/docs-update-openapi.yml @@ -0,0 +1,66 @@ +name: "[Docs] Update OpenAPI Spec" + +on: + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + +permissions: + contents: write + +env: + SKIP_ENV_VALIDATION: true + +jobs: + update-spec: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v6 + with: + ref: dev + + - name: Setup + uses: ./tooling/github/setup + + - name: Copy env + run: cp .env.example .env + + - name: Start dev server + run: pnpm --filter @homarr/nextjs dev & + env: + TURBO_TELEMETRY_DISABLED: 1 + DISABLE_TELEMETRY: 1 + + - name: Wait for server and fetch spec + run: | + set -euo pipefail + for i in $(seq 1 30); do + if curl -fsS http://localhost:3000/api/openapi -o /tmp/openapi.json 2>/dev/null; then + echo "Server is up, spec fetched" + break + fi + echo "Waiting for server... ($i/30)" + sleep 3 + done + + if [ ! -f /tmp/openapi.json ]; then + echo "::error::Server failed to start within timeout" + exit 1 + fi + + jq -e '.openapi and .paths' /tmp/openapi.json > /dev/null || { + echo "::error::Fetched file is not a valid OpenAPI spec" + exit 1 + } + + cp /tmp/openapi.json apps/docs/static/api/open-api-schema.json + echo "OpenAPI spec updated ($(jq '.paths | length' /tmp/openapi.json) paths)" + + - name: Commit updated spec + uses: EndBug/add-and-commit@v9 + with: + add: "apps/docs/static/api/" + default_author: github_actor + message: "chore(docs): update OpenAPI spec" + push: true diff --git a/.gitignore b/.gitignore index 768e58818..1bb62e979 100644 --- a/.gitignore +++ b/.gitignore @@ -69,5 +69,8 @@ apps/nextjs/public/images/background.png # personal agent config -AGENTS.md .opencode + +# docusaurus +apps/docs/.docusaurus +apps/docs/build diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 88c14e2f9..dfe3385bd 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -3,5 +3,5 @@ "printWidth": 120, "endOfLine": "lf", "sortPackageJson": true, - "ignorePatterns": ["**/*.cjs", "**/lang/**", "static-data/**", "CHANGELOG.md"] + "ignorePatterns": ["**/*.cjs", "**/lang/**", "static-data/**", "CHANGELOG.md", "apps/docs/.docusaurus/**", "apps/docs/build/**", "apps/docs/blog/**"] } diff --git a/.oxlintrc.json b/.oxlintrc.json index 1dbc54c92..946ca3e6c 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -30,7 +30,7 @@ "options": { "reportUnusedDisableDirectives": "off" }, - "ignorePatterns": ["**/*.config.js", "**/*.config.mjs", "**/*.cjs", "**/lang/*.d.json.ts", ".next/**"], + "ignorePatterns": ["**/*.config.js", "**/*.config.mjs", "**/*.cjs", "**/lang/*.d.json.ts", ".next/**", "apps/docs/.docusaurus/**", "apps/docs/build/**"], "settings": { "react": { "version": "19" } } diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..be1afe9fb --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,83 @@ +# Homarr Agent Rules + +## Repository Structure + +``` +homarr/ +├── apps/ +│ ├── nextjs/ # Main Next.js application (port 3000) +│ ├── docs/ # Docusaurus 3 documentation site (@homarr/docs) +│ ├── tasks/ # Cron job runner + Fastify tRPC API (port 3002) +│ └── websocket/ # Standalone tRPC WebSocket server (port 3001) +├── packages/ +│ ├── api/ # tRPC appRouter, procedures, OpenAPI +│ ├── auth/ # NextAuth config, providers, session, API keys +│ ├── db/ # Drizzle schema (3 DB drivers), migrations, queries +│ ├── core/ # Env validation, DB/Redis driver factories, logging +│ ├── definitions/ # Domain enums: WidgetKind, IntegrationKind, permissions +│ ├── widgets/ # All 39 dashboard widgets (definitions + components) +│ ├── integrations/ # Integration classes (HTTP clients to external apps) +│ ├── redis/ # Redis pub/sub channels, caching abstractions +│ ├── translation/ # next-intl setup, locale configs, lang JSON files +│ ├── ui/ # Shared Mantine components, theme, hooks +│ ├── validation/ # Shared zod schemas for API/forms +│ ├── common/ # Shared utilities, IDs, errors +│ ├── cron-jobs/ # Cron job implementations (25+ jobs) +│ ├── cron-jobs-core/ # Cron scheduling primitives +│ ├── cron-job-status/ # Cron status via Redis +│ ├── boards/ # Board context, edit mode, cache updater +│ ├── modals/ # Modal primitives on Mantine +│ ├── modals-collection/ # Feature modals (apps, boards, docker, etc.) +│ ├── form/ # useZodForm (Mantine + zod resolver) +│ ├── forms-collection/# Reusable form UIs (new app, icon picker, upload) +│ ├── spotlight/ # Command palette / search with multiple modes +│ ├── request-handler/ # Server request handlers (feeds, integrations) +│ ├── notifications/ # Mantine notifications wrapper +│ ├── docker/ # Dockerode-based Docker access +│ ├── icons/ # Icon DB/repo integration +│ ├── image-proxy/ # Image proxy + caching +│ ├── ping/ # Reachability / ping utilities +│ ├── analytics/ # Server-side analytics (Umami) +│ ├── server-settings/ # Server setting keys/types +│ ├── settings/ # User-facing settings UI context +│ ├── old-import/ # Legacy Homarr import +│ ├── old-schema/ # Legacy Homarr zod schemas +│ └── cli/ # Node CLI for ops (brocli) +├── tooling/ +│ ├── typescript/ # Base tsconfig +│ └── github/ # CI setup action +├── development/ # Dev docker-compose (Redis, MySQL, PostgreSQL) +├── e2e/ # E2E test specs +└── Dockerfile # Multi-stage production build +``` + +## Documentation Sync + +The documentation site lives at `apps/docs/` (Docusaurus 3, `@homarr/docs`). + +When modifying user-facing code, you MUST also update the corresponding documentation: + +- New integration → `apps/docs/docs/integrations//index.mdx` + `index.ts` +- New widget → `apps/docs/docs/widgets//index.mdx` + `index.ts` +- Changed API → `apps/docs/docs/management/api.mdx` +- New/changed env vars → `apps/docs/docs/advanced/` +- New CLI commands → `apps/docs/docs/advanced/command-line/` +- Auth changes → `apps/docs/docs/advanced/` SSO pages +- New cron job → `apps/docs/docs/management/tasks.mdx` + +## Monorepo Commands + +- `pnpm dev` — Next.js app only +- `pnpm dev:docs` — Docusaurus docs site only +- `pnpm turbo build` — build all packages +- `pnpm turbo build --filter=@homarr/docs` — build docs only +- `pnpm turbo typecheck` — typecheck all packages +- `pnpm lint` / `pnpm format` — oxlint / oxfmt + +## Code Style + +- Lint: oxlint (not ESLint) +- Format: oxfmt (not Prettier) +- UI: Mantine (not Tailwind) — Tailwind is only used in docs app +- Icons: @tabler/icons-react +- Docs app can import from `@homarr/definitions` for shared types diff --git a/apps/docs/.dockerignore b/apps/docs/.dockerignore new file mode 100644 index 000000000..125cd198c --- /dev/null +++ b/apps/docs/.dockerignore @@ -0,0 +1,6 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.git diff --git a/apps/docs/.gitattributes b/apps/docs/.gitattributes new file mode 100644 index 000000000..94f480de9 --- /dev/null +++ b/apps/docs/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf \ No newline at end of file diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore new file mode 100644 index 000000000..8708641b9 --- /dev/null +++ b/apps/docs/.gitignore @@ -0,0 +1,58 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +.idea/ + +# dependencies +/node_modules +/.pnp +.pnp.js +.pnpm-store/ + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel +*.tsbuildinfo + +# storybook +storybook-static +static/data/configs + +# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored +# Yarn v2 +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# docusaurus +.docusaurus + +# CI Stuff +screenshots +test-results \ No newline at end of file diff --git a/apps/docs/.oxlintrc.json b/apps/docs/.oxlintrc.json new file mode 100644 index 000000000..58480a9ab --- /dev/null +++ b/apps/docs/.oxlintrc.json @@ -0,0 +1,33 @@ +{ + "$schema": "../../node_modules/oxlint/configuration_schema.json", + "plugins": ["eslint", "typescript", "unicorn", "oxc", "react", "import", "jsx-a11y"], + "categories": { + "correctness": "error", + "suspicious": "warn", + "pedantic": "off", + "perf": "off", + "style": "off", + "restriction": "off", + "nursery": "off" + }, + "rules": { + "eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }], + "typescript/consistent-type-imports": "off", + "typescript/no-non-null-assertion": "warn", + "import/consistent-type-specifier-style": "off", + "jsx-a11y/alt-text": "warn", + "jsx-a11y/control-has-associated-label": "warn", + "jsx-a11y/prefer-tag-over-role": "warn", + "react/jsx-key": "warn", + "react/react-in-jsx-scope": "off", + "react-hooks/exhaustive-deps": "warn", + "eslint/no-unused-expressions": "warn" + }, + "options": { + "reportUnusedDisableDirectives": "off" + }, + "ignorePatterns": ["**/*.config.js", "**/*.config.mjs", "**/*.cjs", ".docusaurus/**", "build/**"], + "settings": { + "react": { "version": "19" } + } +} diff --git a/apps/docs/.vscode/settings.json b/apps/docs/.vscode/settings.json new file mode 100644 index 000000000..c5a1b2892 --- /dev/null +++ b/apps/docs/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "cSpell.words": [ + "Homarr", + "Lidarr", + "Nextcloud", + "Radarr", + "Readarr", + "Sonarr" + ] +} \ No newline at end of file diff --git a/apps/docs/LICENSE b/apps/docs/LICENSE new file mode 100644 index 000000000..ee56b5cf1 --- /dev/null +++ b/apps/docs/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2025 Meier Lukas, Thomas Camlong and Homarr Labs + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/apps/docs/README.md b/apps/docs/README.md new file mode 100644 index 000000000..b66530488 --- /dev/null +++ b/apps/docs/README.md @@ -0,0 +1,105 @@ +# Homarr Documentation (`@homarr/docs`) + +The official [homarr.dev](https://homarr.dev) documentation site, built with [Docusaurus 3](https://docusaurus.io/) and living inside the Homarr monorepo. + +## Why it's in the monorepo + +Having documentation alongside the application code enables: + +- **Two-way linking** — the docs app imports from `@homarr/definitions` for type-safe integration/widget metadata, and the main app references doc paths via generated sitemap types +- **Atomic PRs** — code changes and their documentation updates ship in the same pull request +- **Shared tooling** — same Node version, pnpm catalog, oxlint/oxfmt, CI pipeline +- **Build-time validation** — Docusaurus strict mode catches broken links and references at build time + +## Development + +From the **monorepo root**: + +```bash +# Start the docs dev server (port 3003) +pnpm dev:docs + +# Or from within this directory +pnpm dev +``` + +## Build + +```bash +# Build docs only +pnpm turbo build --filter=@homarr/docs + +# Build everything (docs + main app + tasks + websocket) +pnpm build +``` + +## Lint & Format + +Uses oxlint and oxfmt (same as the rest of the monorepo): + +```bash +pnpm lint # oxlint +pnpm format # oxfmt (check) +pnpm format -- --write # oxfmt (fix) +``` + +## Typecheck + +```bash +pnpm typecheck +``` + +## Content Structure + +``` +docs/ +├── getting-started/ # Installation guides, glossary, prerequisites +├── management/ # Boards, apps, users, integrations, settings, tasks, API +├── integrations/ # 55 integration guides (one folder each) +├── widgets/ # 42 widget guides (one folder each) +├── advanced/ # SSO, env vars, proxy, styling, CLI, development +└── community/ # FAQ, donate, license, translations, get-in-touch +``` + +Each integration/widget doc follows a consistent pattern: + +- `index.ts` — typed metadata (`IntegrationDefinition` / `WidgetDefinition`) +- `index.mdx` — content using shared React components (`IntegrationHeader`, `WidgetHeader`, etc.) + +## Importing from homarr packages + +The docs app has `@homarr/definitions` as a workspace dependency. You can import integration kinds, widget kinds, and other definitions directly: + +```typescript +import { IntegrationKind } from '@homarr/definitions'; +``` + +This enables type-safe references to homarr domain concepts within documentation code. + +## Search (Algolia DocSearch) + +Search uses the `Docusaurus` Algolia index (crawler `cd77a285-2756-4557-bf21-ee703748df15`). A separate `markdown` index is built for LLM markdown indexing. + +Crawler reference config: [`docsearch.config.js`](docsearch.config.js). + +**Verify search health:** + +```bash +pnpm verify:search +``` + +## Tech Stack + +| Layer | Technology | +|---|---| +| Site generator | Docusaurus 3 (`@docusaurus/preset-classic`) | +| Styling | Tailwind CSS 3 + Docusaurus Infima | +| Icons | `@tabler/icons-react` | +| Diagrams | Mermaid (`@docusaurus/theme-mermaid`) | +| Search | Algolia DocSearch | +| Analytics | PostHog | +| Charts | @nivo/line | + +## Contributing + +When making changes to the homarr codebase that affect user-facing behavior, **always update the corresponding documentation in this app**. See `.cursor/rules/documentation-sync.mdc` for the complete mapping of code changes to doc locations. diff --git a/apps/docs/babel.config.js b/apps/docs/babel.config.js new file mode 100644 index 000000000..bfd75dbdf --- /dev/null +++ b/apps/docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], +}; diff --git a/apps/docs/blog/2022/06-22-documentation/index.mdx b/apps/docs/blog/2022/06-22-documentation/index.mdx new file mode 100644 index 000000000..c344f32ea --- /dev/null +++ b/apps/docs/blog/2022/06-22-documentation/index.mdx @@ -0,0 +1,35 @@ +--- +slug: documentation-migration +title: Migration of Documentation +authors: + - ajnart + - manuel-rw +tags: [documentation, migration] +--- + +We are happy to announce that the documentation of Homarr has been migrated to Docusaurus - An opensource documentation tool. +The documentation has been re-written partly and includes now many animations, guides and additional crucial information. + +We are still figuring things out and highly depend on your feedback. + + + +## Why we migrated + +The default GitHub Wiki feature is decent - but very confusing to read. +Our possibilites for searching the documentation in the Wiki are highly limited. +Additionally, Users are unable to contribute to the documentation if they have not sufficient permissions. + +We could not review any chanegs made to the documentation. This is why we migrated to Docusaurus. + +## How you can contribute + +The documentation will soon be merged into the master branch of Homarr. +You'll find a ``doc/`` directory in the root of Homarr. +We'll obviously not include this in our Docker images. +In the future, everyone may modify the documentation by creating a pull request. +After we've reviewed your changes, we'll merge your PR and this documentation will automatically update. + +## TL;DR + +The documentation on GitHub Wiki will soon disappear. It will be replaced with this Docusaurus-powered website. You'll find much more information here with higher detail and searchability. \ No newline at end of file diff --git a/apps/docs/blog/2022/08-28-translation/img/homarr-we-need-you.webp b/apps/docs/blog/2022/08-28-translation/img/homarr-we-need-you.webp new file mode 100644 index 000000000..0d0176ec8 Binary files /dev/null and b/apps/docs/blog/2022/08-28-translation/img/homarr-we-need-you.webp differ diff --git a/apps/docs/blog/2022/08-28-translation/index.mdx b/apps/docs/blog/2022/08-28-translation/index.mdx new file mode 100644 index 000000000..4af9cbd77 --- /dev/null +++ b/apps/docs/blog/2022/08-28-translation/index.mdx @@ -0,0 +1,20 @@ +--- +slug: translations +title: Help us make Homarr multilingual +authors: + - ajnart + - manuel-rw +tags: [translations, homarr, update, contributions] +--- + +We've been working hard to offer Homarr in many languages. The next update of Homarr will be using [i18next](https://www.i18next.com/) to translate almost any part of your Dashboard. + +### We need your help +![](img/homarr-we-need-you.webp)
+Yes, we need **YOU**! We want to make Homarr accessible to as many people as possible. Thus, we need to translate all content into many different languages. We need your help for that! [You can help us now to translate Homarr into as many languages as possible](/docs/community/translations). + + + +### About global translations / translations per user + +We are aware that many people would like to configure translations globally or configure language per user. Currently, translations are stored in the Cookies, which will expire after some time (currently, it's set to 30 days). We will implement more granular language settings in future versions of Homarr, since it requires major changes to Homarr. Stay tuned! 😎 \ No newline at end of file diff --git a/apps/docs/blog/2023/01-11-version0.11/img/choose-widget-in-modal.webp b/apps/docs/blog/2023/01-11-version0.11/img/choose-widget-in-modal.webp new file mode 100644 index 000000000..693ae9cc3 Binary files /dev/null and b/apps/docs/blog/2023/01-11-version0.11/img/choose-widget-in-modal.webp differ diff --git a/apps/docs/blog/2023/01-11-version0.11/index.mdx b/apps/docs/blog/2023/01-11-version0.11/index.mdx new file mode 100644 index 000000000..5ab9a78bc --- /dev/null +++ b/apps/docs/blog/2023/01-11-version0.11/index.mdx @@ -0,0 +1,67 @@ +--- +title: "We present: Homarr 0.11 - the most complex Homarr version yet!" +authors: + - ajnart + - manuel-rw + - walkx + - meierschlumpf +tags: [homarr, update, breaking changes, version, gridstack, dnd, documentation] +--- + +We are *incredibly* proud to serve you Homarr 0.11! +It contains many breaking changes and huge improvements to your favourite dashboard app: + +- Integration of Gridstack for much more complex dashboard configuration and drag and drop +- Added icon picker with smart search and automatic icons +- Complete overhaul of the module system +- Added an edit mode for making changes easier +- Form validation for better user experience +- Better security with new built-in credentials system +- Huge design and usability improvements to older components to Homarr +- Better handeling of exceptions and unexpected issues + + + +## Complete implementation of highly customizable drag and drop library "Gridstack" + +In 0.11, we have replaced our quite limited drag and drop system with Gridstack. +Gridstack enables you to create much more complex and advanced dashboards while keeping everything organized. + + + +We've also introduced more advanced categories this time: + +![](../../../docs/getting-started/img/category-menu.webp) + +We'll continute to improve this system according to your feedback. + +## Modules have been overhauled and renamed to widgets + +Widgets are now much snappier and have been completely recoded. +This fixes some of the bugs a few users have previously experienced and improves overall customization. + +![](./img/choose-widget-in-modal.webp) + +## Fancy icon picker for speeding up your creation process + +We've also added a new fancy icon picker, you can use to get access to any icons much faster. +We will add more icon sources in the future, as we made this icon picker very modular, and we plan to make local icons accessible via this picker very soon. + +![](../../../docs/advanced/customizations/img/icons/icons-picker.gif) + +## Design and documentation improvements to homarr.dev + +https://homarr.dev has been overhauled with better design, updated documentation, more images and better explanations. + +## Download Homarr now! + +Homarr is completly free, even for commercial usage! diff --git a/apps/docs/blog/2023/04-16-version0.12-more-widgets/index.mdx b/apps/docs/blog/2023/04-16-version0.12-more-widgets/index.mdx new file mode 100644 index 000000000..66334bfbc --- /dev/null +++ b/apps/docs/blog/2023/04-16-version0.12-more-widgets/index.mdx @@ -0,0 +1,75 @@ +--- +title: "We present: Homarr 0.12 - The fastest homarr version ever!" +authors: + - ajnart + - manuel-rw + - walkx + - meierschlumpf +tags: [homarr, update, breaking changes, version, dnd, documentation] +--- + +## Multiple widgets of the same type +**It's finally here!** You can decorate your dashboard now with as many widgets as you want. +This applies to all widgets, but in the case of the IFrame widget, it enables you to: +- Integrate as many websites as you want +- Integrate monitoring tools like Grafana, Splunk or Elasticsearch +- Integrate your services (for example Sonarr, Radarr and Overseerr) directly into Homarr + +![](https://media.discordapp.net/attachments/988335098493542410/1094665745226539168/update-teaser.png?width=1046&height=666) + +## Edit mode password +We've added a setting to disable editing completely. This will allow you to restrict edit access without password-protection. +use the `EDIT_MODE_PASSWORD` ENV variable to set a password for edit mode. +turn on `DISABLE_EDIT_MODE=TRUE` to disable edit mode on startup. + + + +## 😎 Blazingly fast +We've implemented a new caching system, that will cache all data in your browser, meaning that Homarr will load within milliseconds, as if it was *powered by rust and blazingly fast* !!! + +## Media request widgets (Overseerr & Jellyseerr) +We've implemented a new widget, that displays a history of all requests. +You can't approve from the widget yet, but we plan to add this in the future. + +![image](https://user-images.githubusercontent.com/30572287/231829411-f61f03e9-79a0-45fc-9a87-94d69ea3ea84.png) + +## Multiple RSS feeds +You can now consume multiple RSS feeds at the same time: + +![image](https://user-images.githubusercontent.com/30572287/231829886-69133a84-3ae7-4fa3-a6d2-c582f4cc9eea.png) + +## Tab refresh / close confirmation +Since some have lost their changes, by refreshing the page in the edit mode. We've added a popup that will ask you to confirm you want to reload the page : + +![image](https://user-images.githubusercontent.com/30572287/231823776-9cbb12d4-3cb3-422e-b2e8-f9917bb3f8cc.png) + +## Environment variable for default theme +You can now set the default color scheme using environment variables: + +``DEFAULT_COLOR_SCHEME`` = ``[dark, light]`` + +## Global error catching for widgets +Previously, widgets were able to crash your entire dashboard and just a blank page would be displayed. +Now, users will still be able to use their dashboard and an information message will be displayed instead. + +## Migration to Mantine V6 +We've migrated Mantine to version 6. This will bring some upstream changes for responsiveness and usability. + +## Fix width and height in the calendar +In 0.11.5 and previous versions, the calendar scaled poorly if the widget was resized. +Now, the calendar will fill out the entire available space and scale nicely with your dashboard. + +![](https://cdn.discordapp.com/attachments/988335098493542410/1095416419816067175/homarr-calendar-scaling.gif) + +## Performance improvements +We now use several methods to improve performance and reduce network requests. +Homarr will load now within milliseconds and cache data in your browser. + +## Docker Socket via TCP +Previously, it was not possible to mount sockets via TCP (eg. ``tcp://traefik-docker-socket-proxy:2375``). +Now, you can use the following environment variables to configure this: + +- ``DOCKER_HOST`` +- ``DOCKER_PORT`` + +**Full Changelog**: https://github.com/ajnart/homarr/compare/v0.11.5...v0.12.0 \ No newline at end of file diff --git a/apps/docs/blog/2023/11-10-authentication/index.mdx b/apps/docs/blog/2023/11-10-authentication/index.mdx new file mode 100644 index 000000000..39c5466f0 --- /dev/null +++ b/apps/docs/blog/2023/11-10-authentication/index.mdx @@ -0,0 +1,86 @@ +--- +title: "Authentication in Homarr - 0.14 is here!" +authors: + - ajnart + - manuel-rw + - tagashi + - meierschlumpf +tags: [homarr, update, breaking changes, version, authentication, notepad, security] +--- + +One of the most requested features ever has arrived. +We worked for months to prepare Homarr for this update and we're happy that we can finally +provide you a viable solution today. + +## Highlights at a glance + +- :rocket: Completly overhauled authentication system with user management +- :sparkles: Improved UI for boards (renamed dashboards to boards). +- :computer: Server side preferences -> Dark mode and language are not synced accross all your devices +- :link: Invitation links to easily onboard new users +- :busts_in_silhouette: Overhauled board management with easy control if anonymous users can view your board +- :brain: AI assistant on the documentation to answer your questions: https://homarr.dev/ +- 📝 Overhauled notepad widget with a complex graphical editor that enables easy editing right from your browser. +- :globe_with_meridians: Live Translation on Crowdin that enable you to directly translate using images to see what exactly you're translating + + + +## Breaking changes + +- Removed ``PASSWORD`` environment variable +- Removed ``DISABLE_EDIT_MODE`` environment variable +- Removed ``EDIT_MODE_PASSWORD`` environment variable +- Added mounting point ``/data`` for your database +- Require at least one administrator account on your instance. An onboarding process will automatically set this up. +- We've added analytics to the documentation and Homarr itself. We use [Umami Analytics](https://umami.is/) which collects anonymous data exclusively and protects your personal data rights. You can disable this using the environment variable ``DISABLE_ANALYTICS``. + +## Changes in detail + +### Management pages +![image](https://github.com/ajnart/homarr/assets/30572287/b325eb92-57a6-4b07-a281-f10f7471642e) +One of the most requested features ever has been ___authentication___. We've completely *removed* the ``PASSWORD``, ``DISABLE_EDIT_MODE`` and ``EDIT_MODE_PASSWORD`` and replaced it by [a secure authentication system](https://next-auth.js.org/) that enables you to manage multiple users easily. We will allow for more detailed permission and user management soon. LDAP and OIDC integrations are currently also in progress and will arrive in a future version. + +### New dashboard layout +![image](https://github.com/ajnart/homarr/assets/30572287/3396da13-816a-434f-a4c1-0efc7f86154c) + +We've updated the dashboard user interface slightly to an updated design. + +### Server side preferences page +![image](https://github.com/ajnart/homarr/assets/30572287/2c1f4dbe-7aa7-4c56-aaa3-d6c49e2beeec) + +Previously, preferences were stored per dashboard and applied to all users. +In this release, we moved this page to a separate link and store this on the server. +This means that regardless what device your on - your preferences will stay the same when you're logged in. + +### Invitations for new users +![image](https://github.com/ajnart/homarr/assets/30572287/a929b345-c014-48fb-aef9-ea2c3c581376) + +Tired of creating user accounts by yourself? With the new "invites" feature you can invite new users by simply sending them a link. +This link is valid only once and must have an expiration date - more info on that in our documentation. + +Additionally, you can deny users, that are not logged into an account, to access your board with a simple toggle: + +![image](https://github.com/ajnart/homarr/assets/30572287/aa3ff3fb-66fc-4f88-93fb-b2dd819599a8) + +### New "boards" page +Previously, dashboards were managed in an ugly and hard to control popup. +We've moved this now to the new management pages as well and it's now much easier to control: + +![image](https://github.com/ajnart/homarr/assets/30572287/2b24222e-da33-45eb-a54f-89a33a21881d) + + +### Read-only for non-administrators and guests +Yes, managing access to your dashboard is now much easier! +Guests and non-administrators cannot edit your dashboard in any way (edit is hidden): + +![image](https://github.com/ajnart/homarr/assets/30572287/01c48beb-5453-4626-ac4d-f8d7177e999b) + +This is not an definite solution and will be significantly improved in an upcoming update. + +----- + +We are aware that this update has many breaking changes and may confuse some users. +For that reason, we updated our documentation and will enhance it further within the next few weeks. +We've also added this small button at the bottom of the page were you can ask **your questions** to an AI assistant: + +![image](https://github.com/ajnart/homarr/assets/30572287/a56f721a-d022-42ad-813a-d85c89462a8c) \ No newline at end of file diff --git a/apps/docs/blog/2023/12-22-updated-documentation/index.mdx b/apps/docs/blog/2023/12-22-updated-documentation/index.mdx new file mode 100644 index 000000000..52da0fb22 --- /dev/null +++ b/apps/docs/blog/2023/12-22-updated-documentation/index.mdx @@ -0,0 +1,21 @@ +--- +title: "Updated documentation with better organization & design" +authors: + - manuel-rw +tags: [homarr, documentation, design, docs] +--- + +We'd like to let you know that we've updated our documentation and reorganized the pages. +This means, that some links may no longer be valid - we apologise if this causes any inconvenience for you. + + + +A few highlights include: + +- Updated navigation bar for much easier navigation +- Improvements to the landing page +- Completely revamped [about us page.](/about-us) +- Bug fixes for image zoom +- Added documentation for management pages and [new CLI tool](/docs/advanced/command-line/password-recovery/) + +Please [let us know](/docs/community/get-in-touch) is something is not working as expected. \ No newline at end of file diff --git a/apps/docs/blog/2024/09-23-version-1.0/index.mdx b/apps/docs/blog/2024/09-23-version-1.0/index.mdx new file mode 100644 index 000000000..e9c016833 --- /dev/null +++ b/apps/docs/blog/2024/09-23-version-1.0/index.mdx @@ -0,0 +1,88 @@ +--- +authors: + - manuel-rw +--- + +# Homarr 1.0 - complete rewrite of all systems +We proudly present to you - Homarr ``1.0``. +We have started work on this new version back in 2023 and have worked tirelessly for months on this brand-new dashboard. + +This isn't our usual update. ``1.0`` doesn't use the same code from previous versions, but has been written from the ground up. +Therefore, this version contains an unusual amount of breaking changes. +This will be a one time occurrence and version > ``1.0`` will have less breaking changes. +This time more important than every; **read the breaking changes** list and **create a backup** before updating. +Some third party installation methods may take multiple days or weeks to update to the new version. + +See [this guide on how to import your previous Homarr dashboard](/docs/getting-started/after-the-installation#importing-a-zip-from-version-before-100) + +## Changes at a glance +- **Asynchronous integrations system**: In versions prior to ``1.0``, we fetched data upon each request synchronously. +This means that the user had to wait for the requests to finish so any data would appear. +A page reload will trigger another request - and worse, this will happen for every user accessing your dashboard. +In ``1.0``, we have implemented a new system that gets rid of this system and scales linearly. +It will fetch data in background, even if you are not on the page. +- **Permissions system**: You can now use detailed permissions to allow or prohibit users from certain actions. +For easier management, you can organize users into groups and manage them all at the same time. +- **Integration testing**: Starting from ``1.0``, we will require you to test the integration before you can use it. +This guarantees that you've configured your integration correctly and helps you find errors faster. +- **Re-imagined widgets**: All widgets have been rewritten & improved. They offer much better performance, +reliability and scalability compared to < ``1.0``. +- **Improved performance**: We have upgraded the underlying framework of Homarr and take advantage +of an in-memory message bus and websockets to deliver data near realtime to you. + + + +## Breaking changes +:::warning + +Please consult the breaking changes list & upgrade guide if you used third-party installation methods. + +::: + +- Docker Image + - Removed support for ``arm/v7`` -> upgrade to newer architectures as an alternative + - Renamed image from ``ghcr.io/ajnart/homarr`` to ``ghcr.io/homarr-labs/homarr``. We now use semantic versioning for our release numbers. +- Environment Variables + - New required env variable ``SECRET_ENCRYPTION_KEY`` used for encryption of secrets in the database + - Removed ``DISABLE_ANALYTICS``, can now be configured via UI + - Renamed ``AUTH_PROVIDER`` to ``AUTH_PROVIDERS`` + - Renamed ``DATABASE_URL`` to ``DB_URL`` and made it optional conditionally. If ``DB_HOST`` is set, this is optional - otherwise it's required. + - Changed ``DOCKER_HOST`` to two new variables for hostnames (``DOCKER_HOSTNAMES``) and ports (``DOCKER_PORTS``). This allows for multiple docker integrations to be configured. + - ``AUTH_LOGOUT_REDIRECT_URL`` must now be a valid Url + - Increased minimum length of ``AUTH_OIDC_CLIENT_ID`` to 1 + - Increased minimum length of ``AUTH_OIDC_CLIENT_SECRET`` to 1 + - Removed ``AUTH_OIDC_TIMEOUT`` + - Removed ``AUTH_LDAP_ADMIN_GROUP``, ``AUTH_LDAP_OWNER_GROUP``, ``AUTH_OIDC_ADMIN_GROUP`` and ``AUTH_OIDC_OWNER_GROUP`` -> groups are now managed without manual env binding + - ``CI`` will now also trigger an env validation skip like ``SKIP_ENV_VALIDATION`` +- Mounts + - Removed ``/app/data/configs`` -> JSON configs have been removed in favour of relation databases + - Removed ``/app/public/icons`` -> Images can not be uploaded via the [media management](/docs/management/media/) in the UI + - Moved ``/data`` to ``/appdata`` and restructured contents (not backwards compatible!) -> Create a backup before migration of the entire directory to copy data to new Homarr +- Widgets: + - Calendar: + - Removed option ``Use Sonarr v4 API`` + - Removed option ``Use Sonarr v5 API`` + - Removed option ``Font Size`` + - Removed option ``Hide week days`` + - Download speed: We have removed this widget in favour of the brand new download widget which will also display this data. + - Dash. widget: We have removed this widget in favour of the System Health Widget. It will also display all data and some more than the old widget. +- Database: + - Changed schema of the database to a completely new schema. They are not backwards compatible. Please export the data from old Homarr in the UI and import it in ``1.0`` + - Removed all usage of JSON files to store data. Import JSON files in Homarr ``1.0`` to import your dashboards. + - Removed ``schemaVersion`` from JSON and use the drizzle migrations to keep track of schema versions and take care of migrations. +- Web Server: + - Added an internal Nginx proxy to forward requests to two servers inside the container for technical reasons. + This could impact edge cases with iframes, cookies and custom setups. +- Dependencies + - We now depend on [Redis](https://redis.io/) as a real time messaging bus +- Development (relevant for contributors): + - Migrated to [pnpm](https://pnpm.io/) + - Migrated to a mono-repository + - All source code has been migrated to the [homarr-labs GitHub organization](https://github.com/homarr-labs) +- Platform specific breaking changes: + - TrueNAS + - The TrueCharts app chart is permanently deprecated and no longer maintained / supported. Please migrate to Electric Eel or a different Kubernetes platform. + - Unraid + - The Homarr app must be reinstalled. The existing directories on your disk are not compatible with Homarr 1.0. Export your old data in < `` 1.0`` and install using different file system locations. + - Kubernetes + - The official Helm chart has moved from https://github.com/oben01/charts to https://github.com/homarr-labs/charts diff --git a/apps/docs/blog/2024/12-17-open-beta-1.0/index.mdx b/apps/docs/blog/2024/12-17-open-beta-1.0/index.mdx new file mode 100644 index 000000000..91f0a7b62 --- /dev/null +++ b/apps/docs/blog/2024/12-17-open-beta-1.0/index.mdx @@ -0,0 +1,39 @@ +--- +authors: + - meierschlumpf +--- + +# Open Beta 1.0 + +We are proud to announce the open beta of Homarr 1.0. This is a major milestone for us and we are excited to share it with you. +The open beta allows us to polish the last rough edges and gather feedback from you. +We are looking forward to your feedback and hope you enjoy the new features. +Let us know throgh discord or a [github issues](https://github.com/homarr-labs/homarr/issues/new/choose) if you encounter any issues. + + + +## How to use the beta with docker + +To use the beta with docker you can use the following docker-compose.yml configuration: + +```yml title="docker-compose.yml" +#---------------------------------------------------------------------# +# Homarr - A simple, yet powerful dashboard for your server. # +#---------------------------------------------------------------------# +services: + homarr: + container_name: homarr + image: ghcr.io/homarr-labs/homarr:beta + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration + - ./homarr/appdata:/appdata + environment: + - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` + ports: + - '7575:7575' +``` + +Then, run `docker compose up -d` in the same directory. This will start the Homarr container in the background. +Please note that the mounts have changed and it's not backwards compatible with versions before 1.0.0-beta.1. +You can find a list of all breaking changes [here](/blog/2024/09/23/version-1.0) \ No newline at end of file diff --git a/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-export-data.png b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-export-data.png new file mode 100644 index 000000000..2cd32d952 Binary files /dev/null and b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-export-data.png differ diff --git a/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-choose-imported-data.png b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-choose-imported-data.png new file mode 100644 index 000000000..d0d2de39c Binary files /dev/null and b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-choose-imported-data.png differ diff --git a/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-decryption-token.png b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-decryption-token.png new file mode 100644 index 000000000..4ff3ecd32 Binary files /dev/null and b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-decryption-token.png differ diff --git a/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-dropzone.png b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-dropzone.png new file mode 100644 index 000000000..1c0c3da62 Binary files /dev/null and b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/old-homarr-import-dropzone.png differ diff --git a/apps/docs/blog/2025/01-19-migration-guide-1.0/img/onboarding-step-1.png b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/onboarding-step-1.png new file mode 100644 index 000000000..715a62c75 Binary files /dev/null and b/apps/docs/blog/2025/01-19-migration-guide-1.0/img/onboarding-step-1.png differ diff --git a/apps/docs/blog/2025/01-19-migration-guide-1.0/index.mdx b/apps/docs/blog/2025/01-19-migration-guide-1.0/index.mdx new file mode 100644 index 000000000..0525db0e4 --- /dev/null +++ b/apps/docs/blog/2025/01-19-migration-guide-1.0/index.mdx @@ -0,0 +1,55 @@ +--- +authors: + - meierschlumpf +--- + +# Migrate from 0.15.10+ to 1.0.0 + +In this guide, we will show you how to migrate from Homarr 0.15.10+ to 1.0.0. +If you are still on a version before 0.15.10, please update to 0.15.10 where we introduced the migration export page. + + + +## Export your data + +As 1.0 is a complete rewrite of Homarr and therefor not compatible with the old docker mounts, we need to export your data first. +For this you can navigate to the `Migrate to 1.0` page which you can find under `Management` > `Tools` > `Migrate to 1.0`. +Here you can select which things you want to export and download the zip file. +It will also show you a secret key which you will need to import the secret data like user password hashes, salts and integration secrets. + +![Export page](./img/old-homarr-export-data.png) + +## Create a parallel installation + +We highly recommend to create a parallel installation of Homarr 1.0.0. +So if something with for example the import does not quite work, the data in the old installation is still available. +To do this you can follow the appropriate [installation guide](https://homarr.dev/docs/category/installation-1) for your system. +Please note that if you are using docker you need to specify a diffrent external port for the new installation as the old one had the same port. +So in your compose file the ports would be `7576:7575` instead of `7575:7575`. + +## Import your data +Once the installation is completed you can access the new installation. During the onboarding you'll need to select `Import from Homarr before 1.0`. + +![Onboarding initial step](./img/onboarding-step-1.png) + +After that you can upload the zip file you downloaded in the first step. + +![Onboarding import dropzone](./img/old-homarr-import-dropzone.png) + +After that you'll get a list with all your boards that can be imported. You can configure how it should be imported and can select which screensizes it should import. + +![Onboarding import list](./img/old-homarr-import-choose-imported-data.png) + +Once you have selected everything you can click on `Confirm import and continue` which will open the encryption key input dialog where you can input the secret key you got during the export. + +![Onboarding import key input](./img/old-homarr-import-decryption-token.png) + +After that you can continue the onboarding and you should see all your boards and data in the new installation. + +See [After the installation](https://homarr.dev/docs/getting-started/after-the-installation) for more information. + +## Remove the old installation + +After you are happy with the new installation and everything is working as expected you can remove the old installation. +Please make sure to backup the data before you remove the old installation. +Also once the port 7575 is free again you can change the port mapping of the new installation to `7575:7575` if you want to. \ No newline at end of file diff --git a/apps/docs/blog/2025/08-02-using-argus/img/argus-configuration.png b/apps/docs/blog/2025/08-02-using-argus/img/argus-configuration.png new file mode 100644 index 000000000..e62021fc8 Binary files /dev/null and b/apps/docs/blog/2025/08-02-using-argus/img/argus-configuration.png differ diff --git a/apps/docs/blog/2025/08-02-using-argus/img/argus.png b/apps/docs/blog/2025/08-02-using-argus/img/argus.png new file mode 100644 index 000000000..00a86128c Binary files /dev/null and b/apps/docs/blog/2025/08-02-using-argus/img/argus.png differ diff --git a/apps/docs/blog/2025/08-02-using-argus/index.mdx b/apps/docs/blog/2025/08-02-using-argus/index.mdx new file mode 100644 index 000000000..d5b76e0e6 --- /dev/null +++ b/apps/docs/blog/2025/08-02-using-argus/index.mdx @@ -0,0 +1,67 @@ +--- +authors: + - meierschlumpf +--- + +# How to use Argus with Homarr + +In `v1.32.0` we added the endpoint `/api/info` which returns the current version of Homarr and can therefore be used in Argus to watch for updates. +This guide will show you how to set up a user with apiKey to access the endpoint without providing admin access through it. + + + +![Argus](./img/argus.png) + +Currently an apiKey has the same permissions as the user who created it, however you can only create an apiKey with admin permissions. +This means we have to do some extra steps to create a user with only the permissions we need for Argus. + +## Create a group + +In a first step we have to create a group which will allow us to restrict the permissions of the user we will create later. + +1. Go to `Management` > `Users` > `Groups` +2. Click on `Create group` +3. Enter a name for the group, e.g. `Argus` +4. Click on `Create group` +5. Click on the newly created group to edit it +6. In the `Permissions` tab, select the admin permission and save the changes + +## Create a user + +Now we can create a user which will be used by Argus to access the `/api/info` endpoint. + +1. Go to `Management` > `Users` > `Manage` +2. Click on `Create new user` +3. Enter a username, e.g. `argus`, click next +4. Enter a password for the user, click next +5. Add previously created group `Argus` to the user, click next +6. Click on next to confirm the user creation + +## Create an apiKey + +Now we want to create therefore we have to log in with the user we just created. + +1. Log out of Homarr +2. Log in with the user we just created +3. Go to `Management` > `Tools` > `API Keys` +4. Click on `Create API Key` +5. Copy the generated API key and save it somewhere, you will not be able to see it again +6. Logout of Homarr + +## Reduce permissions of the user + +Now we can reduce the permissions of the user to only allow access to general authenticated, but not permission restricted endpoints. + +1. Log in with your admin user +2. Go to `Management` > `Users` > `Groups` +3. Click on the `Argus` group +4. In the `Permissions` tab, remove all permissions +5. Save the changes + +## Configure Argus + +Now you can configure Argus to use the user and apiKey we created. + +![Argus configuration](./img/argus-configuration.png) + +Replace the `` with the apiKey you created and the deployed version url with the url of your Homarr instance. \ No newline at end of file diff --git a/apps/docs/blog/authors.yml b/apps/docs/blog/authors.yml new file mode 100644 index 000000000..083fed923 --- /dev/null +++ b/apps/docs/blog/authors.yml @@ -0,0 +1,37 @@ +manuel-rw: + name: Manuel + page: true + url: https://github.com/manuel-rw + image_url: https://avatars.githubusercontent.com/u/30572287?v=4 + socials: + github: manuel-rw + description: > + Junior .NET developer from Switzerland. 🌌 .NET, Next.js, Node.js, Angular +ajnart: + name: Ajnart + page: true + url: https://github.com/ajnart + image_url: https://avatars.githubusercontent.com/u/49837342?v=4 + socials: + github: ajnart +meierschlumpf: + name: Meierschlumpf + page: true + url: https://github.com/Meierschlumpf + image_url: https://avatars.githubusercontent.com/u/63781622?v=4 + socials: + github: Meierschlumpf +tagashi: + name: Tagashi + page: true + url: https://github.com/tagaishi + image_url: https://avatars.githubusercontent.com/u/26098587?v=4 + socials: + github: tagaishi +walkx: + name: Walkx + page: true + url: https://github.com/walkxcode + image_url: https://avatars.githubusercontent.com/u/71191962?v=4 + socials: + github: walkxcode \ No newline at end of file diff --git a/apps/docs/docs/advanced/_category_.json b/apps/docs/docs/advanced/_category_.json new file mode 100644 index 000000000..6fc6a617a --- /dev/null +++ b/apps/docs/docs/advanced/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Advanced", + "collapsed": true, + "position": 4, + "link": { + "type": "generated-index", + "title": "Advanced Concepts or features" + } +} diff --git a/apps/docs/docs/advanced/command-line/_category_.json b/apps/docs/docs/advanced/command-line/_category_.json new file mode 100644 index 000000000..f3ee30aa5 --- /dev/null +++ b/apps/docs/docs/advanced/command-line/_category_.json @@ -0,0 +1,4 @@ +{ + "collapsed": true, + "label": "Command line interface" +} \ No newline at end of file diff --git a/apps/docs/docs/advanced/command-line/fix-usernames/img/screenshot-cli.png b/apps/docs/docs/advanced/command-line/fix-usernames/img/screenshot-cli.png new file mode 100644 index 000000000..8fe7cd120 Binary files /dev/null and b/apps/docs/docs/advanced/command-line/fix-usernames/img/screenshot-cli.png differ diff --git a/apps/docs/docs/advanced/command-line/fix-usernames/index.mdx b/apps/docs/docs/advanced/command-line/fix-usernames/index.mdx new file mode 100644 index 000000000..d3b9f50cc --- /dev/null +++ b/apps/docs/docs/advanced/command-line/fix-usernames/index.mdx @@ -0,0 +1,17 @@ +# Fix usernames + +:::info + +This guide requires that you understand [how to access the CLI](../). + +::: + +If you somehow get into a situation where you have users with usernames that contain uppercase characters and you are no longer able to log in, you can use the following command to fix the usernames. + +```bash +homarr fix-usernames +``` + +This will convert all credential usernames to lowercase and update the database accordingly. + +![](./img/screenshot-cli.png) \ No newline at end of file diff --git a/apps/docs/docs/advanced/command-line/img/334116069-e7ec4726-3df7-4dc6-a3e0-b745e7eef17f.png b/apps/docs/docs/advanced/command-line/img/334116069-e7ec4726-3df7-4dc6-a3e0-b745e7eef17f.png new file mode 100644 index 000000000..79a29d1c6 Binary files /dev/null and b/apps/docs/docs/advanced/command-line/img/334116069-e7ec4726-3df7-4dc6-a3e0-b745e7eef17f.png differ diff --git a/apps/docs/docs/advanced/command-line/img/334116205-aa09ce40-0701-4f7d-b9f9-b431b9d207c5.png b/apps/docs/docs/advanced/command-line/img/334116205-aa09ce40-0701-4f7d-b9f9-b431b9d207c5.png new file mode 100644 index 000000000..881115da8 Binary files /dev/null and b/apps/docs/docs/advanced/command-line/img/334116205-aa09ce40-0701-4f7d-b9f9-b431b9d207c5.png differ diff --git a/apps/docs/docs/advanced/command-line/img/334116303-714b5e07-b9de-4ec0-a2bc-def7ee38750f.png b/apps/docs/docs/advanced/command-line/img/334116303-714b5e07-b9de-4ec0-a2bc-def7ee38750f.png new file mode 100644 index 000000000..9225083fb Binary files /dev/null and b/apps/docs/docs/advanced/command-line/img/334116303-714b5e07-b9de-4ec0-a2bc-def7ee38750f.png differ diff --git a/apps/docs/docs/advanced/command-line/img/334116411-df1482f9-3aa9-4686-b77f-e0dca09e60b2.png b/apps/docs/docs/advanced/command-line/img/334116411-df1482f9-3aa9-4686-b77f-e0dca09e60b2.png new file mode 100644 index 000000000..3ab3823eb Binary files /dev/null and b/apps/docs/docs/advanced/command-line/img/334116411-df1482f9-3aa9-4686-b77f-e0dca09e60b2.png differ diff --git a/apps/docs/docs/advanced/command-line/img/334116518-e1ddb515-99c7-4159-81bf-76e889d1e808.png b/apps/docs/docs/advanced/command-line/img/334116518-e1ddb515-99c7-4159-81bf-76e889d1e808.png new file mode 100644 index 000000000..f998982a6 Binary files /dev/null and b/apps/docs/docs/advanced/command-line/img/334116518-e1ddb515-99c7-4159-81bf-76e889d1e808.png differ diff --git a/apps/docs/docs/advanced/command-line/img/334116642-08c4f204-5cd0-4e4e-a785-0142e1b279ca.png b/apps/docs/docs/advanced/command-line/img/334116642-08c4f204-5cd0-4e4e-a785-0142e1b279ca.png new file mode 100644 index 000000000..748be0664 Binary files /dev/null and b/apps/docs/docs/advanced/command-line/img/334116642-08c4f204-5cd0-4e4e-a785-0142e1b279ca.png differ diff --git a/apps/docs/docs/advanced/command-line/index.mdx b/apps/docs/docs/advanced/command-line/index.mdx new file mode 100644 index 000000000..0e3e802f7 --- /dev/null +++ b/apps/docs/docs/advanced/command-line/index.mdx @@ -0,0 +1,27 @@ +# Command line interface + +The Homarr image ships with a built-in recovery tool. This can be useful, if you do not have access to Homarr or if something is not working. +Please note that the CLI is an *emergency tool*, not an API tool. + +:::caution + +Using the recovery CLi tool can cause problems when requests are being sent to Homarr while the tool is running. \ +You should also create a backup of the database, in case you break something. + +::: + +## Execute CLI with Docker + +1. Execute ``docker ps | grep homarr`` on the root system with Docker to find the container ID of your Homarr container. +2. Run ``docker exec -it /bin/bash homarr ``. \ +Replace ```` with your container ID from step 1. \ +Replace ```` with the command you want to execute (see sub-pages). + +## Execute CLI with QNAP + +1. Open Container Station in the QNAP Web Interface ![](img/334116069-e7ec4726-3df7-4dc6-a3e0-b745e7eef17f.png) +2. Select Containers in the menu bar on the left ![](img/334116205-aa09ce40-0701-4f7d-b9f9-b431b9d207c5.png) +3. Select your Homarr Container ![](img/334116303-714b5e07-b9de-4ec0-a2bc-def7ee38750f.png) +4. Click "Execute" in the top right of the Window. ![](img/334116411-df1482f9-3aa9-4686-b77f-e0dca09e60b2.png) +5. Select /bin/bash and click Execute ![](img/334116518-e1ddb515-99c7-4159-81bf-76e889d1e808.png) +6. Run the Homarr command and press enter (eg. homarr reset-owner-password) ![](img/334116642-08c4f204-5cd0-4e4e-a785-0142e1b279ca.png) diff --git a/apps/docs/docs/advanced/command-line/integrations/index.mdx b/apps/docs/docs/advanced/command-line/integrations/index.mdx new file mode 100644 index 000000000..dfdb587b0 --- /dev/null +++ b/apps/docs/docs/advanced/command-line/integrations/index.mdx @@ -0,0 +1,60 @@ +# Integrations + +:::info + +This guide requires that you understand [how to access the CLI](../). + +::: + +Using these commands, you can manage the integrations from the CLI: +```bash +Group of commands to manage integrations + +Usage: + homarr integrations [command] + +Available Commands: + list List all integrations (id and name) + delete Delete an integration by id or name + +Flags: + -h, --help help for integrations + -v, --version version for homarr-cli + +Use "homarr integrations [command] --help" for more information about a command. +``` + +## List Integrations + +- Requires a database connection +- Lists all configured integrations + +```bash +List all integrations (id and name) + +Usage: + homarr integrations list [flags] + +Flags: + -h, --help help for integrations list + -v, --version version for homarr-cli +``` + +## Delete Integration + +- Requires a database connection +- Requires one parameter: ``id`` or ``name`` +- Deletes an integration permanently from the database + +```bash +Delete an integration by id or name + +Usage: + homarr integrations delete [flags] + +Flags: + -i, --id string ID of the integration + -n, --name string Name of the integration + -h, --help help for integrations delete + -v, --version version for homarr-cli +``` \ No newline at end of file diff --git a/apps/docs/docs/advanced/command-line/password-recovery/img/screenshot-cli-result.png b/apps/docs/docs/advanced/command-line/password-recovery/img/screenshot-cli-result.png new file mode 100644 index 000000000..72ce4637b Binary files /dev/null and b/apps/docs/docs/advanced/command-line/password-recovery/img/screenshot-cli-result.png differ diff --git a/apps/docs/docs/advanced/command-line/password-recovery/img/screenshot-cli.png b/apps/docs/docs/advanced/command-line/password-recovery/img/screenshot-cli.png new file mode 100644 index 000000000..42348e586 Binary files /dev/null and b/apps/docs/docs/advanced/command-line/password-recovery/img/screenshot-cli.png differ diff --git a/apps/docs/docs/advanced/command-line/password-recovery/index.mdx b/apps/docs/docs/advanced/command-line/password-recovery/index.mdx new file mode 100644 index 000000000..e5a80f669 --- /dev/null +++ b/apps/docs/docs/advanced/command-line/password-recovery/index.mdx @@ -0,0 +1,19 @@ +# Password Recovery + +:::info + +This guide requires that you understand [how to access the CLI](../). + +::: + +Using this command, you can forcefully reset the password of a user. +It will be set to a random value and the hash for the user will be updated. +All sessions for that user will be terminated and the user must re-login. + +![](./img/screenshot-cli.png) + +Using the ``--username`` parameter, you can specify who you want to reset the password for. +Executing the command will create a new random password, update the database and display the new password. +All sessions for this user will be terminated and they must re-login. + +![](./img/screenshot-cli-result.png) \ No newline at end of file diff --git a/apps/docs/docs/advanced/command-line/users/index.mdx b/apps/docs/docs/advanced/command-line/users/index.mdx new file mode 100644 index 000000000..a867fa72d --- /dev/null +++ b/apps/docs/docs/advanced/command-line/users/index.mdx @@ -0,0 +1,79 @@ +# Users + +:::info + +This guide requires that you understand [how to access the CLI](../). + +::: + +Using these commands, you can manage the users from the CLI: +```bash +Group of commands to manage users + +Usage: + homarr users [command] + +Available Commands: + list List all users (id, username, email) + delete Delete a user by id or username + update-password Update the password for a user (credentials provider only) + +Flags: + -h, --help help for users + -v, --version version for homarr-cli + +Use "homarr users [command] --help" for more information about a command. +``` + +## List Users + +- Requires a database connection + +```bash +ID Username Email +yj52ek5cyb6du4bp4osbkjry admin xxxx@example.com +yj52ek5cyb6du4bp4osbkjry admin xxxx@example.com +yj52ek5cyb6du4bp4osbkjry admin xxxx@example.com +yj52ek5cyb6du4bp4osbkjry admin xxxx@example.com +yj52ek5cyb6du4bp4osbkjry admin xxxx@example.com +yj52ek5cyb6du4bp4osbkjry admin xxxx@example.com +``` + +## Delete User + +- Requires a database connection +- Requires one parameter: ``id`` or ``username`` + +```bash +Delete a user by id or username + +Usage: + homarr users delete [flags] + +Flags: + -i, --id string ID of the user + -u, --username string Name of the user + -h, --help help for users delete + -v, --version version for homarr-cli +``` + +## Update Password + +- Updates the password of an user +- Requires database connection +- Requires either a username or id +- Requires a password (which will be encrypted by Homarr) + +```bash +Update the password for a user (credentials provider only) + +Usage: + homarr users update-password [flags] + +Flags: + -i, --id string ID of the user + -u, --username string Name of the user + -p, --password New password + -h, --help help for users update-password + -v, --version version for homarr-cli +``` \ No newline at end of file diff --git a/apps/docs/docs/advanced/customizations/img/icons/icons-picker.gif b/apps/docs/docs/advanced/customizations/img/icons/icons-picker.gif new file mode 100644 index 000000000..f8a80d11d Binary files /dev/null and b/apps/docs/docs/advanced/customizations/img/icons/icons-picker.gif differ diff --git a/apps/docs/docs/advanced/development/_category_.json b/apps/docs/docs/advanced/development/_category_.json new file mode 100644 index 000000000..9f659a536 --- /dev/null +++ b/apps/docs/docs/advanced/development/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Developer guides", + "position": 6, + "collapsed": true, + "link": { + "type": "generated-index" + } + } + \ No newline at end of file diff --git a/apps/docs/docs/advanced/development/getting-started.mdx b/apps/docs/docs/advanced/development/getting-started.mdx new file mode 100644 index 000000000..7c16813ba --- /dev/null +++ b/apps/docs/docs/advanced/development/getting-started.mdx @@ -0,0 +1,68 @@ +--- +title: Getting started +tags: + - Developer + - Technical documentation + - Code + - Programming +sidebar_position: 1 +--- + +## Setting up your development environment + +This guide will help you set up your development environment to start contributing to homarr. + +### Prerequisites + +- **Node.js (lts)**: You can download it from the [official website](https://nodejs.org/). +- **pnpm (latest)**: You can install it by running `npm install -g pnpm`. +- **Git**: You can download it from the [official website](https://git-scm.com/). +- **Docker or Docker Desktop**: You can download it from the [official website](https://www.docker.com/). +- **A GitHub account**: You can create one on the [official website](https://github.com/). + +### Setting up the project + +1. Fork the repository by clicking on the "Fork" button on the top right corner of the repository page. + +![Fork button](./img/fork.png) + +2. Clone the repository to your local machine with `git clone`. You can find the url to use by clicking on the "Code" button on the top right corner of your forks repository page. + +![Clone button](./img/clone.png) + +3. Change directory to the project folder with `cd homarr`. + +4. Install the dependencies with `pnpm install`. + +5. Start redis by running `pnpm run docker:dev`. This will run a docker-compose file with a redis service. + +6. Copy the `.env.example` file to `.env` and replace `DB_URL` with the full path you want to use for the sqlite database file. For example `DB_URL='C:\\Dev\\homarr\\packages\\db\\db.sqlite'` + +7. Run the migrations to create the sqlite db file with `pnpm run db:migration:sqlite:run`. + +8. Start the development server with `pnpm dev` and wait for a message that says `✓ Ready in 10.7s` + +9. Open your browser and navigate to [http://localhost:3000](http://localhost:3000). (Loading the page might take up to 2 minutes the first time) + +### Useful npm scripts + +#### During development + +- `pnpm dev`: Start the development server. +- `pnpm cli`: Run cli commands. +- `pnpm db:migration:sqlite:run`: Run the migrations to create or update the sqlite db file. +- `pnpm db:migration:sqlite:generate`: Generate a new migration file for the sqlite db. Also works with `mysql`. +- `pnpm db:studio`: Open a visual studio for the database. +- `pnpm package:new`: Create a new package in the monorepo. + +#### Checking code quality + +- `pnpm lint`: Run the linter to check for code quality issues. +- `pnpm format:fix`: Run the formatter to fix code style issues. +- `pnpm test`: Run the tests. You can also use `pnpm test:ui` to get a UI for the tests. +- `pnpm typecheck`: Run the typescript type checker. + +#### Building the project +- `pnpm build`: Build the project for production. +- `docker build -t homarr .`: Build a docker image for the project. +- `docker run -p 7575:7575 -e SECRET_ENCRYPTION_KEY='your_64_character_hex_string' homarr:latest`: Run the created docker image. \ No newline at end of file diff --git a/apps/docs/docs/advanced/development/img/clone.png b/apps/docs/docs/advanced/development/img/clone.png new file mode 100644 index 000000000..b6936dace Binary files /dev/null and b/apps/docs/docs/advanced/development/img/clone.png differ diff --git a/apps/docs/docs/advanced/development/img/fork.png b/apps/docs/docs/advanced/development/img/fork.png new file mode 100644 index 000000000..a9b03050c Binary files /dev/null and b/apps/docs/docs/advanced/development/img/fork.png differ diff --git a/apps/docs/docs/advanced/development/kubernetes.mdx b/apps/docs/docs/advanced/development/kubernetes.mdx new file mode 100644 index 000000000..e27b3ccbc --- /dev/null +++ b/apps/docs/docs/advanced/development/kubernetes.mdx @@ -0,0 +1,135 @@ +--- +title: Kubernetes +tags: + - Developer + - Technical documentation + - Code + - Programming +sidebar_position: 1 +--- + +This guide provides step-by-step instructions for setting up a Kubernetes cluster using kind, configuring multiple nodes, and installing the Metrics Server. + +## Prerequisites + +Ensure you have the following installed: + +- [Docker](https://docs.docker.com/get-started/get-docker/) (required for running `kind` clusters). +- [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/) (Kubernetes in Docker). +- [Kubectl](https://kubernetes.io/docs/tasks/tools/) (Kubernetes command-line tool). + +Additionally, ensure that Kubernetes tools are enabled in your environment by setting the following variable in your `.env` file: + +```bash +# Enable Kubernetes tool +ENABLE_KUBERNETES=true +``` + +### 1. Creating a Kubernetes Cluster with Multiple Nodes + +We will create a Kubernetes cluster using `kind` with one control plane node and two worker nodes. + +#### Define the Cluster Configuration + +Create a configuration file named `kind-config.yaml` with the following content: + +```bash +cat > kind-config.yaml < + +A sample Traefik docker-compose.yml using Cloudflare for certificate generation that works with the configuration above would be: +```yaml +version: '3' + +apps: + traefik: + image: traefik:latest + container_name: traefik + restart: unless-stopped + security_opt: + - no-new-privileges:true + networks: + - proxy + ports: + - 80:80 + - 443:443 + environment: + - CF_API_EMAIL=yourcfemail@here.com + - CF_DNS_API_TOKEN=long-token-from-cf + + command: + - "--log.level=DEBUG" + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + - "--providers.docker.endpoint=unix:///var/run/docker.sock" + - "--entrypoints.web.address=:80" + - "--entrypoints.web.http.redirections.entryPoint.to=websecure" + - "--entrypoints.web.http.redirections.entryPoint.scheme=https" + - "--entrypoints.web.http.redirections.entrypoint.permanent=true" + - "--entrypoints.websecure.address=:443" + - "--entrypoints.websecure.http.tls.certResolver=cloudflare" + - "--certificatesresolvers.cloudflare.acme.storage=acme.json" + - "--certificatesResolvers.cloudflare.acme.email=yourcfemail@here.com" + - "--certificatesResolvers.cloudflare.acme.dnsChallenge=true" + - "--certificatesResolvers.cloudflare.acme.dnschallenge.provider=cloudflare" + - "--certificatesResolvers.cloudflare.acme.dnschallenge.resolvers=1.1.1.1:53,1.0.0.1:53" + - "--serversTransport.insecureSkipVerify=true" # Or proxmox gives an error 500 due to its own self-signed cert + + volumes: + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/acme.json:/acme.json + +networks: + proxy: + external: true +``` + + +:::tip +Of particular note here is that both configurations explicitly define which network they are using, in this case "proxy", but it can be named anything. It just has to be the same across all apps for which Traefik is serving as a proxy. These are marked as external because the proxy network was manually created by running: `docker network create proxy` but this might be unnecessary depending on HOW exactly you are running Traefik. For example, if running [Traefik with Portainer](https://docs.portainer.io/advanced/reverse-proxy/traefik#deploying-in-a-docker-standalone-scenario), you can follow their official docs on how to set up Traefik and Portainer together, and you can just focus on the Homarr docker labels instead. +::: + +## Securing Homarr with Caddy + +If you are using Caddy as the reverse proxy for your setup, your `docker-compose.yml` should look something like this: + +```yaml +services: + + # <-- [Homarr installation] + + caddy: + container_name: caddy + image: caddy:2 + restart: unless-stopped + ports: + - 80:80 + - 443:443 + - 443:443/udp + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + - caddy_config:/config + networks: + - proxy + +volumes: + caddy_data: + caddy_config: + +networks: + proxy: + external: true +``` +:::important +Homarr needs to be on the same network so you will need to add the following property to your homarr install: +```yaml +homarr: + ... + networks: + - proxy +``` +::: + +Next, create a file named `Caddyfile` at the same level as your `docker-compose.yml` file with the following content: + +``` +homarr.mydomain.com { + reverse_proxy homarr:7575 +} +``` + +If you want more information about working with Caddy and Docker Compose, refer to the official documentation: +https://caddyserver.com/docs/running#docker-compose diff --git a/apps/docs/docs/advanced/running-as-different-user/index.mdx b/apps/docs/docs/advanced/running-as-different-user/index.mdx new file mode 100644 index 000000000..a4ebcf0f4 --- /dev/null +++ b/apps/docs/docs/advanced/running-as-different-user/index.mdx @@ -0,0 +1,93 @@ +--- +title: Running as a different user +tags: + - Configuration + - Docker + - Advanced + - PGID + - PUID +--- + +By default the container is running with user `root` and group `root`. +You can change the user and group by using the `PUID` and `PGID` environment variables. +Important to note is, that you'll also need to change the permissions for the mounted directories accordingly. + +:::info +When starting up an updated version of the container it will have about **10 seconds longer to start** as it has to change the permissions of the app directories +::: + +## Without mounted Docker socket + +To run your container as a different user, you can use the `PUID` and `PGID` environment variables: + +```yml title="docker-compose.yml" +#---------------------------------------------------------------------# +# Homarr - A simple, yet powerful dashboard for your server. # +#---------------------------------------------------------------------# +services: + homarr: + container_name: homarr + image: ghcr.io/homarr-labs/homarr:latest + restart: unless-stopped + volumes: + - ./homarr/appdata:/appdata + environment: + - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` + - PUID=1000 + - PGID=1000 + ports: + - '7575:7575' +``` + +After that you'll need to create the appdata directory and set the correct permissions: + +```bash title="On host" +mkdir -p ./homarr/appdata +chown -R 1000:1000 ./homarr/appdata +``` + +## With mounted Docker socket + +If you want to use the Docker integration, you'll need to set the correct permissions for the Docker socket as well, most of the times it will have the owner group set to docker group. +In any way, it is recommended to create this group and set it's permissions to it, if it doesn't exist yet: + +```bash title="On host" +groupadd -g 999 docker +``` + +Then you can set the permissions for the Docker socket: + +```bash title="On host" +chown root:docker /var/run/docker.sock +``` + +After that you can set the `PUID` and `PGID` environment variables in your `docker-compose.yml` file: + +```yml title="docker-compose.yml" +#---------------------------------------------------------------------# +# Homarr - A simple, yet powerful dashboard for your server. # +#---------------------------------------------------------------------# +services: + homarr: + container_name: homarr + image: ghcr.io/homarr-labs/homarr:latest + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./homarr/appdata:/appdata + environment: + - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` + - PUID=1000 + - PGID=999 + ports: + - '7575:7575' +``` + +And set the permissions for the mounted directories: + +```bash title="On host" +mkdir -p ./homarr/appdata +chown -R 1000:999 ./homarr/appdata +``` + +Important here is that the group ID is set to `999` as we created the `docker` group with this ID. \ No newline at end of file diff --git a/apps/docs/docs/advanced/single-sign-on/index.mdx b/apps/docs/docs/advanced/single-sign-on/index.mdx new file mode 100644 index 000000000..b81772480 --- /dev/null +++ b/apps/docs/docs/advanced/single-sign-on/index.mdx @@ -0,0 +1,360 @@ +--- +title: Single Sign On +tags: + - Management + - Users + - Docker + - SSO + - LDAP + - OIDC + - Active Directory +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Single Sign On + +Homarr supports multiple authentication options, from internal userbase (credentials), to LDAP (with Active directory support), and OIDC. + +### Auth configuration common variables +| Environment Variable | Description | Default Value | +|---------------------------|-------------|---------------| +| AUTH_PROVIDERS | Select Which provider to use between *credentials*, *ldap* and *oidc*.
Multiple providers can be enabled with by separating them with `,`, (ex. `AUTH_PROVIDERS=credentials,oidc`, it is highly recommended to just enable one provider). | credentials | +| AUTH_LOGOUT_REDIRECT_URL | URL to redirect to after clicking logging out. | --- | +| AUTH_SESSION_EXPIRY_TIME | Time for the session to time out. Can be set as pure number, which will automatically be used in seconds, or followed by s, m, h or d for seconds, minutes, hours or days. (ex: "30m") | "30d" | + + + + + This is the default provider. + + First user is created using the onboarding process and the rest can be created by this user (see [user management](/docs/management/users)) + + + + + This provider authenticates against an LDAP server. + + Any user in LDAP server that signs in gets created in Homarr database. + + Roles are fetched from LDAP groups. Groups with the same name of Homarr will be used to synchronize them. + + + + +
+ + Example Setup + +
+ + In this setup we are using [lldap](https://github.com/lldap/lldap). Install your server using docker or [as a service](https://github.com/lldap/lldap/blob/main/example_configs/lldap.service). + + Minimal configuration requires 4 env variables, LDAP URI, base, user and password for querying data. + + There's more variables, but all have defaults corresponding to lldap defaults. These might need to be changed if you have different LDAP provider. + ``` + docker run ... + AUTH_PROVIDERS="ldap" + AUTH_LDAP_URI="ldap://example.com:3890" + AUTH_LDAP_BASE="dc=example,dc=com" // Same as LLDAP_LDAP_BASE_DN + AUTH_LDAP_BIND_DN="uid=admin,ou=People,dc=example,dc=com" + AUTH_LDAP_BIND_PASSWORD="adminpass" // Same as LLDAP_LDAP_USER_PASS + ``` + ``` + #Docker compose + version: x + services: + homarr: + environment: + AUTH_PROVIDERS: ldap + AUTH_LDAP_URI: ldap://example.com:3890 + AUTH_LDAP_BASE: dc=example,dc=com #Same as LLDAP_LDAP_BASE_DN + AUTH_LDAP_BIND_DN: uid=admin,ou=People,dc=example,dc=com + AUTH_LDAP_BIND_PASSWORD: adminpass #Same as LLDAP_LDAP_USER_PASS + ``` + + In lldap, create a user and admin group, assign this user to the external admin group configured during onboarding. You can log in using this user and he will be in the group. + + Here is another example for Active Directory: + + ``` + AUTH_LDAP_URI="ldap://ldap.abc.xyz:389 + AUTH_LDAP_BASE="DC=abc,DC=xyz" + AUTH_LDAP_BIND_DN="CN=Administrator,CN=Users,DC=abc,DC=xyz" + AUTH_LDAP_BIND_PASSWORD="YourAdministratorPassword" + AUTH_LDAP_USERNAME_ATTRIBUTE="sAMAccountName" + AUTH_LDAP_USER_MAIL_ATTRIBUTE="userPrincipalName" + AUTH_LDAP_GROUP_CLASS="group" + AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE="member" + AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE="dn" + AUTH_LDAP_SEARCH_SCOPE="sub" + AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG="(sAMAccountType=805306368)" + ``` + User mail attribute is set to userPrincipalName as it follows the right schema, but it is recommended to use real emails and the default 'mail' value. + +
+
+ + + ### Configuration + + | Environment Variable | Description | Default value | + |-------------------------------------------|-----------------------------------------------------------|---------------------| + | ``AUTH_LDAP_URI`` | URI of your LDAP server | --- | + | ``AUTH_LDAP_BASE`` | Base dn of your LDAP server | --- | + | ``AUTH_LDAP_BIND_DN`` | User used for finding users and groups | --- | + | ``AUTH_LDAP_BIND_PASSWORD`` | Password for bind user | --- | + | ``AUTH_LDAP_USERNAME_ATTRIBUTE`` | Attribute used for username | uid | + | ``AUTH_LDAP_USER_MAIL_ATTRIBUTE`` | Attribute used for mail field | mail | + | ``AUTH_LDAP_GROUP_CLASS`` | Class used for querying groups | groupOfUniqueNames | + | ``AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE`` | Attribute used for querying group member | member | + | ``AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE`` | User attribute used for comparing with group member | dn | + | ``AUTH_LDAP_SEARCH_SCOPE`` | Serach scopes between base, one and sub | base | + | ``AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG`` | Extra arguments for user search filter (& based) | --- | + | ``AUTH_LDAP_GROUP_FILTER_EXTRA_ARG`` | Extra arguments for user's groups search filter (& based) | --- | + +
+ + + This provider authenticates using OIDC protocol. + + Users signed in using OIDC are created in Homarr. + + Roles are fetched from group claims. This can also be changed to roles for example added to a azure app registration by using the `AUTH_OIDC_GROUPS_ATTRIBUTE`. + +
+ + Example Setup + +
+ + In this example we will be using [Authelia](https://github.com/authelia/authelia). + + You can use any setup, but the simplest is [local](https://github.com/authelia/authelia/blob/master/examples/compose/local/authelia/configuration.yml). + + You also have to [enable OIDC in Authelia](https://www.authelia.com/configuration/identity-providers/open-id-connect/). + + Create a client for homarr. To generate client secret you can [use authelia](https://www.authelia.com/integration/openid-connect/frequently-asked-questions/#how-do-i-generate-client-secrets). This is an example config: + + ```yaml + identity_providers: + oidc: + ... + clients: + - id: homarr + secret: + public: false + authorization_policy: one_factor + redirect_uris: + - https://example.com/api/auth/callback/oidc + - http://localhost:3000/api/auth/callback/oidc + scopes: + - openid + - groups + - profile + - email + userinfo_signing_algorithm: none + consent_mode: implicit # self hosted + ``` + + In Homarr use following env variables. + + ``` + AUTH_PROVIDERS="oidc" + AUTH_OIDC_ISSUER="https://auth.example.com" + AUTH_OIDC_CLIENT_SECRET="client_secret" + AUTH_OIDC_CLIENT_ID="homarr" + AUTH_OIDC_CLIENT_NAME="Authelia" + AUTH_OIDC_FORCE_USERINFO="true" --> from v4.39 of authelia and above this is required + ``` + + For an azure app registration the setup could look like this: + + ``` + AUTH_PROVIDERS="oidc" + AUTH_OIDC_ISSUER="https://login.microsoftonline.com//v2.0" + AUTH_OIDC_CLIENT_SECRET="" + AUTH_OIDC_CLIENT_ID="" + AUTH_OIDC_CLIENT_NAME="Azure" + AUTH_OIDC_SCOPE_OVERWRITE="openid email profile" # Groups scope does not exist in azure + AUTH_OIDC_GROUPS_ATTRIBUTE="roles" # We use the roles of the app registration so that we don't need to use uuids as our groups + ``` + +
+
+ + + ### Configuration + + | Environment Variable | Description | Default value | + |-----------------------------|------------------------------------------------------------|---------------| + | ``AUTH_OIDC_ISSUER`` | Issuer URI of OIDC provider. This has generally to be **without trailing slash** except for **Authentik** | --- | + | ``AUTH_OIDC_CLIENT_ID`` | ID of OIDC client (application) | --- | + | ``AUTH_OIDC_CLIENT_SECRET`` | Secret of OIDC client (application) | --- | + | ``AUTH_OIDC_CLIENT_NAME`` | Display name of provider (in login screen) | OIDC | + | ``AUTH_OIDC_AUTO_LOGIN`` | Automatically redirect to OIDC login | false | + | ``AUTH_OIDC_SCOPE_OVERWRITE`` | Overwrite default scopes (openid, profile, email) | openid email profile groups | + | ``AUTH_OIDC_GROUPS_ATTRIBUTE`` | Attribute used for groups (roles) claim | groups | + | ``AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE`` | Overwrite name attribute. By default it will use preferred_username if it does not contain a `@` and otherwise name. | --- | + | ``AUTH_OIDC_FORCE_USERINFO`` | Force userinfo endpoint to be used for user information. | false | + | ``AUTH_OIDC_ENABLE_DANGEROUS_ACCOUNT_LINKING`` | Enable account linking for OIDC provider. This will link the OIDC accounts by email. Be sure that you have verified emails to prevent stealing accounts. | false | + | ``AUTH_OIDC_TOKEN_ENDPOINT_AUTH_METHOD`` | Override method for the token endpoint authentication. Supported values are `client_secret_basic`, `client_secret_post`, `client_secret_jwt` and `none`. | client_secret_basic | + + ### Permission System + + To give a user special permissions, first create a new group in homarr and assign the permission desired. + For example if the group on homarr is called `homarr-admins` a new group on the oidc provider, for example authentik needs to be created with the same name, that would be `homarr-admins`. + After assigning the group on the oidc provider to the user, and logging again into homarr, the user should automatically get placed in that group and inherit the permissions defined. + +
+
+ +## Example setups + + + + + This example demonstrates how to use [Authentik](https://goauthentik.io/) as an OIDC provider for Homarr. + + User and group management is handled within Authentik. Homarr synchronizes group memberships based on OIDC claims provided by Authentik. To grant administrative privileges, create a group in Authentik (e.g., `homarr-admins`) and add the relevant users. Then add the group with the same name in Homarr and assign the desired permissions to it. + +
+ + Example Setup + +
+ + **1. Configure Authentik:** + + - Create an OIDC application in Authentik for Homarr. + - Set the redirect URIs to: + - `https:///api/auth/callback/oidc` + - `http://localhost:3000/api/auth/callback/oidc` (for local development) + - Record the client ID, client secret, and application slug. + - Create a group (e.g., `homarr-admins`) and assign users who require admin access. + + **2. Example .env file:** + ```env + OIDC_CLIENT_ID=identificationid #OIDC client ID + OIDC_CLIENT_SECRET=secretsecretsecret #OIDC client secret + OIDC_SLUG=homarr #Application slug in Authentik + AUTH_DOMAIN=auth.example.com #Authentik FQDN + ADMIN_GROUP=homarr-admins #Authentik group for Homarr admins + HOMARR_FQDN=homarr.example.com #Homarr FQDN + SECRET_ENCRYPTION_KEY=encryptencryptencrypt #Homarr encryption key + ``` + + **3. Example Docker Compose configuration:** + ```yaml {14-26} + services: + homarr: + image: ghcr.io/homarr-labs/homarr:latest + container_name: homarr + restart: unless-stopped + ports: + - '7575:7575' + volumes: + - ./homarr:/appdata + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + - TZ=America/Los_Angeles + - SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY} + - BASE_URL=https://${HOMARR_FQDN} + - NEXTAUTH_URL=https://${HOMARR_FQDN} + - AUTH_PROVIDERS=oidc #(optional: include ',credentials' to keep local accounts as fallback) + - AUTH_OIDC_CLIENT_ID=${OIDC_CLIENT_ID} + - AUTH_OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET} + - AUTH_OIDC_ISSUER=https://${AUTH_DOMAIN}/application/o/${OIDC_SLUG}/ + - AUTH_OIDC_URI=https://${AUTH_DOMAIN}/application/o/authorize + - AUTH_OIDC_CLIENT_NAME=authentik + - AUTH_OIDC_SCOPE_OVERWRITE=openid email profile groups + - AUTH_OIDC_GROUPS_ATTRIBUTE=groups + - AUTH_LOGOUT_REDIRECT_URL=https://${AUTH_DOMAIN}/application/o/${OIDC_SLUG}/end-session/ + - AUTH_OIDC_AUTO_LOGIN=true #To sign in with Authentik automatically + networks: + - my-network + networks: + my-network: + external: true + ``` + + **4. Additional Notes:** + - Ensure both Authentik and Homarr are accessible via the specified FQDNs. + - The `AUTH_OIDC_GROUPS_ATTRIBUTE` should correspond to the claim in Authentik that contains group names (typically `groups`). + - Your user will automatically be placed in groups that have the same name as those of authentik. So simply create them in Homarr and give them the permissions you want. + - For further information, refer to the [Authentik OIDC documentation](https://goauthentik.io/docs/providers/oauth2/). + +
+
+ + Additional OIDC configuration options are described in the OIDC tab above. + +
+ + + This example demonstrates how to use [Google Auth Platform](https://console.cloud.google.com/auth/overview) as an OIDC provider for Homarr. + + Unfortunately Google does not support synchronization of group membership. See https://issuetracker.google.com/issues/133774835?pli=1. + +
+ + Example Setup + +
+ + **1. Setup (Google):** + + - Create a Project in [Google Cloud Console](https://console.cloud.google.com/) for Homarr and switch to that Project. + - Configure [Authorized Domains](https://console.cloud.google.com/auth/branding) and set it to ``. + - Create a new [OAuth Client](https://console.cloud.google.com/auth/clients): + - Select Application Type `Web` + - Set the redirect URI to `https:///api/auth/callback/oidc` + - Record the `Client-ID` and `Client Key` (secret). + + **2. Example .env file (Homarr):** + ```env + OIDC_CLIENT_ID=identificationid #Google Client-ID + OIDC_CLIENT_SECRET=secretsecretsecret #Google Client Key (secret) + HOMARR_FQDN=homarr.example.com #Homarr FQDN + SECRET_ENCRYPTION_KEY=encryptencryptencrypt #Homarr encryption key + ``` + + **3. Example Docker Compose configuration (Homarr):** + ```yaml {16-22} + services: + homarr: + image: ghcr.io/homarr-labs/homarr:latest + container_name: homarr + restart: unless-stopped + ports: + - '7575:7575' + volumes: + - ./homarr:/appdata + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + - TZ=Europe/Berlin + - SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY} + - BASE_URL=https://${HOMARR_FQDN} + - NEXTAUTH_URL=https://${HOMARR_FQDN} + - AUTH_PROVIDERS=oidc #(optional: include ',credentials' to keep local accounts as fallback) + - AUTH_OIDC_CLIENT_ID=${OIDC_CLIENT_ID} + - AUTH_OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET} + - AUTH_OIDC_ISSUER=https://accounts.google.com + - AUTH_OIDC_CLIENT_NAME=Google + - AUTH_OIDC_SCOPE_OVERWRITE=openid email profile + - AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE=name + networks: + - my-network + networks: + my-network: + external: true + ``` +
+
+ + Additional OIDC configuration options are described in the OIDC tab above. + +
+
diff --git a/apps/docs/docs/advanced/styling/img/custom-css-setting.png b/apps/docs/docs/advanced/styling/img/custom-css-setting.png new file mode 100644 index 000000000..63385622f Binary files /dev/null and b/apps/docs/docs/advanced/styling/img/custom-css-setting.png differ diff --git a/apps/docs/docs/advanced/styling/img/enter-board-settings.png b/apps/docs/docs/advanced/styling/img/enter-board-settings.png new file mode 100644 index 000000000..9de57e413 Binary files /dev/null and b/apps/docs/docs/advanced/styling/img/enter-board-settings.png differ diff --git a/apps/docs/docs/advanced/styling/img/widget-custom-classes.png b/apps/docs/docs/advanced/styling/img/widget-custom-classes.png new file mode 100644 index 000000000..9347584c6 Binary files /dev/null and b/apps/docs/docs/advanced/styling/img/widget-custom-classes.png differ diff --git a/apps/docs/docs/advanced/styling/index.mdx b/apps/docs/docs/advanced/styling/index.mdx new file mode 100644 index 000000000..9be382ec3 --- /dev/null +++ b/apps/docs/docs/advanced/styling/index.mdx @@ -0,0 +1,94 @@ +# Styling + +:::tip + +This page is directed at more experienced users with knowledge about CSS and browsers. +We recommend you to [look into the board customizations instead](/docs/management/boards#appearance), +if you do not have experience with writing custom styles or CSS. + +::: + +:::warning + +Our support specifically excludes custom CSS, and we will not help you to write CSS. +However, we may help you by adding new CSS classes if required. + +::: + +Homarr uses https://mantine.dev/ under the hood. You can change the look & feel of Homarr +using custom CSS, that extends or overwrites the styles from Mantine. + +## Getting into CSS +If you don't have any experience with CSS, +we strongly recommend you to go through the courses here: https://www.w3schools.com/css/. +Due to the infinite scenarios and setups possible with custom CSS, +our support team will not provide any support with your own written CSS. + +## Limitations and dangers +When using custom CSS, you can break the page or certain functionalities. +Although CSS can improve the design & feel of the page, it **cannot do any of the following**: + +- Implement new features, widgets or integrations +- Securely hide elements you don't want users to interact / have permission to +- Completely revamp the design of the page, only smaller changes are possible + +Here are some dangers of using custom CSS: +- Updates may contain breaking changes in the structure, built-in styling or how styling is processed. Therefore, +custom CSS may break unexpectedly without any warning +- Custom CSS may make certain elements invisible or not possible to click / interact with +- Custom CSS could make readability and accessibility worse for impaired people + +## How to inspect the page +When styling the page, you can use the ``Inspector`` to inspect elements on the page and try out styles. +This may vary depending on your browser and operating system, but the workflow usually goes like this: + +- Open the Homarr page +- Press ``Ctrl`` + ``Shift`` + ``I`` at the same time. +Alternatively, right-click on the page and choose ``Inspect`` or ``Inspect element``. +- Open the tab ``Elements`` if it isn't open yet. +- Search the element you want to change in the DOM tree or use the element picker (usually at the top left) +to select it by clicking on the page. +- Experiment by changing the CSS code on the right side + +When writing custom CSS, it is important to also remember or create a selector, which tells the browser +which element to apply the styles to. If you accidentally broke something or want to revert your changes in the inspector, +simply reload the page. + +## Using Homarr's classes +Homarr's elements will already have a lot of classes and styles pre-applied. +You can reuse those classes to apply additional styles or overwrite them. +When overwriting, remember to add the ``!important`` flag to your CSS property to tell the browser to use our instruction instead. + +Classes with random number suffixes, such as ``mantine-Card-x2fske``, should be avoided, since those are dynamic +CSS classes that will change with every build. This means, every time you update Homarr, +your styles will no longer apply to them + +## Defining custom classes for widgets +If you want to apply the styles only for one widget, you can define custom class names only for that widget. +To do that, enter edit mode on your board, click the three dots of your widget, click ``Edit item`` and click ``Advanced options``. +Then, you can enter as many custom classes as you'd like: + +![](./img/widget-custom-classes.png) + +To save them, click `Save changes` on both modals and exit edit mode. + +## Where to enter custom CSS +After you wrote your custom CSS, it is time to permanently save it, so you don't need to use the inspector anymore. +To do this, enter the board settings: + +![](./img/enter-board-settings.png) + +Scroll down a bit and click on custom CSS. +Here you can enter your CSS code, which will be applied on the respective board page. + +![](./img/custom-css-setting.png) + +## Using variables +You can also change the values of the theme variables, which are located here: https://mantine.dev/styles/css-variables-list/. +To do this, see the following example CSS: + +```css +:root { + --mantine-primary-color-filled: #ffbb00; +} +``` \ No newline at end of file diff --git a/apps/docs/docs/community/_category_.json b/apps/docs/docs/community/_category_.json new file mode 100644 index 000000000..0639dbdff --- /dev/null +++ b/apps/docs/docs/community/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Community", + "position": 5, + "collapsed": true, + "link": { + "type": "generated-index" + } +} diff --git a/apps/docs/docs/community/donate.mdx b/apps/docs/docs/community/donate.mdx new file mode 100644 index 000000000..b21c62230 --- /dev/null +++ b/apps/docs/docs/community/donate.mdx @@ -0,0 +1,25 @@ +--- +title: Donate +tags: + - Community + - Donation + - OpenCollective +--- + +# Donate +## Why to donate +Our team of 4 developers is working on Homarr in their free time. +Homarr has become a big part of our daily things we work on - and therefore we invest a lot of time into maintaining Homarr, +providing support and implementing new features. +We also incur monetary costs while developing Homarr for the tools that we need. +A few examples include: +- Renting for a Cloud VPS for our cloud services (status page, monitoring, email, analytics, [demo instance](https://demo.homarr.dev/), ...) +- Paying for (IDE-) licenses + +Using a donation, you help us to cover these expenses and enable the development of Homarr. +Homarr is completely free to use. We'd highly appreciate if you consider donating, especially if you use Homarr in a commercial environment. + +## Where to donate +We accept donations on our official [OpenCollective](https://opencollective.com/homarr). +You may also sponsor us directly by providing a useful service / product to us other means. +You can get into contact with us [here](./get-in-touch). \ No newline at end of file diff --git a/apps/docs/docs/community/faq.mdx b/apps/docs/docs/community/faq.mdx new file mode 100644 index 000000000..465c7bbaf --- /dev/null +++ b/apps/docs/docs/community/faq.mdx @@ -0,0 +1,90 @@ +--- +title: Frequently Asked Questions +tags: + - Community + - Help +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +### Can I install Homarr on a Raspberry Pi? +Yes, Homarr is compatible with the architecture of the Raspberry Pi. Have a look in our installation guide on how to do so. + +### I have a suggestion / idea for improvement or want to report a bug +You can report issues, suggestions, or ideas for improvements here. + +### Can I use my own custom icons for apps? +Yes, check out our guide on how to add your custom icons. + +### Some of my online icons are not working (anymore) +It seems the `cdn.jsdelivr.net` database of icon sometimes appear in the lists for DNS-Holes (PiHole, AdGuard Home...).
+So make sure to manually whitelist this address. + +### Can I add my own widgets? Do I need programming skills? +We have decided, not to support custom widgets, until Homarr is in a stable and highly polished state. +Enabling users to write their own widgets is easy at the first glance, but there are some major issues with it: + +- There are mainly two options for adding plugins or custom widgets to Homarr. The first option is, to allow and inject custom code in Homarr. Apps like Nextcloud can do this easily, because they use the Runtime to render all components of the application (In reality, the process is still a bit more complicated). In contrast, Homarr is using Next.js - a framework that needs to be compiled in production. That means, that each time you would modify a custom widget or plugin, the app would have to be restarted. There are options to avoid this, but they are quite flakey and bring disadvantages in our experience. The second option is, to write widgets declaratively instead of imperatively. This way, we would be able to render and modify widgets without any restarting at all. However, we'd have to write our own interpreter for said declarative schema. This is totally possible, but requires a lot of planning and architecture design to function properly. The required work to implement either option is therefore quite substantial. +- Custom widgets would need to be able to request data, so they work properly. We use tRPC for this. Many APIs use different formats and we'd have to convert and read those. +- Using custom widgets, one could easily create harmful widgets, leak your personal data (potentially including your tokens) and trick your users. A proper implementation (eg. official plugin store, where we can ban harmful widgets from) would resolve this problem to a certain extent, but again requires additional work and time to be put in. + +If you still want to add a widget, please consider to contribute it directly to Homarr. For that, basic programming skills are required. Our [Developer Guides](/docs/advanced/development/getting-started) explain this even more detailed. + +### Is it secure to expose Homarr to the web? + +Yes, since v0.14.0, we are confident that Homarr is secure enough to be exposed to the web. +Make sure to enable the "allow anonymous access" [option in the settings](/docs/management/boards#access-control), if you want to allow people without an account to be able to see your dashboard (not edit) + +### How do I open the console / log? +There are two different sources of information: +- console: This is your client (browser). It can tell us, if there is an issue on the client (crash, bug, ...). +- log: This is your server. It will tell us, if there are issues with connections for the integrations, crashes and errors. + +Both variants *can* contain personal data. It's recommended, that you don't post them publicly or remove personal data from it. + + + + +> Note: This will not work on most mobile browsers. + +Open your browser and ensure, that Homarr is your current tab. +Press ``CTRL`` + ``SHIFT`` + ``I`` on your keyboard. If this shortcut doesn't work, please use one of the alternatives: https://developer.chrome.com/docs/devtools/open/. +Click on ``Console`` in the new window, that opened. There, you should see white, orange and sometimes red messages. You can use the Windows Snip & Sketch tool (or your respective tool on Linux / MacOS) to screenshot those messages. + +> Please never execute any commands in the console. Scammers are using the console to let you execute harmful commands. If you want to resolve an issue in Homarr, **you'll never have to execute any commands here** + + + + +This depends on your installation method. If you use Unraid, you can simply click on the App and on ``Log``. If you have a bare Docker install, use ``docker container logs homarr``. If you used a different name than ``homarr`` for your container, you need to replace said argument. Here is some additional information about the command: https://geekflare.com/check-docker-logs/. + + + + +### How do I post logs? +Please check [the section above](#how-do-i-open-the-console--log), on how to obtain logs. Logs should always be posted to https://pastebin.com/ or https://rentry.co/. + +### Can I use Homarr at my company? +Yes, you can! But please consider a donation, if our work has been useful to you. + +### I think I found a bug. What can I do? +If you think, that you found a bug, please create an issue here. + +### Why can't I use my custom icons? +You need to restart the Homarr Docker container after adding icons. + +### Why can't homarr see/ping containers running locally behind GluetunVPN? +This is because GluetunVPN, and many other docker VPN services, secure their VPN connections with strict firewalls. These firewalls often block access to local containers, even on the same docker network. The workaround for GluetunVPN is to add "- FIREWALL_OUTBOUND_SUBNETS=192.168.1.0/24" into the environmental variables of the docker compose file. If you are using a firewall on your system, you will need to add a rule that allows requests from ip's in the range of 192.168.xxx.xxx . If you are using UFW the command would be "sudo ufw allow from 192.168.0.0/16". +Tip: If you are running your torrent client behind a VPN, and running Sonarr (or something similar) normally, make sure to open your torrent client's port in your firewall. If you don't, Sonarr will not be able to see it. Furthermore, use your machines IP (192.168.x.x) rather then 127.0.0.1 or localhost. + +### Can I get in touch with you? +Yes, go here to get with us in touch. + +
+ +:::tip + +Haven't found the solution to your problem / question? We are eager to help you on [our Discord](/docs/community/get-in-touch#discord) or in a [GitHub Issue](https://github.com/homarr-labs/homarr/issues/new/choose). + +::: diff --git a/apps/docs/docs/community/get-in-touch.mdx b/apps/docs/docs/community/get-in-touch.mdx new file mode 100644 index 000000000..7651f5ea2 --- /dev/null +++ b/apps/docs/docs/community/get-in-touch.mdx @@ -0,0 +1,24 @@ +--- +title: Get In Touch +description: Still have a question? Click here! +tags: + - Help + - Community +--- + +We're happy to talk with you! Shoot us a message at the following places: + +## E-Mail +We are open to discuss sponsorships, security vulnerabilities and other private requests through our email. +Please do not report any bugs / feature requests here - they will be ignored and deleted. + +[homarr-labs@proton.me](mailto:homarr-labs@proton.me) + +## Discord +We have a Discord Server, where we announce new releases, discuss features and bugs and show off our dashboards. +There are over 4'000 members and we're happy to answer your questions or concerns. +You're also open to discuss new / upcoming features and any offtopic selfhosting content. + +[_![](https://discordapp.com/api/guilds/972958686051962910/widget.png?style=banner2)_](https://discord.gg/aCsmEV5RgA) + + diff --git a/apps/docs/docs/community/img/InfoCard-exemple.webp b/apps/docs/docs/community/img/InfoCard-exemple.webp new file mode 100644 index 000000000..3d186fdd3 Binary files /dev/null and b/apps/docs/docs/community/img/InfoCard-exemple.webp differ diff --git a/apps/docs/docs/community/img/crowdin-language-select.png b/apps/docs/docs/community/img/crowdin-language-select.png new file mode 100644 index 000000000..67f7b35b8 Binary files /dev/null and b/apps/docs/docs/community/img/crowdin-language-select.png differ diff --git a/apps/docs/docs/community/img/crowdin-live-translate.png b/apps/docs/docs/community/img/crowdin-live-translate.png new file mode 100644 index 000000000..7e9efbb8d Binary files /dev/null and b/apps/docs/docs/community/img/crowdin-live-translate.png differ diff --git a/apps/docs/docs/community/img/edit-page-button.webp b/apps/docs/docs/community/img/edit-page-button.webp new file mode 100644 index 000000000..e40470ca9 Binary files /dev/null and b/apps/docs/docs/community/img/edit-page-button.webp differ diff --git a/apps/docs/docs/community/img/qbittorrent_options_csrf.webp b/apps/docs/docs/community/img/qbittorrent_options_csrf.webp new file mode 100644 index 000000000..cf1ba090d Binary files /dev/null and b/apps/docs/docs/community/img/qbittorrent_options_csrf.webp differ diff --git a/apps/docs/docs/community/img/qbittorrent_unauthorized.webp b/apps/docs/docs/community/img/qbittorrent_unauthorized.webp new file mode 100644 index 000000000..2f387b662 Binary files /dev/null and b/apps/docs/docs/community/img/qbittorrent_unauthorized.webp differ diff --git a/apps/docs/docs/community/license.mdx b/apps/docs/docs/community/license.mdx new file mode 100644 index 000000000..e36a5d684 --- /dev/null +++ b/apps/docs/docs/community/license.mdx @@ -0,0 +1,233 @@ +--- +title: License +tags: + - Community +--- + +Homarr is licensed under [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0). + +## TL;DR +| Action | Allowed | +| -------------- | ------- | +| Copy | ✅ | +| Modify | ✅ | +| Distribution | ✅ | +| Commercial Use | ✅ | +| Private Use | ✅ | +| Attribution | ✅ | +| Liability | ❌ | +| Warranty | ❌ | + +:::note + +Please consider [making a donation](/docs/community/donate) to Homarr, if this project has been useful for your needs. Donations help us to keep Homarr up to date, implement new features and help our users with problems and questions. + +::: + + + +## Full License + +```txt + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2025 Meier Lukas, Thomas Camlong and Homarr Labs + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` diff --git a/apps/docs/docs/community/translations.mdx b/apps/docs/docs/community/translations.mdx new file mode 100644 index 000000000..074db939d --- /dev/null +++ b/apps/docs/docs/community/translations.mdx @@ -0,0 +1,53 @@ +--- +title: Translations +tags: + - Community + - Translations +--- + +We want to make Homarr accessible for everyone. +But to do that, we need your help. +We are running a community program that enables everyone to translate Homarr into their language – no programming required. +We are using [Crowdin](https://crowdin.com/) to manage our translations. +You can find the translations [here](https://translate.homarr.dev/). + +## How to translate + + +### Using crowdin's online platform +Go to the [Crowdin translations](https://translate.homarr.dev/) and select a language you want to translate. +You can then enter the translation mode and start translating. +After you've submitted your translations, a Proofreader will review your changes. +After a translation has been approved, it will be merged to the language development branch. +We merge this one periodically to the development branch. +After the next update of Homarr, all changes from the development branch will be merged, including the changes in the translations. + +### Using live translate +You can also help translate homarr directly from the app! +For this you can simply change your language to "Crowdin (live translations)" + +![](./img/crowdin-language-select.png) + +Then you'll be prompted to connect to your Crowdin account and choose the language in which you want to transalte. +You can then start translating directly from the app by selecting some text on the app. +If some text cannot be selected to be edited with the live translation tool, you can still translate it inside of the In-Context popup at the Home tab, it will be red if it's not translated yet. + +![](./img/crowdin-live-translate.png) + +:::caution +Although you are translating directly from the app, your translations will not be directly be available inside of your language, they will be in the next update of Homarr, because we have to push the new translations to a new docker image. + +If you really want to use them you can enable the "preview transaltions" option in the live translate settings, but be aware that this is not recommended for performance reasons. +::: + +:::tip + +Do you want to become a proofreader? [Let us know on our Discord](/docs/community/get-in-touch#discord)! We will add you to the proofreader team. You can then review the translations and approve them. **Note:** You must speak the language fluently, have it as your native language or lots of experience with it. + +::: + +## Guidelines +1. Translate with context: Some translations can't be translated 1:1 - they need context. Ensure that your translations make sense in the context. +2. Keep things simple and original - no additional characters are needed. +3. Don't translate the same thing twice - if you see a translation that is already translated, don't translate it again unless you have a better translation. +5. Keep your translations as close to the original as possible. diff --git a/apps/docs/docs/getting-started/_category_.json b/apps/docs/docs/getting-started/_category_.json new file mode 100644 index 000000000..28623c903 --- /dev/null +++ b/apps/docs/docs/getting-started/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Getting started", + "position": 1, + "collapsed": false, + "link": { + "type": "generated-index", + "title": "Getting started" + } +} diff --git a/apps/docs/docs/getting-started/after-the-installation.mdx b/apps/docs/docs/getting-started/after-the-installation.mdx new file mode 100644 index 000000000..6ad808c6e --- /dev/null +++ b/apps/docs/docs/getting-started/after-the-installation.mdx @@ -0,0 +1,359 @@ +--- +title: After the installation +sidebar_position: 3 +tags: + - Getting started + - Configuration +--- + +import imageStartFromScratchStepServerSettings from "./img/onboarding-from-scratch-step-server-settings.png"; +import imageStartFromScratchStepAdminUser from "./img/onboarding-from-scratch-step-admin-user.png"; +import imageStartFromScratchStepExternalAdminGroup from "./img/onboarding-from-scratch-step-external-admin-group.png"; +import imageStartFromScratchStepFinish from "./img/onboarding-from-scratch-step-finish.png"; +import manageBoardHeaderEditMode from "./img/manage-board-header-edit-mode.png"; +import manageBoardHeaderAddItem from "./img/manage-board-header-add-item-menu.png"; +import manageBoardHeaderChooseItem from "./img/manage-board-header-choose-item.png"; +import manageBoardNoApp from "./img/manage-board-no-app.png"; +import manageExportOldHomarr from "./img/old-homarr-export-data.png"; +import manageImportOldHomarrDropzone from "./img/old-homarr-import-dropzone.png"; +import manageImportOldHomarrChooseData from "./img/old-homarr-import-choose-imported-data.png"; +import manageImportDecryptionToken from "./img/old-homarr-import-decryption-token.png"; + +:::tip + +Read our [glossary](./glossary) if you are new to Homarr. + +::: + +Congratulations on installing Homarr. Now it's time to get yourself familiar with the concepts of Homarr and how to use it. + +## Onboarding +The onboard will show the first time you start Homarr. +This process will help you with your first steps and adding some initial data, such as the administrator account. + +:::note + +If you see this screen repeatitly after you restarted the Homarr container, your Docker mounting paths may be missing, +incorrect or read-only. Read [our installation instructions](/docs/getting-started/installation/docker) again to fix this issue. + +::: + +You can either import a previous dashboard using the ZIP archive or start from scratch: + +![Screenshot of Step 1 onboarding](./img/onboarding-step-1.png) + +You may refresh anytime and continue from a different device - the onboarding is saved immediately on the server for your convenience. + +### Starting from scratch +Depending on your auth provider configuration you will either first see the admin user creation form or the external group creation form. +If credentials provider was selected, you'll be prompted to create an admin user for Homarr. +This user cannot be deleted and has full control over Homarr and all of it's boards. +You must choose an username and password (both can later be changed). +We enforce strict password requirements, when you enter your password, to protect your instance if you accidentially +expose it to the Internet. + +{"Screenshot + +If you selected external providers (such as LDAP or OIDC), you'll be prompted to create an admin group. +This group will be used to synchronize users from your provider to Homarr. +When a user is logged in through the provider the groups of him that match groups with any in Homarr will be added to the user. +The name of the group has to match exactly the name of the group in the provider. + +{"Screenshot + +Next, you can configure some basic settings for Homarr. We recommend to leave all settings at default for most users. +Here you can also disable analytics. Please note that our analytics are completly anonymous and is fully compliant with GDPR and PECR. + +{"Screenshot + +### Setting up integrations + +After configuring server settings, the onboarding guides you through setting up your integrations. + +#### Docker service discovery +If Docker is available (socket mounted), Homarr automatically detects running containers and matches them to known integration types. +Matching integrations are pre-selected in the integration list, saving you from manually picking each one. + +#### URL templating +You can define a base URL template to auto-fill integration URLs in bulk. +Two modes are supported: +- **Subdomain mode** — e.g. `{app}.example.com` where `{app}` is replaced with the integration name +- **Port mode** — e.g. `192.168.1.1:{port}` where `{port}` is replaced with the integration's default port + +#### API key helper links +For integrations that require API keys (such as Sonarr, Radarr, SABnzbd, or Seerr), a helper link opens the relevant settings page in the target application so you can quickly copy your key. + +#### Creating apps from Docker containers +You can optionally auto-create bookmark apps for all discovered Docker containers, making them immediately available on your board. + +:::note + +Some niche and registry integrations (GitHub, npm, Docker Hub, GitLab, Codeberg, LinuxServer.io, GHCR, Quay, Search.ch) are hidden from the onboarding selection grid but remain available on the manage integrations page. + +::: + +After this step, you finished the onboarding. +The onboarding can no longer be started again. +From here you can click on one of the provided links to continue your journey. +We recommend you to continue with the section [creating your first board on this page](#creating-your-first-board). + +{"Screenshot + +### Importing a ZIP from version before 1.0.0 +This is recommended when you used Homarr before and want to re-import your data. +It is important that you first migrate correctly using [the list of breaking changes for 1.0](/blog/2024/09/23/version-1.0). + +Export from old Homarr + +**How to export and import data** +1. Navigate to your old Homarr, open your management pages, open the tools submenu and open ``Migrate to 1.0``. +2. Check the contents that you want to export. We recommend you to export all data. +3. Click on the export data button +4. Save the ZIP file, that is being downloaded, on your device. If you selected "integrations" or "users", you also get an encryption / decryption key. +Copy it and do not loose it! +5. Go to your new >1.0.0 Homarr instance and start the onboarding. Choose ``Import from Homarr before 1.0`` +6. Drag and drop your previously downloaded ZIP archive into the file upload:
+7. Next, choose the data that you want to import and how to import it. Since screen sizes were removed in 1.0, we create a new board for every screen size by default. We recommend you to only keep the best layout and adjust it later in 1.0.0 - but you can also import all of them and pick later.
+8. If you previously exported integrations or users, you will be asked to decrypt the data safely using your obtained encryption token. Paste into the modal and confirm your action.
+9. Next, you can [follow the same setup as when starting from scratch](#starting-from-scratch). After you completed the onboarding, all of your data will be migrated and available. + +## Creating your first board +In Homarr, you organize your apps and widgets on boards. +Boards can be organized using the interactive drag and drop. +Let's create your first board by navigating here: ``Manage`` > ``Boards`` > ``New board``: +![](./img/manage-create-board-button.png) + +A board must always have a name and can either be public or private. +Public boards are also accessible for users, that are not logged in ([see access control for boards](/docs/management/boards/#access-control)). + +![](./img/manage-create-board-modal.png) + +Congratulations - you've just created your first board. You can see boards, that you have access to, on this page: + +![](./img/manage-view-board.png) + +## Add your first app to Homarr +To add links to your dashboard, you must first add them as an "app". +Navigate to this page to add an app: + +![](./img/manage-navigate-apps.png) + +Next, click on the ``New app`` button. You'll need to provide a name and an icon to create an app. +The name must be at least one character long but you can provide any image URL for the icon. +Homarr ships with over 11K icons - so you can just search by entering a search text instead. + +![](./img/manage-add-app-form.png) + +After you created the app, you'll see in on the apps page: + +![](./img/manage-created-app.png) + +## Arrange and organize your board +Let's add your freshly created app, from the previous step, to the board. +To do this, edit your previously created board by clicking on the big ``Open board`` button: + +![](./img/manage-view-board.png) + +Here you have the following options in the header: + +![](./img/manage-board-header.png) + +- **Search**: Here you can search for data. You can search for integrations, boards, actions, sites and much more. Some actions may be context dependent (eg. will only show when certain widgets are on your page) +- **Edit mode**: Clicking this button will toggle the edit mode. In this mode you can edit the contents of your board. +- **Settings**: Clicking this button will redirect you to a settings page where you can adjust the board settings (page title, colors, ...). +- **Profile**: This avatar will be visible on every page. Clicking it will show a menu with actions. + +When entering the edit mode, you'll get some additional buttons to work with: + +{"Screenshot + +- **Add item**: Click this button to add new elements to your page. +- **Exit edit mode**: Click this btuton to save your changes and exit edit mode. + +To continue, click the option "New Item": + +{"Screenshot + +Next, you can choose what item you'd like to add. +We will discuss the other options in the following sections - for now choose "App" to continue. + +{"Screenshot + +As soon as you chose the app, the modal will close and you'll get the following item on your board: + +Screenshot of the No app element on the board + +This is expected, because you haven't told Homarr what app it should show in this item. +To configure this, click on the small 3 dots at the top of the item in the edit mode and choose "Edit item" in the menu. + +![](./img/manage-board-edit-app.gif) + +In the modal you can edit the app that you want to display: + +![](./img/manage-board-choose-app.png) + +As soon as you save your changes, the tile on the board will refresh and display your app. +Using the small bidirectional arrow at the bottom right you can resize the element. +Start pressing with your mouse button down, move your mouse to resize and release your finger as soon your you're happy with the size. + +![](./img/resize-item.gif) + +To move your item to a different position on the board, simply hold the mouse button anywhere on the item and move with the mouse to the desired position. +As soon as you release your finger, the item will snap in place in the grid. + +![](./img/move-item.gif) + +:::note + +You cannot move items freely on the vertical axis. +We always align all items to the top of the page to simply organization. +To move items to the bottom, you must add more items or resize items. + +::: + +:::tip + +We recommend you to experiment for a few minutes, before you start building your actual dashboard. +This helps you to explore the capabilities of Homarr before you build your board in a suboptimal way. + +::: + +Users on touch or mobile devices may not be able to drag and drop or move items. +They can use the "Move / resize item" option in the edit menu of items instead: + +![](./img/manage-board-move-resize-item-menu.png) + +Be sure to save your changes by exiting edit mode! + +![](./img/exit-edit-mode.png) + +## Adding your first integration +Now it's time to integrate some basic data into your board. +To do this, we first need to create an integration. +An integration is a connection between Homarr and a third party application - usually something that you run and deploy yourself. + +Navigate to ``Manage`` > ``Integrations`` (for example via your user menu). +As an example, we are going to use the public demo instance of **Dash.** - a popular application to monitor CPU / hardware usage. +Choose the **Dash.** integration from the list of available integrations: + +![](./img/choose-integration.gif) + +Next, choose a name (or leave it at default), enter ``https://dash.mauz.dev/`` as the URL in the form and click on ``Test connection and create``. +Pressing the save button will perform a test request to the integration, to confirm that the networking setup is working as expected. +Sometimes invalid configurations, firewalls and other mistakes can lead to connectivity problems - [follow this guide here](/docs/management/integrations/#troubleshooting-connection) if you experience issues. + +If connection was successful, you will be redirect back to the list of integrations. +Now let's embed it to your board (see next section). + +:::note + +Some integrations may require additional configuration, such as a username, password or API tokens. +Depending on your networking setup and applications, the connection from Homarr might also get blocked by firewalls, +the target application or your router. + +::: + +## Embed integration data using widgets +Let's add your integration, that you have configured in the section above, as a widget to your board. +First, navigate back to your board that you want to add it to. +Next, enter edit mode again and add another item to your board: + +![](./img/manage-board-header-add-item-menu.png) + +Instead of choosing an app, let's choose ``System Health Monitoring`` this time. +Click on "Add to board": + +![](./img/manage-board-header-choose-system-health.png) + +Resize the item slightly and then edit it using the three dots menu at the top: + +![](./img/edit-system-health-widget.gif) + +Next, choose your newly created Dash. integration in the integrations dropdown: + +![](./img/manage-board-edit-system-health.png) + +:::note + +Some widgets may support multiple integrations at the same time. +If they do not support multiple integrations, you will be unable to select more than one. + +::: + +Confirm your changes by pressing save. +Editing a widget will trigger a data update and data will soon appear: + +![](./img/widget-system-health.png) + +As with every change, don't forget to save your changes using the exit edit mode button: + +![](./img/exit-edit-mode.png) + +## Grouping your items +As the last step, let's organize your freshly created items using two different options. +You can choose either or both of them on your boards. + +### Using dynamic sections +Dynamic sections are a simple, resizable visual group to group items. + +![](./img/create-dynamic-section.png) + +After adding a dynamic section, you can simply drag and drop items into the section: + +![](./img/dynamic-section.gif) + +### Using categories +Categories are more advanced and complicated than dynamic sections. +To create a category, open the add item modal and choose "new category": + +![](./img/add-category.png) + +Every category must have a name. After you click "Add category", you will get a new item on your board: + +![](./img/category.gif) + +You can drag and drop items in to this category in the edit mode. +Categories will have a big space before and after them in the edit mode to +enable you to drag and drop items outside the category. +You can also collapse or open categories in edit mode to facilitate your editing process. + +:::note + +A current limitation of categories is, that they will always have a width of 100%. +You cannot reduce their horizontal width. + +::: + +## Guided tours + +After completing the onboarding, Homarr provides interactive guided tours to help you discover key features. + +### Management tour +When you first visit the management area (`/manage`), Homarr walks you through the main pages: boards, apps, integrations, and users (admin only). +Each page highlights the list view and the create action so you know where to find and add things. + +### Board tour +When you first open a board, a tour highlights the board header elements: search, edit mode, settings, board switcher, and user menu. + +### Tour controls +- Press **Enter** (or click **Next**) to advance through tour steps +- Tours auto-start on first visit and do not repeat once completed +- Tours are skipped on mobile screens (below `sm` breakpoint) +- You can **reset tours** from the user settings page under **Manage > Users > [Your user] > General** + +## Next steps +You're done with the basic setup 🔥. Now it's time to organize and customize even more. +We highly recommend you to experiment with different options, styles and configurations. +See these curated pages for your next steps: +- Create new apps using the [apps management](../management/apps/) +- Customize your board or add more boards using the [boards management](../management/boards/) +- Integrate software that you use using the [integrations management](../management/integrations) +- Choose from our beautiful and interactive [widgets](/docs/category/widgets) +- See [all supported integrations](/docs/category/integrations) +- Integrate with Homarr with your own application using [the API](../management/api/) + +:::danger + +The Homarr Team will never ask for your credentials. Do not send people your credentials, as they manage the access to your applications and can cause harm to your device if they are abused. + +::: diff --git a/apps/docs/docs/getting-started/glossary.mdx b/apps/docs/docs/getting-started/glossary.mdx new file mode 100644 index 000000000..8d690245c --- /dev/null +++ b/apps/docs/docs/getting-started/glossary.mdx @@ -0,0 +1,12 @@ +# Glossary +In the glossary, you'll learn the different components and their names of Homarr. + +| Term | Definition | +|-----------------|----------------------------------------------------------------------------------------------------------------| +| Apps | An piece of software that you or a third party hosts (eg. Google) | +| Integration | A connection to a service outside of Homarr | +| Dynamic section | Resizeable area where items on your board can be placed and grouped | +| Widget | A tile that uses your integrations to display data or enables you to interact with with them | +| Edit mode | Temporary state that you can enter where you can drag and drop, edit or customize your board | +| Board | Customizable page which can be edited using the edit mode. This is where apps, sections and widgets are placed | +| Tasks | Workloads that are performed in the background - even if there is no user present | diff --git a/apps/docs/docs/getting-started/img/add-category.png b/apps/docs/docs/getting-started/img/add-category.png new file mode 100644 index 000000000..5dc813771 Binary files /dev/null and b/apps/docs/docs/getting-started/img/add-category.png differ diff --git a/apps/docs/docs/getting-started/img/app-general-tab.png b/apps/docs/docs/getting-started/img/app-general-tab.png new file mode 100644 index 000000000..fe873917d Binary files /dev/null and b/apps/docs/docs/getting-started/img/app-general-tab.png differ diff --git a/apps/docs/docs/getting-started/img/app-no-title.webp b/apps/docs/docs/getting-started/img/app-no-title.webp new file mode 100644 index 000000000..e1de4fd3a Binary files /dev/null and b/apps/docs/docs/getting-started/img/app-no-title.webp differ diff --git a/apps/docs/docs/getting-started/img/app-title-bottom.webp b/apps/docs/docs/getting-started/img/app-title-bottom.webp new file mode 100644 index 000000000..20a69c50e Binary files /dev/null and b/apps/docs/docs/getting-started/img/app-title-bottom.webp differ diff --git a/apps/docs/docs/getting-started/img/app-title-hover.webp b/apps/docs/docs/getting-started/img/app-title-hover.webp new file mode 100644 index 000000000..0ee1177b1 Binary files /dev/null and b/apps/docs/docs/getting-started/img/app-title-hover.webp differ diff --git a/apps/docs/docs/getting-started/img/app-title-left.webp b/apps/docs/docs/getting-started/img/app-title-left.webp new file mode 100644 index 000000000..84f625222 Binary files /dev/null and b/apps/docs/docs/getting-started/img/app-title-left.webp differ diff --git a/apps/docs/docs/getting-started/img/app-title-right.webp b/apps/docs/docs/getting-started/img/app-title-right.webp new file mode 100644 index 000000000..6523a8b5c Binary files /dev/null and b/apps/docs/docs/getting-started/img/app-title-right.webp differ diff --git a/apps/docs/docs/getting-started/img/app-title-top.webp b/apps/docs/docs/getting-started/img/app-title-top.webp new file mode 100644 index 000000000..ddc15bcb6 Binary files /dev/null and b/apps/docs/docs/getting-started/img/app-title-top.webp differ diff --git a/apps/docs/docs/getting-started/img/appearance-tab.webp b/apps/docs/docs/getting-started/img/appearance-tab.webp new file mode 100644 index 000000000..0bfb71901 Binary files /dev/null and b/apps/docs/docs/getting-started/img/appearance-tab.webp differ diff --git a/apps/docs/docs/getting-started/img/behavior-tab.webp b/apps/docs/docs/getting-started/img/behavior-tab.webp new file mode 100644 index 000000000..3537f785c Binary files /dev/null and b/apps/docs/docs/getting-started/img/behavior-tab.webp differ diff --git a/apps/docs/docs/getting-started/img/category-menu.webp b/apps/docs/docs/getting-started/img/category-menu.webp new file mode 100644 index 000000000..11045a7ad Binary files /dev/null and b/apps/docs/docs/getting-started/img/category-menu.webp differ diff --git a/apps/docs/docs/getting-started/img/category.gif b/apps/docs/docs/getting-started/img/category.gif new file mode 100644 index 000000000..6b9837b3f Binary files /dev/null and b/apps/docs/docs/getting-started/img/category.gif differ diff --git a/apps/docs/docs/getting-started/img/choose-integration.gif b/apps/docs/docs/getting-started/img/choose-integration.gif new file mode 100644 index 000000000..fc8c6ae0c Binary files /dev/null and b/apps/docs/docs/getting-started/img/choose-integration.gif differ diff --git a/apps/docs/docs/getting-started/img/create-dynamic-section.png b/apps/docs/docs/getting-started/img/create-dynamic-section.png new file mode 100644 index 000000000..cb49979df Binary files /dev/null and b/apps/docs/docs/getting-started/img/create-dynamic-section.png differ diff --git a/apps/docs/docs/getting-started/img/description-hover-example.webp b/apps/docs/docs/getting-started/img/description-hover-example.webp new file mode 100644 index 000000000..0ae270bc9 Binary files /dev/null and b/apps/docs/docs/getting-started/img/description-hover-example.webp differ diff --git a/apps/docs/docs/getting-started/img/dynamic-section.gif b/apps/docs/docs/getting-started/img/dynamic-section.gif new file mode 100644 index 000000000..b6e0bb4bd Binary files /dev/null and b/apps/docs/docs/getting-started/img/dynamic-section.gif differ diff --git a/apps/docs/docs/getting-started/img/edit-mode.webp b/apps/docs/docs/getting-started/img/edit-mode.webp new file mode 100644 index 000000000..3271e7673 Binary files /dev/null and b/apps/docs/docs/getting-started/img/edit-mode.webp differ diff --git a/apps/docs/docs/getting-started/img/edit-system-health-widget.gif b/apps/docs/docs/getting-started/img/edit-system-health-widget.gif new file mode 100644 index 000000000..5687af895 Binary files /dev/null and b/apps/docs/docs/getting-started/img/edit-system-health-widget.gif differ diff --git a/apps/docs/docs/getting-started/img/exit-edit-mode.png b/apps/docs/docs/getting-started/img/exit-edit-mode.png new file mode 100644 index 000000000..13045c751 Binary files /dev/null and b/apps/docs/docs/getting-started/img/exit-edit-mode.png differ diff --git a/apps/docs/docs/getting-started/img/integration-secrets.webp b/apps/docs/docs/getting-started/img/integration-secrets.webp new file mode 100644 index 000000000..0f7254daf Binary files /dev/null and b/apps/docs/docs/getting-started/img/integration-secrets.webp differ diff --git a/apps/docs/docs/getting-started/img/manage-add-app-form.png b/apps/docs/docs/getting-started/img/manage-add-app-form.png new file mode 100644 index 000000000..9b44dde1c Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-add-app-form.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-choose-app.png b/apps/docs/docs/getting-started/img/manage-board-choose-app.png new file mode 100644 index 000000000..ce777c42e Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-choose-app.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-edit-app.gif b/apps/docs/docs/getting-started/img/manage-board-edit-app.gif new file mode 100644 index 000000000..6463141b8 Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-edit-app.gif differ diff --git a/apps/docs/docs/getting-started/img/manage-board-edit-system-health.png b/apps/docs/docs/getting-started/img/manage-board-edit-system-health.png new file mode 100644 index 000000000..71650a5a2 Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-edit-system-health.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-header-add-item-menu.png b/apps/docs/docs/getting-started/img/manage-board-header-add-item-menu.png new file mode 100644 index 000000000..47b2d0bdf Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-header-add-item-menu.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-header-choose-item.png b/apps/docs/docs/getting-started/img/manage-board-header-choose-item.png new file mode 100644 index 000000000..f2d445e9f Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-header-choose-item.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-header-choose-system-health.png b/apps/docs/docs/getting-started/img/manage-board-header-choose-system-health.png new file mode 100644 index 000000000..b83e3cd46 Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-header-choose-system-health.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-header-edit-mode.png b/apps/docs/docs/getting-started/img/manage-board-header-edit-mode.png new file mode 100644 index 000000000..297cd13f6 Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-header-edit-mode.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-header.png b/apps/docs/docs/getting-started/img/manage-board-header.png new file mode 100644 index 000000000..2229b80dd Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-header.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-move-resize-item-menu.png b/apps/docs/docs/getting-started/img/manage-board-move-resize-item-menu.png new file mode 100644 index 000000000..2bf8a46b6 Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-move-resize-item-menu.png differ diff --git a/apps/docs/docs/getting-started/img/manage-board-no-app.png b/apps/docs/docs/getting-started/img/manage-board-no-app.png new file mode 100644 index 000000000..9b097befa Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-board-no-app.png differ diff --git a/apps/docs/docs/getting-started/img/manage-create-board-button.png b/apps/docs/docs/getting-started/img/manage-create-board-button.png new file mode 100644 index 000000000..8f4e1efd6 Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-create-board-button.png differ diff --git a/apps/docs/docs/getting-started/img/manage-create-board-modal.png b/apps/docs/docs/getting-started/img/manage-create-board-modal.png new file mode 100644 index 000000000..97ec9795c Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-create-board-modal.png differ diff --git a/apps/docs/docs/getting-started/img/manage-created-app.png b/apps/docs/docs/getting-started/img/manage-created-app.png new file mode 100644 index 000000000..6fb72fad1 Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-created-app.png differ diff --git a/apps/docs/docs/getting-started/img/manage-navigate-apps.png b/apps/docs/docs/getting-started/img/manage-navigate-apps.png new file mode 100644 index 000000000..a290aa4e6 Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-navigate-apps.png differ diff --git a/apps/docs/docs/getting-started/img/manage-view-board.png b/apps/docs/docs/getting-started/img/manage-view-board.png new file mode 100644 index 000000000..5fc63c57d Binary files /dev/null and b/apps/docs/docs/getting-started/img/manage-view-board.png differ diff --git a/apps/docs/docs/getting-started/img/move-item.gif b/apps/docs/docs/getting-started/img/move-item.gif new file mode 100644 index 000000000..22c864105 Binary files /dev/null and b/apps/docs/docs/getting-started/img/move-item.gif differ diff --git a/apps/docs/docs/getting-started/img/old-homarr-export-data.png b/apps/docs/docs/getting-started/img/old-homarr-export-data.png new file mode 100644 index 000000000..2cd32d952 Binary files /dev/null and b/apps/docs/docs/getting-started/img/old-homarr-export-data.png differ diff --git a/apps/docs/docs/getting-started/img/old-homarr-import-choose-imported-data.png b/apps/docs/docs/getting-started/img/old-homarr-import-choose-imported-data.png new file mode 100644 index 000000000..d0d2de39c Binary files /dev/null and b/apps/docs/docs/getting-started/img/old-homarr-import-choose-imported-data.png differ diff --git a/apps/docs/docs/getting-started/img/old-homarr-import-decryption-token.png b/apps/docs/docs/getting-started/img/old-homarr-import-decryption-token.png new file mode 100644 index 000000000..4ff3ecd32 Binary files /dev/null and b/apps/docs/docs/getting-started/img/old-homarr-import-decryption-token.png differ diff --git a/apps/docs/docs/getting-started/img/old-homarr-import-dropzone.png b/apps/docs/docs/getting-started/img/old-homarr-import-dropzone.png new file mode 100644 index 000000000..1c0c3da62 Binary files /dev/null and b/apps/docs/docs/getting-started/img/old-homarr-import-dropzone.png differ diff --git a/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-admin-user.png b/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-admin-user.png new file mode 100644 index 000000000..0453eed20 Binary files /dev/null and b/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-admin-user.png differ diff --git a/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-external-admin-group.png b/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-external-admin-group.png new file mode 100644 index 000000000..8ee7800fe Binary files /dev/null and b/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-external-admin-group.png differ diff --git a/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-finish.png b/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-finish.png new file mode 100644 index 000000000..08b3586a1 Binary files /dev/null and b/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-finish.png differ diff --git a/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-server-settings.png b/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-server-settings.png new file mode 100644 index 000000000..c2d537e9a Binary files /dev/null and b/apps/docs/docs/getting-started/img/onboarding-from-scratch-step-server-settings.png differ diff --git a/apps/docs/docs/getting-started/img/onboarding-step-1.png b/apps/docs/docs/getting-started/img/onboarding-step-1.png new file mode 100644 index 000000000..715a62c75 Binary files /dev/null and b/apps/docs/docs/getting-started/img/onboarding-step-1.png differ diff --git a/apps/docs/docs/getting-started/img/resize-item.gif b/apps/docs/docs/getting-started/img/resize-item.gif new file mode 100644 index 000000000..e2f3b5ce0 Binary files /dev/null and b/apps/docs/docs/getting-started/img/resize-item.gif differ diff --git a/apps/docs/docs/getting-started/img/widget-system-health.png b/apps/docs/docs/getting-started/img/widget-system-health.png new file mode 100644 index 000000000..201a040a4 Binary files /dev/null and b/apps/docs/docs/getting-started/img/widget-system-health.png differ diff --git a/apps/docs/docs/getting-started/index.mdx b/apps/docs/docs/getting-started/index.mdx new file mode 100644 index 000000000..4dc986658 --- /dev/null +++ b/apps/docs/docs/getting-started/index.mdx @@ -0,0 +1,44 @@ +--- +title: Prerequisites +sidebar_position: 1 +tags: + - Getting Started + - Installation + - Docker + - Unraid +--- + +import Link from '@docusaurus/Link'; +import { IconArrowRight } from '@tabler/icons-react'; + +Before you try to install Homarr, please review if your device meets the requirements. +Installing on an unsupported device may lead to unstable behaviour and no support will be provided. + +## Hardware +- At least 500MB RAM +- At least 600MB of free disk space for the Docker image. SSD is preferred. +- Single or dual core CPU +- Stable network connection, Wi-Fi use is not recommended + +## Architecture + +We build Homarr for a bunch of different architectures, including ARM. Please ensure that your device architecture is supported by Homarr. We won't be able to provide support for unusual or outdated architectures. + +| Architecture | Supported | +|--------------|-----------------| +| linux/amd64 | ✅ Supported | +| linux/arm64 | ✅ Supported | +| linux/arm/v7 | ❌ Not supported | + +## Getting started with installation + + +
+ Go to Installation + +
+ diff --git a/apps/docs/docs/getting-started/installation/_category_.json b/apps/docs/docs/getting-started/installation/_category_.json new file mode 100644 index 000000000..ee30498ee --- /dev/null +++ b/apps/docs/docs/getting-started/installation/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Installation", + "position": 1, + "collapsed": true, + "link": { + "type": "generated-index", + "title": "Getting started" + } +} diff --git a/apps/docs/docs/getting-started/installation/docker.mdx b/apps/docs/docs/getting-started/installation/docker.mdx new file mode 100644 index 000000000..956a6c2d6 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/docker.mdx @@ -0,0 +1,105 @@ +import { DockerInstallSnippet } from '@site/src/components/pages/installation/docker/dynamic-docker-install' + +# Docker +Docker is our recommended installation method for beginners and professionals. +It is easy to use, ships with all dependencies inside a single container and is easy to use and maintain. +It requires at least some basic knowledge of [Docker](https://www.docker.com/). +We recommend [NetworkChuck's Docker Containers 101](https://www.youtube.com/watch?v=eGz9DS-aIeY) as a good start for complete beginners. + +## Docker compose +### Prerequisites + +- A Linux or Windows based system that meets the [hardware prerequisites](/docs/getting-started/#hardware) and [architecture prerequisites](/docs/getting-started/#architecture). +- [Docker](https://docs.docker.com/get-docker/) +- [Docker Compose](https://docs.docker.com/compose/install/) - *preinstalled on many systems nowadays* + +### Installation + + +Finally, run ``docker compose up -d`` in the same directory. This will start the Homarr container in the background. + +:::caution + +Docker compose creates a network by default. Some integrations may not work (specifically Dash.) when the network internal hostname is used since clients do not know this name. It is recommended that you either use a local network wide hostname or the IP directly. An alternative is to create a DNS record with the same internal compose stack hostname for all clients outside. + +::: + +### Updating + +To update, navigate to the directory with the ``docker-compose.yaml`` located. + +- Stop Homarr using ``docker compose down`` +- Pull the newest image of Homarr using ``docker compose pull`` +- Start Homarr again using ``docker compose up -d`` (``-d`` for detached mode - start in background) +- Delete the old image using ``docker image prune`` (*Warning: this also removes you other unused images - not just Homarr*) + +You can automate this process using [Watchtower](https://containrrr.dev/watchtower/). + +### Uninstalling + +To uninstall, navigate to the directory with the ``docker-compose.yaml`` located. + +- Stop Homarr using ``docker compose down`` +- Delete the created directories & files on your root file system (check ``docker-compose.yaml`` file for your specific locations) +- Delete compose file using ``rm docker-compose.yaml`` +- Prune unused Docker images using ``docker image prune`` (*Warning: this also removes you other unused images - not just Homarr*) +- (Optional): Prune any network or volumes if you use any. +- (Optional): Remove Homarr from your reverse proxy, VPNs or tunnels if you use any. + + +## Docker standalone + +:::caution + +[Docker Compose](#docker-compose) is easier and recommended for beginners. Consider using compose instead. + +::: + +### Prerequisites + +- A Linux or Windows based system that meets the [hardware prerequisites](/docs/getting-started/#hardware) and [architecture prerequisites](/docs/getting-started/#architecture). +- [Docker](https://docs.docker.com/get-docker/) + +### Installation + +To install Homarr using Docker, simply run the following command. + +```bash +docker run \ + --name homarr \ + --restart unless-stopped \ + -p 7575:7575 \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /homarr/appdata:/appdata \ + -e SECRET_ENCRYPTION_KEY='your_64_character_hex_string' \ + -d ghcr.io/homarr-labs/homarr:latest +``` + +:::note + +Docker will mount the configuration files and icons to your host machine. Please make sure to replace ```` from the docker run command with your desired storage location. The path must be absolute. + +::: + +### Updating +To update Homarr, you must remove your container first. Make sure that you've mounted your data and that you have access to it, so your configuration doesn't get lost. + +1. Run ``docker rm homarr`` to remove the container. +2. Pull the latest Homarr image ``docker pull ghcr.io/homarr-labs/homarr:latest``. +3. Re-run the command you used to install Homarr. + +This process can get tideous, if you update frequently. Thus, we recommend [using docker-compose](#docker-compose) + +:::tip + +Want to update all your containers automatically? Checkout [Watchtower](https://containrrr.dev/watchtower/) a service which will automatically update your containers on a set interval. + +::: + +### Uninstalling + +1. Obtain the container ID of your Homarr container using ``docker ps | grep homarr``. +2. Delete the container using ``docker rm `` +3. Prune unused Docker images using ``docker image prune`` (*Warning: this also removes you other unused images - not just Homarr*) +4. (Optional): Prune any network or volumes if you use any. +5. (Optional): Remove Homarr from your reverse proxy, VPNs or tunnels if you use any. diff --git a/apps/docs/docs/getting-started/installation/easy-panel.mdx b/apps/docs/docs/getting-started/installation/easy-panel.mdx new file mode 100644 index 000000000..adb30ec0c --- /dev/null +++ b/apps/docs/docs/getting-started/installation/easy-panel.mdx @@ -0,0 +1,9 @@ +# EasyPanel + +:::caution +Easypanel has not updated to 1.0 yet. There template is still on 0.15.4. +::: + +Easypanel is a modern server control panel. If you [run Easypanel](https://easypanel.io/docs) on your server, you can deploy Homarr with 1 click on it. + +[![Deploy to Easypanel](https://easypanel.io/img/deploy-on-easypanel-40.svg)](https://easypanel.io/docs/templates/homarr) diff --git a/apps/docs/docs/getting-started/installation/helm.md b/apps/docs/docs/getting-started/installation/helm.md new file mode 100644 index 000000000..643f02632 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/helm.md @@ -0,0 +1,484 @@ +# Helm + +homarr logo + +![Version: 8.19.0](https://img.shields.io/badge/Version-8.19.0-informational?style=flat) +![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat) +![AppVersion: v1.60.0](https://img.shields.io/badge/AppVersion-v1.60.0-informational?style=flat) + +A Helm chart to deploy homarr for Kubernetes + +**Homepage:** + +## Source Code + +* + +## Requirements + +Kubernetes: `>=1.24.0-0` + +## Dependencies + +This chart has no dependencies. + +## Installing the Chart + +To install the chart with the release name `homarr` + +### OCI (Recommended) + +```console +helm install homarr oci://ghcr.io/homarr-labs/charts/homarr +``` + +### Traditional + +```console +helm repo add homarr-labs https://homarr-labs.github.io/charts/ +helm repo update +helm install homarr homarr-labs/homarr +``` + +## Uninstalling the Chart + +To uninstall the `homarr` deployment + +```console +helm uninstall homarr +``` + +The command removes all the Kubernetes components associated with the chart **including persistent volumes** and deletes the release. + +## Configuration + +Read through the [values.yaml](https://github.com/homarr-labs/charts/blob/dev/charts/homarr/values.yaml) file. It has several commented out suggested values. + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. + +```console +helm install homarr \ + --set env.TZ="America/New York" \ + homarr-labs/homarr +``` + +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. + +```console +helm install homarr homarr-labs/homarr -f values.yaml +``` + +## Custom configuration + +### Secrets + +To avoid including sensitive information in plain text within your version control, consider using a declarative approach by applying secrets directly with kubectl apply. For example, instead of including repository credentials in your Helm values, you can leverage a kubernetes secrets manager. + +Below is an exhaustive list of all secrets: + +| FEATURE | SECRET NAME | SECRET KEYS | Required | +|-----------|-------------------------|-----------------------------------------|----------| +| OIDC | auth-oidc-secret | oidc-client-id
oidc-client-secret | No | +| LDAP | auth-ldap-secret | bind-password | No | +| DATABASE | db-secret | db-url | No | +| DATABASE | db-encryption | db-encryption-key | yes | + +### Database + +You have multiple options for configuring the database: + +| DRIVER TYPE | Persistence mode | +|----------------|---------------------------------| +| better-sqlite3 | Pod disk | +| better-sqlite3 | homarr-database PVC | +| mysql2 | External MySql database | +| node-postgres | External Postgresql database | + +#### Pod disk + +No additional configuration is required. However, keep in mind that if the pod restarts, all data will be lost. This setup is not *recommended* for production use. + +To create the necessary database secret, execute the following command: + +
+Required Secrets + +````yaml +kubectl create secret generic db-encryption \ +--from-literal=db-encryption-key='' \ +--namespace homarr +```` + +
+ +#### PVC + +To persist data, you need to enable the `homarr-database` PVC. This will store the Homarr database on a mounted volume. + +Associated secret to create : + +
+DB Required Secrets + +````yaml +kubectl create secret generic db-encryption \ +--from-literal=db-encryption-key='' \ +--namespace homarr +```` + +
+ +Bellow an example of the override value file : + +
+values.yaml + +````yaml +persistence: + homarrDatabase: + enabled: true + storageClassName: "default" + size: "1Gi" +```` + +
+ +#### External MySql database + +To create the necessary database secrets, execute the following command: + +
+Required Secrets + +````yaml +kubectl create secret generic db-encryption \ +--from-literal=db-encryption-key='' \ +--namespace homarr +```` + +````yaml +kubectl create secret generic db-secret \ +--from-literal=db-url='mysql://user:password@host:port/homarrdb' \ +--namespace homarr +```` +
+ +Below is an example of the override values file: + +
+values.yaml + +````yaml +database: + type: mysql +```` +
+ +#### External Postgresql database + +To create the necessary database secrets, execute the following command: + +
+Required Secrets + +````yaml +kubectl create secret generic db-encryption \ +--from-literal=db-encryption-key='' \ +--namespace homarr +```` + +````yaml +kubectl create secret generic db-secret \ +--from-literal=db-url='postgresql://user:password@host:port/homarrdb' \ +--namespace homarr +```` + +
+ +Below is an example of the override values file: + +
+values.yaml + +````yaml +database: + type: postgresql +```` +
+ +### Ingress + +The ingress section in the values.yaml file allows you to configure how external traffic accesses your application through an Ingress resource. This section defines whether Ingress is enabled, the class to use, and how to set up hosts, paths, and TLS for secure connections. + +
+values.yaml + +````yaml +service: + enabled: true # Ensure the service is enabled for Ingress to route traffic +ingress: + enabled: true + ingressClassName: "traefik" + annotations: + # Add any additional annotations as needed + hosts: + - host: homarr.homelab.dev + paths: + - path: / + pathType: ImplementationSpecific + tls: + - hosts: + - "homarr.homelab.dev" + - "www.homarr.homelab.dev" + secretName: homelab-tls +```` +
+ +### HTTPRoute (Gateway API) + +The httproute section in the values.yaml file allows you to configure how external traffic accesses your application using the Kubernetes Gateway API. +This provides a more expressive and future-proof alternative to Ingress, with support for advanced routing, filters, and multiple parent Gateways. + +
+values.yaml + +````yaml +service: + enabled: true # must be enabled for HTTPRoute to forward traffic +httproute: + enabled: true + parentRefs: + - name: my-gateway + namespace: default + hostnames: + - homarr.homelab.dev + rules: + - matches: + - path: + type: PathPrefix + value: / + backendRefs: + - name: homarr + port: 8080 +```` +
+ +#### Notes: + +- parentRefs: the Gateway(s) this route attaches to. Gateways must already exist. +- hostnames: domain names this route applies to. +- rules: each rule can define matches (paths, headers, queries), optional filters, and backendRefs to services +- TLS must be configured on the Gateway (not on HTTPRoute). For example, the Gateway can have a TLS listener for homarr.homelab.dev, and this route will automatically apply once matched. + +### Certificates + +Configuration for trusted certificate persistence. Supports: + +- Declarative config via `configmap` or `secret` +- Pre-existing secret with `existingSecret` + +#### type: configmap + +Use inline certificates to generate a ConfigMap, mounted as individual files. + +
+values.yaml + +````yaml +persistence: + homarrTrustedCerts: + enabled: true + type: configmap + certificates: + cert1.crt: | + -----BEGIN CERTIFICATE----- + MIID...ABCD== + -----END CERTIFICATE----- + cert2.crt: | + -----BEGIN CERTIFICATE----- + MIID...EFGH== + -----END CERTIFICATE----- +```` +
+ +Behavior: + +- Helm creates a ConfigMap with keys cert1.crt and cert2.crt +- Mounts them as /appdata/trusted-certificates/cert1.crt and /appdata/trusted-certificates/cert2.crt + +#### type: secret + +Use inline certificates to generate a Kubernetes Secret, mounted as files. + +
+values.yaml + +````yaml +persistence: + homarrTrustedCerts: + enabled: true + type: secret + certificates: + cert1.crt: | + -----BEGIN CERTIFICATE----- + MIIC...XYZ== + -----END CERTIFICATE----- + cart2.crt: | + -----BEGIN CERTIFICATE----- + MIIC...XYZ== + -----END CERTIFICATE----- +```` +
+ +Behavior: + +- Helm creates a Kubernetes Secret with cert1.crt and cart2.crt keys +- Mounts it into the container + +#### type: existingSecret + +Use an existing Kubernetes Secret, assuming its keys are filenames. + +
+values.yaml + +````yaml +persistence: + homarrTrustedCerts: + enabled: true + type: existingSecret + existingSecretName: "existingSecretName" + existingSecretKeys: + - cert3.crt + - cert4.crt +```` +
+ +Behavior: + +- No new Secret is created +- Uses existingSecretName directly +- Mounts all keys as files in /appdata/trusted-certificates + +#### Summary Table + +| Type | Creates Resource | Requires Certificates | Uses Existing | Mounts As Files | +| ---------------- | ---------------- | --------------------- | ------------- | --------------- | +| `configmap` | ConfigMap | Yes (`certificates`) | ❌ | ✅ | +| `secret` | Secret | Yes (`certificates`) | ❌ | ✅ | +| `existingSecret` | ❌ | ❌ | ✅ | ✅ | + +All available values are listed on the [artifacthub](https://artifacthub.io/packages/helm/homarr-labs/homarr?modal=values). If you find any issue please open an issue on [github](https://github.com/homarr-labs/charts/issues/new?assignees=maintainers&labels=bug&projects=&template=bug_report.yaml) + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| additionalObjects | list | `[]` | Additional resources to deploy. These objects are templated. | +| affinity | object | `{}` | Node affinity for pod scheduling | +| autoscaling.enabled | bool | `false` | Enable autoscaling | +| autoscaling.maxReplicas | int | `100` | Maximum replicas | +| autoscaling.minReplicas | int | `1` | Minimum replicas | +| autoscaling.targetCPUUtilizationPercentage | int | `80` | Target CPU utilization for autoscaling | +| containerPorts | object | `{"http":{"port":7575,"protocol":"TCP"}}` | containerPorts defines the ports to open on the container. It is a map where each entry specifies: - `port` (int) (required): The port number to expose inside the container. - `protocol` (string) (required): The network protocol (TCP or UDP) used for the port. - `disabled` (bool) : Optional flag to disable this port (defaults to false). Can be overridden via Helm values. By default, this configuration exposes TCP port 7575 with the name `http`. | +| database.migrationEnabled | bool | `true` | Database migration configuration. DB_MIGRATIONS_DISABLED Set to `true` to disable database migrations. Migrations are enabled by default (`false`). | +| database.type | string | `"sqlite"` | Database type: sqlite, mysql or postgresql | +| env.AUTH_LDAP_BASE | string | `nil` | Base dn of your LDAP server | +| env.AUTH_LDAP_BIND_DN | string | `nil` | User used for finding users and groups | +| env.AUTH_LDAP_GROUP_CLASS | string | `"groupOfUniqueNames"` | Class used for querying groups | +| env.AUTH_LDAP_GROUP_FILTER_EXTRA_ARG | string | `nil` | Extra arguments for user's groups search filter (& based) | +| env.AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE | string | `"member"` | Attribute used for querying group member | +| env.AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE | string | `"dn"` | User attribute used for comparing with group member | +| env.AUTH_LDAP_SEARCH_SCOPE | string | `"base"` | LDAP search scope between base, one or sub | +| env.AUTH_LDAP_URI | string | `nil` | URI of your LDAP server | +| env.AUTH_LDAP_USERNAME_ATTRIBUTE | string | `"uid"` | Attribute used for username | +| env.AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG | string | `nil` | Extra arguments for user search filter (& based) | +| env.AUTH_LDAP_USER_MAIL_ATTRIBUTE | string | `"mail"` | Attribute used for mail field | +| env.AUTH_LOGOUT_REDIRECT_URL | string | `nil` | URL to redirect to after clicking logging out. | +| env.AUTH_OIDC_AUTO_LOGIN | string | `"false"` | Automatically redirect to OIDC login | +| env.AUTH_OIDC_CLIENT_NAME | string | `"OIDC"` | Display name of provider (in login screen) | +| env.AUTH_OIDC_GROUPS_ATTRIBUTE | string | `"groups"` | Attribute used for groups (roles) claim | +| env.AUTH_OIDC_ISSUER | string | `nil` | Issuer URI of OIDC provider without trailing slash (/) | +| env.AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE | string | `nil` | Overwrite name attribute. By default, it will use preferred_username if it does not contain a @ and otherwise name. | +| env.AUTH_OIDC_SCOPE_OVERWRITE | string | `"openid email profile groups"` | Override the OIDC scopes | +| env.AUTH_PROVIDERS | string | `"credentials"` | Enabled authentication methods. Multiple providers can be enabled with by separating them with , (ex. AUTH_PROVIDERS=credentials,oidc, it is highly recommended to just enable one provider). | +| env.AUTH_SESSION_EXPIRY_TIME | string | `"30d"` | Time for the session to time out. Can be set as pure number, which will automatically be used in seconds, or followed by s, m, h or d for seconds, minutes, hours or days. (ex: "30m") | +| env.ENABLE_DNS_CACHING | string | `"false"` | Enables dns caching. This is not yet working for all users. See #4006 | +| env.LOG_LEVEL | string | `"info"` | Log level to use. Possible values: debug/info/warn/error | +| env.NO_EXTERNAL_CONNECTION | string | `"false"` | Disables some requests that need internet connection | +| env.TZ | string | `"Europe/Paris"` | Your local time zone | +| envSecrets.authLdapCredentials.existingSecret | string | `"auth-ldap-secret"` | Name of existing secret containing LDAP credentials | +| envSecrets.authLdapCredentials.ldapBindingPassword | string | `"bind-password"` | Password for bind user secret key | +| envSecrets.authOidcCredentials.existingSecret | string | `"auth-oidc-secret"` | Name of existing secret containing OIDC credentials | +| envSecrets.authOidcCredentials.oidcClientId | string | `"oidc-client-id"` | ID of OIDC client (application) secret key | +| envSecrets.authOidcCredentials.oidcClientSecret | string | `"oidc-client-secret"` | Secret of OIDC client (application) secret key | +| envSecrets.dbCredentials.dbUrlKey | string | `"db-url"` | Secret key for DB_URL Example for external database: `mysql://username:password@host:port/homarrdb` or `postgresql://username:password@host:port/homarrdb` | +| envSecrets.dbCredentials.existingSecret | string | `"db-secret"` | Name of existing secret containing DB credentials | +| envSecrets.dbEncryption.existingSecret | string | `"db-encryption"` | Name of existing secret containing DB encryption | +| envSecrets.dbEncryption.key | string | `"db-encryption-key"` | Secret key for SECRET_ENCRYPTION_KEY can be generated with `openssl rand -hex 32` | +| fullnameOverride | string | `""` | Overrides chart's fullname | +| hostAliases | list | `[]` | Add static entries to /etc/hosts in the Pod. This is useful in the following cases: - You are running in a dual-stack cluster (IPv4 + IPv6) and want to force usage of IPv4 for specific hostnames - Your application is having DNS resolution issues or IPv6 preference issues - You need to override or simulate DNS entries without changing global DNS - You are running in an air-gapped or isolated environment without external DNS Example: hostAliases: - ip: "192.168.1.10" hostnames: - "example.com" - "example.internal" | +| httproute | object | `{"enabled":false,"hostnames":["chart-example.local"],"parentRefs":[{"name":"my-gateway","namespace":"default"}],"rules":[{"backendRefs":[{"name":"homarr","port":8080}],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]}` | Gateway API HTTPRoute configuration | +| httproute.enabled | bool | `false` | Enable HTTPRoute | +| httproute.hostnames | list | `["chart-example.local"]` | Hostnames this route matches (similar to ingress.hosts.host) | +| httproute.parentRefs | list | `[{"name":"my-gateway","namespace":"default"}]` | References to the parent Gateway(s) this route attaches to. Each item must include at least a `name`, and optionally a `namespace`. | +| httproute.rules | list | `[{"backendRefs":[{"name":"homarr","port":8080}],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]` | List of routing rules. Each rule can include: - matches: path/header/query matching - filters: optional transformations (redirects, header modifications, etc.) - backendRefs: one or more Kubernetes Services to forward traffic to | +| httproute.rules[0].filters | list | `[]` | Optional filters for this rule (default: empty) | +| httproute.rules[0].matches[0].path.type | string | `"PathPrefix"` | Path match type. One of: Exact, PathPrefix, RegularExpression | +| httproute.rules[0].matches[0].path.value | string | `"/"` | Path value to match | +| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | +| image.repository | string | `"ghcr.io/homarr-labs/homarr"` | Image repository | +| image.tag | string | `"v1.60.0"` | Overrides the image tag whose default is the chart appVersion | +| imagePullSecrets | list | `[]` | Secrets for Docker registry | +| ingress.annotations | object | `{}` | Ingress annotations | +| ingress.enabled | bool | `false` | Enable ingress | +| ingress.hosts | list | `[{"host":"chart-example.local","paths":[{"path":"/"}]}]` | Ingress hosts configuration | +| ingress.ingressClassName | string | `""` | Ingress class name | +| ingress.tls | list | `[]` | Ingress TLS configuration | +| livenessProbe.failureThreshold | int | `3` | Failure threshold for liveness probe - number of consecutive failures before pod is restarted | +| livenessProbe.httpGet.path | string | `"/api/health/live"` | This is the liveness check endpoint used by Kubernetes to determine if the application is still running. | +| livenessProbe.httpGet.port | int | `7575` | The port on which the liveness check will be performed. This must be the same as the container port exposed by the application. | +| livenessProbe.initialDelaySeconds | int | `10` | Initial delay in seconds before the liveness probe starts | +| livenessProbe.periodSeconds | int | `10` | Period in seconds between liveness probe checks | +| livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds for each liveness probe check | +| nameOverride | string | `""` | Overrides chart's name | +| nodeSelector | object | `{}` | Node selectors for pod scheduling | +| persistence.homarrDatabase.accessMode | string | `"ReadWriteOnce"` | homarr-database access mode | +| persistence.homarrDatabase.enabled | bool | `false` | Enable homarr-database persistent storage | +| persistence.homarrDatabase.mountPath | string | `"/appdata"` | homarr-database mount path inside the pod | +| persistence.homarrDatabase.name | string | `"homarr-database"` | homarr-database persistent storage name | +| persistence.homarrDatabase.size | string | `"50Mi"` | homarr-database storage size | +| persistence.homarrDatabase.storageClassName | string | `"local-path"` | homarr-database storage class name | +| persistence.homarrDatabase.volumeClaimName | string | `""` | homarr-database optional volumeClaimName to target specific PV | +| persistence.homarrTrustedCerts.certificates | string | `nil` | homarr-trusted-certificates certificates, each entry will become a new trusted certificate as a dedicated file (works only for "configmap" and "secret" mode) | +| persistence.homarrTrustedCerts.enabled | bool | `false` | Enable trusted certificates persistence | +| persistence.homarrTrustedCerts.existingSecretKeys | string | `nil` | List of keys (filenames) to mount from the existing secret (used only when type is "existingSecret") | +| persistence.homarrTrustedCerts.existingSecretName | string | `""` | Name of the existing Kubernetes Secret to mount (required if type is "existingSecret") | +| persistence.homarrTrustedCerts.mountPath | string | `"/appdata/trusted-certificates"` | homarr-trusted-certificates mount path inside the pod | +| persistence.homarrTrustedCerts.type | string | `"configmap"` | Persistence mode can be : configmap (declarative), secret (declarative) or existingSecret (mount an existing Kubernetes Secret by name and specify which keys to mount as files) | +| podAnnotations | object | `{}` | Pod annotations | +| podLabels | object | `{}` | Pod labels | +| podSecurityContext | object | `{}` | Pod security context | +| rbac | object | `{"enabled":false}` | Enable RBAC resources for Kubernetes integration Creates Role, ClusterRole, and associated bindings for Homarr's Kubernetes features | +| rbac.enabled | bool | `false` | Enable to create RBAC resources and activate Kubernetes integration | +| readinessProbe.failureThreshold | int | `3` | Failure threshold for readiness probe - number of consecutive failures before pod is considered unready | +| readinessProbe.httpGet.path | string | `"/api/health/ready"` | This is the readiness check endpoint used by Kubernetes to determine if the application is ready to handle traffic. | +| readinessProbe.httpGet.port | int | `7575` | The port on which the readiness check will be performed. This must match the container's exposed port. | +| readinessProbe.initialDelaySeconds | int | `10` | Initial delay in seconds before the readiness probe starts. increase this value if the pod is slow to fully start. | +| readinessProbe.periodSeconds | int | `10` | Period in seconds between readiness probe checks | +| readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds for each readiness probe check | +| replicaCount | int | `1` | Number of replicas | +| resources | object | `{}` | Resource configuration | +| securityContext | object | `{}` | Security context | +| service.enabled | bool | `true` | Enable service | +| service.ipFamilies | list | `[]` | List of IP families to use for the service. Examples: - ["IPv4"] - ["IPv6"] - ["IPv4", "IPv6"] for dual-stack Leave empty to use cluster default behavior | +| service.ipFamilyPolicy | string | `"SingleStack"` | Defines how the service assigns IP families (IPv4/IPv6) Possible values: - SingleStack (default): Only one IP family, usually IPv4 - PreferDualStack: Use dual-stack if the cluster supports it, fallback to single - RequireDualStack: Fail if dual-stack cannot be assigned | +| service.ports.app.port | int | `7575` | Service port | +| service.ports.app.protocol | string | `"TCP"` | Service protocol | +| service.ports.app.targetPort | string | `"http"` | Service target port | +| service.type | string | `"ClusterIP"` | Service type | +| strategyType | string | `"RollingUpdate"` | `strategyType` specifies the strategy used to replace old Pods by new ones. `strategyType` can be `"Recreate"` or `"RollingUpdate"`. `"RollingUpdate"` is the default value and updates Pods in a rolling update fashion. `"Recreate"` will kill all existing Pods before new ones are created. The `"Recreate"` strategy is necessary when persistent volume's `accessMode` is set to `"ReadWriteOnce"` when using `helm upgrade`, as pod volume attachments to an existing PersistentVolumeClaim need to be cleared before a new pod can attach to it. | +| tolerations | list | `[]` | Node tolerations for pod scheduling | + +--- +Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs) diff --git a/apps/docs/docs/getting-started/installation/home-assistant.mdx b/apps/docs/docs/getting-started/installation/home-assistant.mdx new file mode 100644 index 000000000..9f5a50f52 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/home-assistant.mdx @@ -0,0 +1,25 @@ +# Home Assistant Add-on + +:::caution +Home Assistant Add-on is now updated to 1.0. Please add the new repository to your Add-on store. Also make sure to follow the [migration guide](https://homarr.dev/blog/2025/01/19/migration-guide-1.0/) so you don't lose your existing setup. +::: + +Homarr can be seamlessly integrated into your Home Assistant setup with this add-on. This is perfect for users who rely on Home Assistant as their primary server and don't have a separate device for hosting. + +## Prerequisites + +- [Home Assistant](https://www.home-assistant.io/getting-started/) +- Add-ons are only available if you've used the Home Assistant Operating System or Home Assistant Supervised installation method. + +## Installation + +1. **Add Repository**: Navigate to your Home Assistant Supervisor panel, and go to the Add-on Store. Add the following repository URL: `https://github.com/Wiggen94/ha-homarr-v1-server` or click this button +[![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2FWiggen94%2Fha-homarr-v1-server) + +2. **Install the Add-on**: Search for "Homarr Server" in the Add-on Store and select it. Click on "Install" to start the installation process. + +3. **Start the Add-on**: Once installed and configured, start the Homarr Server add-on from the Home Assistant Supervisor panel. + +4. **Access Homarr**: Homarr will be available at `http://:7575`. Open this address in your browser to access your Homarr dashboard. + +Your configuration, data and icons will be saved at /shares diff --git a/apps/docs/docs/getting-started/installation/img/truenas-scale-apps-search.png b/apps/docs/docs/getting-started/installation/img/truenas-scale-apps-search.png new file mode 100644 index 000000000..88a98989f Binary files /dev/null and b/apps/docs/docs/getting-started/installation/img/truenas-scale-apps-search.png differ diff --git a/apps/docs/docs/getting-started/installation/img/truenas-scale-apps.png b/apps/docs/docs/getting-started/installation/img/truenas-scale-apps.png new file mode 100644 index 000000000..9f3498edd Binary files /dev/null and b/apps/docs/docs/getting-started/installation/img/truenas-scale-apps.png differ diff --git a/apps/docs/docs/getting-started/installation/img/truenas-scale-auth-secret.png b/apps/docs/docs/getting-started/installation/img/truenas-scale-auth-secret.png new file mode 100644 index 000000000..04f512bd3 Binary files /dev/null and b/apps/docs/docs/getting-started/installation/img/truenas-scale-auth-secret.png differ diff --git a/apps/docs/docs/getting-started/installation/img/truenas-scale-install-homarr.png b/apps/docs/docs/getting-started/installation/img/truenas-scale-install-homarr.png new file mode 100644 index 000000000..e2cc8a7a4 Binary files /dev/null and b/apps/docs/docs/getting-started/installation/img/truenas-scale-install-homarr.png differ diff --git a/apps/docs/docs/getting-started/installation/img/truenas-scale-installation.png b/apps/docs/docs/getting-started/installation/img/truenas-scale-installation.png new file mode 100644 index 000000000..93e677ea0 Binary files /dev/null and b/apps/docs/docs/getting-started/installation/img/truenas-scale-installation.png differ diff --git a/apps/docs/docs/getting-started/installation/img/truenas-scale-storage-configuration.png b/apps/docs/docs/getting-started/installation/img/truenas-scale-storage-configuration.png new file mode 100644 index 000000000..b556fcadb Binary files /dev/null and b/apps/docs/docs/getting-started/installation/img/truenas-scale-storage-configuration.png differ diff --git a/apps/docs/docs/getting-started/installation/img/unraid-apps-homarr.webp b/apps/docs/docs/getting-started/installation/img/unraid-apps-homarr.webp new file mode 100644 index 000000000..e3b481aa4 Binary files /dev/null and b/apps/docs/docs/getting-started/installation/img/unraid-apps-homarr.webp differ diff --git a/apps/docs/docs/getting-started/installation/img/unraid-navigation-app-manager.webp b/apps/docs/docs/getting-started/installation/img/unraid-navigation-app-manager.webp new file mode 100644 index 000000000..6a444855f Binary files /dev/null and b/apps/docs/docs/getting-started/installation/img/unraid-navigation-app-manager.webp differ diff --git a/apps/docs/docs/getting-started/installation/pika-pods.mdx b/apps/docs/docs/getting-started/installation/pika-pods.mdx new file mode 100644 index 000000000..37fcf9b44 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/pika-pods.mdx @@ -0,0 +1,5 @@ +# Pika Pods + +Pika Pods is a hosting platform for open source apps. You can deploy Homarr on Pika Pods with just a few clicks: + +[_![Deploy on PikaPods](https://www.pikapods.com/static/run-button.svg)_](https://www.pikapods.com/pods?run=homarr-v1) diff --git a/apps/docs/docs/getting-started/installation/portainer.mdx b/apps/docs/docs/getting-started/installation/portainer.mdx new file mode 100644 index 000000000..f816d77fe --- /dev/null +++ b/apps/docs/docs/getting-started/installation/portainer.mdx @@ -0,0 +1,47 @@ +# Portainer +## Portainer Stacks +### Prerequisites + +- [Portainer Stacks](https://www.portainer.io/blog/stacks-docker-compose-the-portainer-way) + +### Installing + +To install Homarr using Portainer Stacks, simply create a new stack and paste the following code into it. + +```yml title="docker-compose.yml" +#---------------------------------------------------------------------# +# Homarr - A simple, yet powerful dashboard for your server. # +#---------------------------------------------------------------------# +services: + homarr: + container_name: homarr + image: ghcr.io/homarr-labs/homarr:latest + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration + - /appdata:/appdata + environment: + - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` + ports: + - '7575:7575' +``` + + +:::note +Portainer will mount the files to your host machine. Please make sure to replace ```` from the docker run command with your desired storage location. The path must be absolute. +::: + +Then, click on ``Deploy the stack`` and wait until the container has started. + +:::tip + +If you're unsure how to create a stack, checkout the [Portainer Documentation](https://docs.portainer.io/user/docker/stacks/add). + +::: + +### Updating + +To update Homarr using Docker Compose or Portainer Stacks, simply pull the latest image and restart the container. + +1. Run ``docker pull ghcr.io/homarr-labs/homarr:latest`` to pull the latest image. +2. Re-run ``docker-compose up -d`` or re-deploy the stack in Portainer. diff --git a/apps/docs/docs/getting-started/installation/proxmox.mdx b/apps/docs/docs/getting-started/installation/proxmox.mdx new file mode 100644 index 000000000..f6f5fb120 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/proxmox.mdx @@ -0,0 +1,73 @@ +# Proxmox + +This guide covers how to install homarr inside of a linux-container in ProxmoxVE, using a fully automated approach. + +# What is community-scripts? + +https://community-scripts.org/ + +This installation method is provided by the Proxmox Community-Scripts. We are a community-driven initiative that simplifies the setup of Proxmox Virtual Environment (VE). +With hundreds of scripts to help you manage your Proxmox VE environment. Whether you're a seasoned user or a newcomer, we've got you covered. + +# Installation + +It's as simple as pasting the following snippet into your Proxmox node's console + +```bash +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/homarr.sh)" +``` + +Check out the website for more info: https://community-scripts.org/scripts?q=homarr + +:::warning +Never trust any script directly injected from the web, without prior looking through it or searching the web for other's opinions. + +::: + +After executing this command, you will get asked, if you want to accept defaults or would like to specify things like IP-Adress, DNS etc, then choose advanced. + +After confirming the installation, the script will install the required dependencies, which may take a few minutes. Do not interrupt the installation. +After you've installed Homarr, you can find a new LXC "homarr". + +# Updating + +Updating is as simple as executing + +```bash +update +``` + +or running the script again but this time inside the container's shell: + +```bash +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/homarr.sh)" +``` + +# Configuration + +Some Homarr features require setting environment variables. When installing Homarr on Proxmox using the community-scripts installer, these can be configured in the file /opt/homarr.env. This path is also documented on the community-scripts website as the configuration path. + +# Troubleshooting + +If something does not work after an update, please first try rebooting the LXC or the homarr Service with + +```bash +systemctl restart homarr +``` + +# Getting help +- If you are looking for help with the script, updating the LXC or troubleshooting the installer, please get in contact with the support of the community scripts. They provide support on their [Discord](https://discord.gg/2wvnMDgdnU). If you found vulnerabilities, bugs or have a request for the script, [create a new issue here](https://github.com/community-scripts/ProxmoxVE/issues/new/choose). +- If you are looking to report a bug, vulnerability or request a new feature, use https://github.com/homarr-labs/homarr . You can ask for help on our Discord. + +# How to find logs +Homarr runs under a system service called `homarr`, so getting the logs is a simple as using the following command inside the LXC (Container) Shell + +```bash +systemctl status homarr +``` + +As Homarr logs really a log, it sometimes feels like the log is endless till you get the bottom, so a command like this only shows the latest 100 lines: + +```bash +journalctl -u homarr | tail -n 100 +``` diff --git a/apps/docs/docs/getting-started/installation/qnap.mdx b/apps/docs/docs/getting-started/installation/qnap.mdx new file mode 100644 index 000000000..a655db5b3 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/qnap.mdx @@ -0,0 +1,9 @@ +# QNAP + +:::caution +QNAP installation guide has not updated to 1.0 yet. There guide is still for 0.15.10. +::: + +When installing on QNAP, we recommend you to install Homarr using [Container Station]( https://www.qnap.com/en/software/container-station) or [this third-party image](https://www.myqnap.org/product/homarr/). + +There is also a guide available, but note that it is written in Chinese: https://post.smzdm.com/p/awzm7op2/ diff --git a/apps/docs/docs/getting-started/installation/railway.mdx b/apps/docs/docs/getting-started/installation/railway.mdx new file mode 100644 index 000000000..ae4ad8bec --- /dev/null +++ b/apps/docs/docs/getting-started/installation/railway.mdx @@ -0,0 +1,5 @@ +# Railway + +Railway is a cloud platform that allows you to deploy your apps with ease. You can deploy Homarr on Railway with a few clicks. + +[_![Deploy on Railway](https://railway.com/button.svg)_](https://railway.com/deploy/_c4Kr9?referralCode=vishify) diff --git a/apps/docs/docs/getting-started/installation/runtipi.mdx b/apps/docs/docs/getting-started/installation/runtipi.mdx new file mode 100644 index 000000000..53a669c90 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/runtipi.mdx @@ -0,0 +1,30 @@ +# Runtipi + +Runtipi is a self-hosted orchestrator that makes it easy to manage and run multiple services on a single server. It is based on Docker and comes with a simple web interface to manage your services. Runtipi is designed to be easy to use, so you don't have to worry about manual configuration or networking. + +https://runtipi.io + +## Prerequisites + +- [Runtipi](https://runtipi.io/docs/getting-started/installation) + +# Installation + +Installing Homarr is pretty untuitive, the app is available in the default appstore : +1. Search for **"Homarr"** in the App-Store page and select it +2. Click on **"Install"**. +3. Choose the method you want to access Homarr, through any port or domain name then select **"Install"** + +# Maintenance + +After installation, all you need is available from the WebUI in **"My apps"** > **"Homarr"** : + - Start/Stop + - Update + - Backup + - Logs + +If you like to tinker with your apps, you can also edit your app's docker-compose with a [user-config](https://runtipi.io/docs/guides/customize-app-config). + +# Getting help +- If you are looking for help with anything in Runtipi. They provide support on their [Discord](https://discord.gg/Bu9qEPnHsc) and [forums](https://forums.runtipi.io/). If you found vulnerabilities or bugs, [create a new issue here](https://github.com/runtipi/runtipi-appstore/issues). +- If you are looking to report a bug, vulnerability or request a new feature for Homarr, use https://github.com/homarr-labs/homarr . You can ask for help on our Discord. \ No newline at end of file diff --git a/apps/docs/docs/getting-started/installation/saltbox.mdx b/apps/docs/docs/getting-started/installation/saltbox.mdx new file mode 100644 index 000000000..2f284d72b --- /dev/null +++ b/apps/docs/docs/getting-started/installation/saltbox.mdx @@ -0,0 +1,10 @@ +# Saltbox + +:::caution +Saltbox installation command has not updated to 1.0 yet. There command still runs 0.15.10. +::: + +You can also use this to install on Saltbox: +```bash +sb install sandbox-homarr +``` \ No newline at end of file diff --git a/apps/docs/docs/getting-started/installation/source.mdx b/apps/docs/docs/getting-started/installation/source.mdx new file mode 100644 index 000000000..933b264dd --- /dev/null +++ b/apps/docs/docs/getting-started/installation/source.mdx @@ -0,0 +1,43 @@ +--- +title: From source +--- + +# (Not recommended): From source + +:::caution + +Installing from source is a bad idea in many ways: + +- No isolation between applications +- Dependency conflicts on your root operating system +- Cumbersome update process +- Permission management +- Handling of conflicts + +Therefore, we highly discourage you from using this as a normal user. +This method is only useful, when you want to develop on Homarr or extend it with your own functionality. + +::: + +## Prerequisites + +- [Node.js](https://nodejs.org/en/download/) +- [pnpm](https://pnpm.io/installation) +- [Redis](https://redis.io/download) + +## Steps + +
    +
  1. Clone the Repository using git clone https://github.com/homarr-labs/homarr.git
  2. +
  3. Enter the created directory using cd homarr
  4. +
  5. Install all dependencies using pnpm install
  6. +
  7. Copy the `.env.example` file to `.env` and replace `DB_URL` with the full path you want to use for the sqlite database file. For example `DB_URL='/home/username/homarr/db.sqlite`
  8. +
  9. Replace `AUTH_SECRET` and `SECRET_ENCRYPTION_KEY` both with a secure random string by using `openssl rand -hex 32`
  10. +
  11. Replace `CRON_JOB_API_KEY` with a secure random string by using `openssl rand -base64 32`
  12. +
  13. Run `pnpm run db:migration:sqlite:run` and wait that it completes
  14. +
  15. Build the source using `pnpm build`
  16. +
  17. Copy better-sqlite3.node files with `mkdir build` and `cp ./node_modules/better-sqlite3/build/Release/better_sqlite3.node ./build/better_sqlite3.node`
  18. +
  19. Start a redis server using `redis-server`
  20. +
  21. Run the server using `pnpm start`
  22. +
  23. Open `http://localhost:3000` in your browser
  24. +
diff --git a/apps/docs/docs/getting-started/installation/synology.mdx b/apps/docs/docs/getting-started/installation/synology.mdx new file mode 100644 index 000000000..6d5aef027 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/synology.mdx @@ -0,0 +1,6 @@ +# Synology + +The installation process is quite easy and fast on Synology devices. +Since this method is used less often, we recommend you to follow this guide written by mariushosting. + +https://mariushosting.com/how-to-install-homarr-on-your-synology-nas/ diff --git a/apps/docs/docs/getting-started/installation/unraid.mdx b/apps/docs/docs/getting-started/installation/unraid.mdx new file mode 100644 index 000000000..5fa7cc9b0 --- /dev/null +++ b/apps/docs/docs/getting-started/installation/unraid.mdx @@ -0,0 +1,49 @@ +import Link from '@docusaurus/Link'; +import { IconDownload } from '@tabler/icons-react'; + +# Unraid + +You can install Homarr directly from your Unraid Dashboard, no terminal required. + +#### Prerequisites + +- [Unraid](https://unraid.net/) +- [Community Apps](https://forums.unraid.net/topic/38582-plug-in-community-applications/) + +#### Install the Community Apps Plugin + + +
+ Install community applications plugin + +
+ + +
+
+ +:::tip + +Don't know whether you have the plugin installed or not? Search for this tab in the navigation: + +![](img/unraid-navigation-app-manager.webp) +::: + +#### Installing + +After you've installed the Community Apps Plugin, you can install Homarr from the Unraid Dashboard. + +1. Navigate to the tab "Apps". +2. Search for "Homarr" and click on the result. +3. Click on "Install" and adjust the settings to your liking. + +![](img/unraid-apps-homarr.webp) + +After you've installed Homarr, you can find it under the tab "Docker". + +The official support thread is located [here](https://forums.unraid.net/topic/123478-support-smartphonelover-homarr/), but we prefer to communicate over GitHub and Discord instead. + diff --git a/apps/docs/docs/integrations/_category_.json b/apps/docs/docs/integrations/_category_.json new file mode 100644 index 000000000..896594e32 --- /dev/null +++ b/apps/docs/docs/integrations/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Integrations", + "collapsed": true, + "position": 3, + "link": { + "type": "generated-index", + "title": "Integrations", + "description": "Integration are a principal part of homarr, it's where you can connect your other apps to interact with them with widgets or other capabilities, Homarr currently integrates with the following applications:" + } +} diff --git a/apps/docs/docs/integrations/adguard-home/index.mdx b/apps/docs/docs/integrations/adguard-home/index.mdx new file mode 100644 index 000000000..b4cb6cdb6 --- /dev/null +++ b/apps/docs/docs/integrations/adguard-home/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'AdGuard Home' +description: "AdGuard Home is a network-wide software for blocking ads and trackers, providing a safer and faster internet experience." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconAd, IconDeviceGamepad } from "@tabler/icons-react"; +import { adguardHomeIntegration } from '.'; +import { dnsHoleSummaryWidget } from '@site/docs/widgets/dns-hole-summary'; +import { dnsHoleControlsWidget } from '@site/docs/widgets/dns-hole-controls'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/adguard-home/index.ts b/apps/docs/docs/integrations/adguard-home/index.ts new file mode 100644 index 000000000..90304f5c4 --- /dev/null +++ b/apps/docs/docs/integrations/adguard-home/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const adguardHomeIntegration: IntegrationDefinition = { + name: "AdGuard Home", + description: + "AdGuard Home is a network-wide software for blocking ads and trackers, providing a safer and faster internet experience.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/adguard-home.svg", + path: "../../integrations/adguard-home", +}; diff --git a/apps/docs/docs/integrations/anchor/index.mdx b/apps/docs/docs/integrations/anchor/index.mdx new file mode 100644 index 000000000..e4d897767 --- /dev/null +++ b/apps/docs/docs/integrations/anchor/index.mdx @@ -0,0 +1,40 @@ +--- +title: 'Anchor' +description: "Anchor is a self-hosted note-taking application." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { anchorIntegration } from '.'; +import { anchorNoteWidget } from '@site/docs/widgets/anchor-note'; + + + + +The Anchor integration lets Homarr connect to your Anchor instance so you can display and edit selected notes directly from your dashboard. + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + diff --git a/apps/docs/docs/integrations/anchor/index.ts b/apps/docs/docs/integrations/anchor/index.ts new file mode 100644 index 000000000..390a53b71 --- /dev/null +++ b/apps/docs/docs/integrations/anchor/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const anchorIntegration: IntegrationDefinition = { + name: "Anchor", + description: + "Anchor is a self-hosted note-taking application. The Anchor integration lets Homarr display and edit selected notes directly from the dashboard.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/anchor.svg", + path: "../../integrations/anchor", +}; diff --git a/apps/docs/docs/integrations/aria2/index.mdx b/apps/docs/docs/integrations/aria2/index.mdx new file mode 100644 index 000000000..9950fec2f --- /dev/null +++ b/apps/docs/docs/integrations/aria2/index.mdx @@ -0,0 +1,38 @@ +--- +title: 'Aria2' +description: "Lightweight multiprotocol & multi-source command-line download utility. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink" +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { aria2Integration } from '.'; +import { downloadsWidget } from '@site/docs/widgets/downloads'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/aria2/index.ts b/apps/docs/docs/integrations/aria2/index.ts new file mode 100644 index 000000000..f2c77463b --- /dev/null +++ b/apps/docs/docs/integrations/aria2/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const aria2Integration: IntegrationDefinition = { + name: "Aria2", + description: + "Lightweight multi-protocol & multi-source command-line download utility. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink", + iconUrl: "https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons@latest/src/system_downloads_3.svg", + path: "../../integrations/aria2", +}; diff --git a/apps/docs/docs/integrations/audiobookshelf/index.mdx b/apps/docs/docs/integrations/audiobookshelf/index.mdx new file mode 100644 index 000000000..156525ba5 --- /dev/null +++ b/apps/docs/docs/integrations/audiobookshelf/index.mdx @@ -0,0 +1,41 @@ +--- +title: 'Audiobookshelf' +description: "Audiobookshelf is a self-hosted audiobook and podcast server that lets you manage and stream your audio library." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { audiobookshelfIntegration } from '.'; +import { audioStatsWidget } from '@site/docs/widgets/audio-stats'; + + + + +Audiobookshelf provides library statistics including audiobook and podcast counts, listening time, and active sessions. + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + diff --git a/apps/docs/docs/integrations/audiobookshelf/index.ts b/apps/docs/docs/integrations/audiobookshelf/index.ts new file mode 100644 index 000000000..cf8b076b5 --- /dev/null +++ b/apps/docs/docs/integrations/audiobookshelf/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const audiobookshelfIntegration: IntegrationDefinition = { + name: "Audiobookshelf", + description: + "Audiobookshelf is a self-hosted audiobook and podcast server that lets you manage and stream your audio library.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/audiobookshelf.svg", + path: "../../integrations/audiobookshelf", +}; diff --git a/apps/docs/docs/integrations/codeberg/index.mdx b/apps/docs/docs/integrations/codeberg/index.mdx new file mode 100644 index 000000000..98ca314c2 --- /dev/null +++ b/apps/docs/docs/integrations/codeberg/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'Codeberg' +description: "Codeberg is a non-profit, community-driven platform for hosting and collaborating on software projects." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { codebergIntegration } from '.'; +import { releasesWidget } from '@site/docs/widgets/releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/codeberg/index.ts b/apps/docs/docs/integrations/codeberg/index.ts new file mode 100644 index 000000000..f2a43ad48 --- /dev/null +++ b/apps/docs/docs/integrations/codeberg/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const codebergIntegration: IntegrationDefinition = { + name: "Codeberg", + description: + "Codeberg is a non-profit, community-driven platform for hosting and collaborating on software projects.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/codeberg.svg", + path: "../../integrations/codeberg", +}; diff --git a/apps/docs/docs/integrations/coolify/index.mdx b/apps/docs/docs/integrations/coolify/index.mdx new file mode 100644 index 000000000..56e5e6c29 --- /dev/null +++ b/apps/docs/docs/integrations/coolify/index.mdx @@ -0,0 +1,46 @@ +--- +title: 'Coolify' +description: 'Self-hosted PaaS and deployment platform' +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { coolifyIntegration } from '.'; +import { coolifyWidget } from '../../widgets/coolify'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +:::info URL configuration +Use the root URL of your Coolify instance, for example `https://coolify.example.com`. Homarr calls Coolify endpoints under `/api` and `/api/v1` automatically. +::: + +### Secrets +Enable API access under Settings > Advanced if it is disabled.), + (Go to Security > API Tokens.), + 'Enter a name, e.g. "Homarr".', + (Select the read permission. The Coolify widget only reads version, server, project, application, and service data.), + 'Click "Create".', + 'Copy the generated token immediately. Coolify only shows it once.', + 'Paste the token into the API Key field in Homarr.' + ] +}]} /> diff --git a/apps/docs/docs/integrations/coolify/index.ts b/apps/docs/docs/integrations/coolify/index.ts new file mode 100644 index 000000000..dbd498e1a --- /dev/null +++ b/apps/docs/docs/integrations/coolify/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const coolifyIntegration: IntegrationDefinition = { + name: "Coolify", + description: "Self-hosted PaaS and deployment platform", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/coolify.svg", + path: "../../integrations/coolify", +}; diff --git a/apps/docs/docs/integrations/dash-dot/index.mdx b/apps/docs/docs/integrations/dash-dot/index.mdx new file mode 100644 index 000000000..512bc6c8d --- /dev/null +++ b/apps/docs/docs/integrations/dash-dot/index.mdx @@ -0,0 +1,32 @@ +--- +title: 'Dash.' +description: "Dash. is a system performance and resource monitoring tool" +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconHeartRateMonitor } from "@tabler/icons-react"; +import { dashDotIntegration } from '.'; +import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; +import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; + + + + +### Widgets & Capabilities + + +### Adding the integration + \ No newline at end of file diff --git a/apps/docs/docs/integrations/dash-dot/index.ts b/apps/docs/docs/integrations/dash-dot/index.ts new file mode 100644 index 000000000..5dd817efb --- /dev/null +++ b/apps/docs/docs/integrations/dash-dot/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const dashDotIntegration: IntegrationDefinition = { + name: "Dash.", + description: "Dash. is a system performance and resource monitoring tool", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/dashdot.png", + path: "../../integrations/dash-dot", +}; diff --git a/apps/docs/docs/integrations/deluge/index.mdx b/apps/docs/docs/integrations/deluge/index.mdx new file mode 100644 index 000000000..24aadb910 --- /dev/null +++ b/apps/docs/docs/integrations/deluge/index.mdx @@ -0,0 +1,36 @@ +--- +title: 'Deluge' +description: "Deluge is a lightweight, Free Software, cross-platform BitTorrent client." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IconDownload } from "@tabler/icons-react"; +import Alert from '@theme/Admonition'; +import { delugeIntegration } from '.'; +import { downloadsWidget } from '@site/docs/widgets/downloads'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/deluge/index.ts b/apps/docs/docs/integrations/deluge/index.ts new file mode 100644 index 000000000..1b3d968c0 --- /dev/null +++ b/apps/docs/docs/integrations/deluge/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const delugeIntegration: IntegrationDefinition = { + name: "Deluge", + description: "Deluge is a lightweight, Free Software, cross-platform BitTorrent client.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/deluge.svg", + path: "../../integrations/deluge", +}; diff --git a/apps/docs/docs/integrations/docker-hub/index.mdx b/apps/docs/docs/integrations/docker-hub/index.mdx new file mode 100644 index 000000000..a49d03047 --- /dev/null +++ b/apps/docs/docs/integrations/docker-hub/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'Docker Hub' +description: "Docker Hub is a cloud-based registry service for sharing and managing Docker images." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { dockerHubIntegration } from '.'; +import { releasesWidget } from '@site/docs/widgets/releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/docker-hub/index.ts b/apps/docs/docs/integrations/docker-hub/index.ts new file mode 100644 index 000000000..1a49feeae --- /dev/null +++ b/apps/docs/docs/integrations/docker-hub/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const dockerHubIntegration: IntegrationDefinition = { + name: "Docker Hub", + description: "Docker Hub is a cloud-based registry service for sharing and managing Docker images.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/docker.svg", + path: "../../integrations/docker-hub", +}; diff --git a/apps/docs/docs/integrations/docker/img/add-to-homarr-apps.png b/apps/docs/docs/integrations/docker/img/add-to-homarr-apps.png new file mode 100644 index 000000000..f4aec5f87 Binary files /dev/null and b/apps/docs/docs/integrations/docker/img/add-to-homarr-apps.png differ diff --git a/apps/docs/docs/integrations/docker/img/add-to-homarr-dialog.png b/apps/docs/docs/integrations/docker/img/add-to-homarr-dialog.png new file mode 100644 index 000000000..b10f88dfa Binary files /dev/null and b/apps/docs/docs/integrations/docker/img/add-to-homarr-dialog.png differ diff --git a/apps/docs/docs/integrations/docker/img/container-and-image-search.png b/apps/docs/docs/integrations/docker/img/container-and-image-search.png new file mode 100644 index 000000000..4c4c34208 Binary files /dev/null and b/apps/docs/docs/integrations/docker/img/container-and-image-search.png differ diff --git a/apps/docs/docs/integrations/docker/index.mdx b/apps/docs/docs/integrations/docker/index.mdx new file mode 100644 index 000000000..84aebe5e7 --- /dev/null +++ b/apps/docs/docs/integrations/docker/index.mdx @@ -0,0 +1,156 @@ +--- +title: 'Docker' +description: "Docker is a platform where you can run your applications in containers, allowing for easy deployment and management of applications." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconBrandDocker, IconTool } from "@tabler/icons-react"; +import { dockerIntegration } from '.'; +import { dockerContainersWidget } from '@site/docs/widgets/docker-containers'; + + + + +### Widgets & Capabilities + + + +## Enabling the Docker integration +This integration must first be enabled. +If you directly run on the host system and you have docker installed, it will be enabled by default. +Otherwise, you'll need to mount the [docker socket](https://docs.docker.com/engine/security/protect-access/) to the Homarr container, +so Homarr can interact with the Docker service. + +In Docker Compose, you can simply add this line: + +```yaml {10} +#---------------------------------------------------------------------# +# Homarr - A simple, yet powerful dashboard for your server. # +#---------------------------------------------------------------------# +services: + homarr: + container_name: homarr + image: ghcr.io/homarr-labs/homarr:latest + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock # <--- add this line here! + - ./homarr/appdata:/appdata + environment: + - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` + ports: + - '7575:7575' +``` + +With docker run, add this parameter: `-v /var/run/docker.sock:/var/run/docker.sock`. +In Windows, you'll need to adjust the slashes: `-v //var/run/docker.sock:/var/run/docker.sock` + +### Managing your Docker containers within Homarr +Homarr allows you to interact with Docker containers running on your system. +Each container row has an action menu with the following options: +- **View logs** — opens a dedicated logs page with a live terminal +- **Start** — start a stopped container +- **Stop** — stop a running container +- **Restart** — restart a container +- **Remove** — remove a container +- **Add to Homarr** — create a bookmark app from the container + +You can also search and filter containers by **container** or **image** name: + +![Container and Image Search](img/container-and-image-search.png) + +#### Viewing container logs + +You can view the real-time logs of any container by selecting **View logs** from the row action menu. +This opens a dedicated page with an xterm.js terminal that streams the container's log output. + +#### CPU and Memory columns + +The Docker management table supports optional **CPU usage** and **Memory usage** columns. +These columns are hidden by default and can be toggled on from the table column visibility settings. + +#### Add apps from containers + +Homarr also lets you add apps from containers. You can simply select all containers you want to add an app for and then click the `Add to Homarr` button. +This will open a dialog where you can specify the web addresses for all of them: + +![Dialog for addding apps to Homarr](img/add-to-homarr-dialog.png) + +Once you've changed the web addresses, click the `Add` button to add the apps to Homarr. +They are then available in the app list and can be used as normally added apps. + +![Apps added from containers](img/add-to-homarr-apps.png) + +### Configuration + +Currently Homarr supports one label for configuration of the containers: + +- **homarr.hide:** If set to any value, the container will be hidden from the Docker Containers widget and tools page. + +### Security +Mounting docker sockets can be risky, as they permit full control over your docker service. +As an example, a thread actor could abuse Homarr use the socket to start, stop or delete containers on your system. + +Therefore we recommend the usage of a socket proxy, which can prohibit certain actions. +A few examples include: +- https://github.com/linuxserver/docker-socket-proxy +- https://github.com/Tecnativa/docker-socket-proxy + +See documentation of the respective proxies on how to configure them. +Homarr may behave in unexpected ways when you use proxies. + +#### Permissions +Homarr needs the following permissions from the Docker API: +- Containers/Start +- Containers/Stop +- Containers/Restart +- Containers/Remove + +For socket proxies, you will need these permissions: +- `CONTAINERS=1` +- `POST=1` + +**Caution:** `POST` access is security critical as it provides extensive capabilities to modify your docker environment. Please leave it disabled if you're concerned about this. + +As a workaround, you can use [LSIO's socket proxy](https://github.com/linuxserver/docker-socket-proxy) and set the following: +- ALLOW_START=1 +- ALLOW_STOP=1 +- ALLOW_RESTARTS=1 + +These will work even with `POST=0`. + +You lose the ability to remove containers, but start, stop and restarts should work just fine. + +#### Connecting to Docker via Socket Proxies +To connect to Docker via a socket proxy, you'll need to add these two environment variables in the compose file: +- `DOCKER_HOSTNAMES=` +- `DOCKER_PORTS=` + +Refer: https://homarr.dev/docs/advanced/environment-variables/ + +You will also need to add Homarr to the network of your socket proxy. You can do it like this: +1. Add the network to your compose file (with appropriate changes): +```yaml +networks: + socket-proxy: + name: socket-proxy # <--- change this to the name of the network as set up by the socket proxy + external: true +``` + +2. Add the network to the homarr service in the compose file: +```yaml +networks: + - socket-proxy +``` + +3. Finally, if it is present, remove the default docker socket connection under `volumes` in the homarr service. diff --git a/apps/docs/docs/integrations/docker/index.ts b/apps/docs/docs/integrations/docker/index.ts new file mode 100644 index 000000000..4f9167bfc --- /dev/null +++ b/apps/docs/docs/integrations/docker/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const dockerIntegration: IntegrationDefinition = { + name: "Docker", + description: + "Docker is a platform where you can run your applications in containers, allowing for easy deployment and management of applications.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/docker.svg", + path: "../../integrations/docker", +}; diff --git a/apps/docs/docs/integrations/emby/index.mdx b/apps/docs/docs/integrations/emby/index.mdx new file mode 100644 index 000000000..907d2bd96 --- /dev/null +++ b/apps/docs/docs/integrations/emby/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'Emby' +description: "Emby is a media server platform that allows you to organize, manage, and stream your personal media collection." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconVideo, IconTicket } from "@tabler/icons-react"; +import { embyIntegration } from '.'; +import { mediaServerWidget } from '@site/docs/widgets/media-server'; +import { mediaReleasesWidget } from '@site/docs/widgets/media-releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/emby/index.ts b/apps/docs/docs/integrations/emby/index.ts new file mode 100644 index 000000000..ad59b7c8b --- /dev/null +++ b/apps/docs/docs/integrations/emby/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const embyIntegration: IntegrationDefinition = { + name: "Emby", + description: + "Emby is a media server platform that allows you to organize, manage, and stream your personal media collection.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/emby.svg", + path: "../../integrations/emby", +}; diff --git a/apps/docs/docs/integrations/github-containerregistry/index.mdx b/apps/docs/docs/integrations/github-containerregistry/index.mdx new file mode 100644 index 000000000..f4cb5b310 --- /dev/null +++ b/apps/docs/docs/integrations/github-containerregistry/index.mdx @@ -0,0 +1,42 @@ +--- +title: 'GitHub Container Registry' +description: "GitHub Container Registry is a platform for hosting and managing packages." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { gitHubContainerRegistryIntegration } from '.'; +import { releasesWidget } from '@site/docs/widgets/releases'; + + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/github-containerregistry/index.ts b/apps/docs/docs/integrations/github-containerregistry/index.ts new file mode 100644 index 000000000..b88f426d3 --- /dev/null +++ b/apps/docs/docs/integrations/github-containerregistry/index.ts @@ -0,0 +1,11 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const gitHubContainerRegistryIntegration: IntegrationDefinition = { + name: "GitHub Container Registry", + description: "GitHub Container Registry is a platform for hosting and managing packages.", + iconUrl: { + light: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/github.svg", + dark: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/github-light.svg", + }, + path: "../../integrations/github-packages", +}; diff --git a/apps/docs/docs/integrations/github/index.mdx b/apps/docs/docs/integrations/github/index.mdx new file mode 100644 index 000000000..39c9777b3 --- /dev/null +++ b/apps/docs/docs/integrations/github/index.mdx @@ -0,0 +1,41 @@ +--- +title: 'GitHub' +description: "GitHub is a web-based platform for version control and collaboration." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { githubIntegration } from '.'; +import { releasesWidget } from '@site/docs/widgets/releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/github/index.ts b/apps/docs/docs/integrations/github/index.ts new file mode 100644 index 000000000..7bb9b6b5d --- /dev/null +++ b/apps/docs/docs/integrations/github/index.ts @@ -0,0 +1,11 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const githubIntegration: IntegrationDefinition = { + name: "GitHub", + description: "GitHub is a web-based platform for version control and collaboration.", + iconUrl: { + light: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/github.svg", + dark: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/github-light.svg", + }, + path: "../../integrations/github", +}; diff --git a/apps/docs/docs/integrations/gitlab/index.mdx b/apps/docs/docs/integrations/gitlab/index.mdx new file mode 100644 index 000000000..edc77e1cd --- /dev/null +++ b/apps/docs/docs/integrations/gitlab/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'GitLab' +description: "GitLab is a web-based DevOps lifecycle tool that provides a Git repository manager." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { gitlabIntegration } from '.'; +import { releasesWidget } from '@site/docs/widgets/releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/gitlab/index.ts b/apps/docs/docs/integrations/gitlab/index.ts new file mode 100644 index 000000000..c252cd6ff --- /dev/null +++ b/apps/docs/docs/integrations/gitlab/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const gitlabIntegration: IntegrationDefinition = { + name: "GitLab", + description: "GitLab is a web-based DevOps lifecycle tool that provides a Git repository manager.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitlab.svg", + path: "../../integrations/gitlab", +}; diff --git a/apps/docs/docs/integrations/glances/index.mdx b/apps/docs/docs/integrations/glances/index.mdx new file mode 100644 index 000000000..2639f87e5 --- /dev/null +++ b/apps/docs/docs/integrations/glances/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'Glances' +description: "Glances is a cross-platform system monitoring tool." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { glancesIntegration } from '.'; +import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; +import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/glances/index.ts b/apps/docs/docs/integrations/glances/index.ts new file mode 100644 index 000000000..d46465287 --- /dev/null +++ b/apps/docs/docs/integrations/glances/index.ts @@ -0,0 +1,11 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const glancesIntegration: IntegrationDefinition = { + name: "Glances", + description: "Glances is a cross-platform system monitoring tool.", + iconUrl: { + light: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glances.svg", + dark: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/glances-light.svg", + }, + path: "../../integrations/glances", +}; diff --git a/apps/docs/docs/integrations/home-assistant/index.mdx b/apps/docs/docs/integrations/home-assistant/index.mdx new file mode 100644 index 000000000..98ad591d6 --- /dev/null +++ b/apps/docs/docs/integrations/home-assistant/index.mdx @@ -0,0 +1,45 @@ +--- +title: 'Home Assistant' +description: "Home Assistant is an open-source home automation platform that focuses on privacy and local control, allowing you to automate and control your smart home devices." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconBinaryTree } from "@tabler/icons-react"; +import { homeAssistantIntegration } from '.'; +import { smartHomeEntityStateWidget } from '@site/docs/widgets/smart-home-entity-state'; +import { smartHomeExecuteAutomationWidget } from '@site/docs/widgets/smart-home-execute-automation'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/home-assistant/index.ts b/apps/docs/docs/integrations/home-assistant/index.ts new file mode 100644 index 000000000..a3b6dda12 --- /dev/null +++ b/apps/docs/docs/integrations/home-assistant/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const homeAssistantIntegration: IntegrationDefinition = { + name: "Home Assistant", + description: + "Home Assistant is an open-source home automation platform that focuses on privacy and local control, allowing you to automate and control your smart home devices.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/home-assistant.svg", + path: "../../integrations/home-assistant", +}; diff --git a/apps/docs/docs/integrations/ical/index.mdx b/apps/docs/docs/integrations/ical/index.mdx new file mode 100644 index 000000000..5f5ffc422 --- /dev/null +++ b/apps/docs/docs/integrations/ical/index.mdx @@ -0,0 +1,38 @@ +--- +title: 'iCal' +description: "iCal is a standard for calendar data exchange, allowing users to share and manage calendar events across different platforms." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconZoomQuestion, IconChartBar, IconSearch } from "@tabler/icons-react"; +import { icalIntegration } from '.'; +import { calendarWidget } from '@site/docs/widgets/calendar'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + +## Using the iCal integration + +The iCal integration allows you to add external calendars to Homarr. Any calendar that provides a public iCal URL can be integrated, such as Google Calendar, Apple Calendar, or Outlook. \ No newline at end of file diff --git a/apps/docs/docs/integrations/ical/index.ts b/apps/docs/docs/integrations/ical/index.ts new file mode 100644 index 000000000..8bb0a0240 --- /dev/null +++ b/apps/docs/docs/integrations/ical/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const icalIntegration: IntegrationDefinition = { + name: "iCal", + description: + "iCal is a standard for calendar data exchange, allowing users to share and manage calendar events across different platforms.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/ical.svg", + path: "../../integrations/ical", +}; diff --git a/apps/docs/docs/integrations/immich/index.mdx b/apps/docs/docs/integrations/immich/index.mdx new file mode 100644 index 000000000..4826633e2 --- /dev/null +++ b/apps/docs/docs/integrations/immich/index.mdx @@ -0,0 +1,51 @@ +--- +title: 'Immich' +description: "Self-hosted photo and video management solution" +hide_title: true +--- + +import { immichAlbumCarouselWidget } from '../../widgets/immich-album-carousel';import { + IntegrationHeader +} from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { immichIntegration } from '.'; +import { immichServerStatsWidget } from '../../widgets/immich-server-stats'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + Select the following permissions:{" "} + album.read,{" "} + user.read,{" "} + server.statistics,{" "} + asset.download + ), + 'Create the integration in Homarr and copy the API key to there' + ] +}]} /> \ No newline at end of file diff --git a/apps/docs/docs/integrations/immich/index.ts b/apps/docs/docs/integrations/immich/index.ts new file mode 100644 index 000000000..e59816d57 --- /dev/null +++ b/apps/docs/docs/integrations/immich/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const immichIntegration: IntegrationDefinition = { + name: "Immich", + description: "Self-hosted photo and video management solution", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg", + path: "../../integrations/immich", +}; diff --git a/apps/docs/docs/integrations/jellyfin/index.mdx b/apps/docs/docs/integrations/jellyfin/index.mdx new file mode 100644 index 000000000..4826386b8 --- /dev/null +++ b/apps/docs/docs/integrations/jellyfin/index.mdx @@ -0,0 +1,40 @@ +--- +title: 'Jellyfin' +description: "Jellyfin is a free and open-source media server software that allows you to organize, manage, and share your media files." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconVideo, IconTicket } from "@tabler/icons-react"; +import { jellyfinIntegration } from '.'; +import { mediaServerWidget } from '@site/docs/widgets/media-server'; +import { mediaReleasesWidget } from '@site/docs/widgets/media-releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/jellyfin/index.ts b/apps/docs/docs/integrations/jellyfin/index.ts new file mode 100644 index 000000000..a11bd128d --- /dev/null +++ b/apps/docs/docs/integrations/jellyfin/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const jellyfinIntegration: IntegrationDefinition = { + name: "Jellyfin", + description: + "Jellyfin is a free and open-source media server software that allows you to organize, manage, and share your media files.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/jellyfin.svg", + path: "../../integrations/jellyfin", +}; diff --git a/apps/docs/docs/integrations/jellyseerr/index.mdx b/apps/docs/docs/integrations/jellyseerr/index.mdx new file mode 100644 index 000000000..a85d7bd9f --- /dev/null +++ b/apps/docs/docs/integrations/jellyseerr/index.mdx @@ -0,0 +1,45 @@ +--- +title: 'Jellyseerr' +description: "Jellyseerr is a self-hosted media request management system that integrates with Jellyfin and other media servers." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconZoomQuestion, IconChartBar, IconSearch } from "@tabler/icons-react"; +import { jellyseerrIntegration } from '.'; +import { mediaRequestListWidget } from '@site/docs/widgets/media-request-list'; +import { mediaRequestStatsWidget } from '@site/docs/widgets/media-request-stats'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/jellyseerr/index.ts b/apps/docs/docs/integrations/jellyseerr/index.ts new file mode 100644 index 000000000..7e88da7a0 --- /dev/null +++ b/apps/docs/docs/integrations/jellyseerr/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const jellyseerrIntegration: IntegrationDefinition = { + name: "Jellyseerr", + description: + "Jellyseerr is a self-hosted media request management system that integrates with Jellyfin and other media servers.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/jellyseerr.svg", + path: "../../integrations/jellyseerr", +}; diff --git a/apps/docs/docs/integrations/kubernetes/img/dashboard.jpeg b/apps/docs/docs/integrations/kubernetes/img/dashboard.jpeg new file mode 100644 index 000000000..b54ad4e22 Binary files /dev/null and b/apps/docs/docs/integrations/kubernetes/img/dashboard.jpeg differ diff --git a/apps/docs/docs/integrations/kubernetes/index.mdx b/apps/docs/docs/integrations/kubernetes/index.mdx new file mode 100644 index 000000000..899c60931 --- /dev/null +++ b/apps/docs/docs/integrations/kubernetes/index.mdx @@ -0,0 +1,62 @@ +--- +title: 'Kubernetes' +description: "Kubernetes is a powerful container orchestration platform that automates the deployment, scaling, and management of containerized applications." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconBrandDocker, IconTool } from "@tabler/icons-react"; +import { kubernetesIntegration } from '.'; + + + + +Homarr provides a user-friendly Kubernetes dashboard that offers an overview of your cluster’s resources in a clear and structured interface. It allows users to view key Kubernetes objects, including `Pods`, `Services`, `Ingresses`, `Nodes`, `ConfigMaps`, `Secrets`, `Namespaces`, and `Volumes`, as well as basic metrics when the Kubernetes Metrics Server is enabled. + +:::warning[Read only] +This integration is read-only, meaning Homarr does not modify or manage cluster resources but serves as an informational tool to enhance visibility into your Kubernetes environment. +::: + +![Dashboard](img/dashboard.jpeg) + +### Prerequisites + +Before deploying Homarr in Kubernetes, ensure the following prerequisites are met: + +- Kubernetes (Version >= 1.24.0) +- Metrics Server ([Install from here](https://github.com/kubernetes-sigs/metrics-server)) +- RBAC Enabled (Required for Homarr Helm chart) + +### Configuring RBAC in Helm Chart + +To enable RBAC for Homarr, configure the Helm chart values file as follows: + +```yaml +rbac: + enabled: true +``` + +:::tip[What Does rbac.enabled Do?] +Enabling RBAC in the Helm chart creates the necessary Kubernetes Role-Based Access Control (RBAC) resources to allow Homarr to view various Kubernetes objects. These include: + +- Service Account: A dedicated service account for Homarr. +- Role & RoleBinding: Grants permissions within a specific namespace to list, watch, and get pods, services, secrets, configmaps, and more. +- ClusterRole & ClusterRoleBinding: Extends the same permissions cluster-wide for additional flexibility. +::: + +### Homarr Dashboard Overview + +Once deployed, Homarr provides a dashboard displaying Kubernetes metrics and resource information. The main page includes: + +- Pods: Lists running and pending pods. +- Services: Shows available services and their configurations. +- Ingresses: Displays ingress rules and associated routes. +- Nodes: Provides an overview of cluster nodes and their status. +- ConfigMaps & Secrets: Lists configuration data and secrets used within the cluster. +- Namespaces: Displays all available namespaces in the cluster. +- Volumes: Shows persistent and ephemeral storage resources. diff --git a/apps/docs/docs/integrations/kubernetes/index.ts b/apps/docs/docs/integrations/kubernetes/index.ts new file mode 100644 index 000000000..9702bef3a --- /dev/null +++ b/apps/docs/docs/integrations/kubernetes/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const kubernetesIntegration: IntegrationDefinition = { + name: "Kubernetes", + description: + "Kubernetes is a powerful container orchestration platform that automates the deployment, scaling, and management of containerized applications.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/kubernetes.svg", + path: "../../integrations/kubernetes", +}; diff --git a/apps/docs/docs/integrations/lidarr/index.mdx b/apps/docs/docs/integrations/lidarr/index.mdx new file mode 100644 index 000000000..498503617 --- /dev/null +++ b/apps/docs/docs/integrations/lidarr/index.mdx @@ -0,0 +1,35 @@ +--- +title: 'Lidarr' +description: "Lidarr is a music management tool that automates the process of downloading, sorting, and renaming music." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconCalendar } from "@tabler/icons-react"; +import { lidarrIntegration } from '.'; +import { calendarWidget } from '@site/docs/widgets/calendar'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/lidarr/index.ts b/apps/docs/docs/integrations/lidarr/index.ts new file mode 100644 index 000000000..900026263 --- /dev/null +++ b/apps/docs/docs/integrations/lidarr/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const lidarrIntegration: IntegrationDefinition = { + name: "Lidarr", + description: + "Lidarr is a music management tool that automates the process of downloading, sorting, and renaming music.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/lidarr.svg", + path: "../../integrations/lidarr", +}; diff --git a/apps/docs/docs/integrations/linux-server-io/index.mdx b/apps/docs/docs/integrations/linux-server-io/index.mdx new file mode 100644 index 000000000..426dc7f68 --- /dev/null +++ b/apps/docs/docs/integrations/linux-server-io/index.mdx @@ -0,0 +1,34 @@ +--- +title: 'LinuxServer.io' +description: "LinuxServer.io is a platform for managing and deploying containerized applications." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { linuxServerIoIntegration } from '.'; +import { releasesWidget } from '@site/docs/widgets/releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/linux-server-io/index.ts b/apps/docs/docs/integrations/linux-server-io/index.ts new file mode 100644 index 000000000..82bc0fac6 --- /dev/null +++ b/apps/docs/docs/integrations/linux-server-io/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const linuxServerIoIntegration: IntegrationDefinition = { + name: "LinuxServer.io", + description: "LinuxServer.io is a platform for managing and deploying containerized applications.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/linuxserver-io.svg", + path: "../../integrations/linux-server-io", +}; diff --git a/apps/docs/docs/integrations/navidrome/index.mdx b/apps/docs/docs/integrations/navidrome/index.mdx new file mode 100644 index 000000000..664e6fc58 --- /dev/null +++ b/apps/docs/docs/integrations/navidrome/index.mdx @@ -0,0 +1,39 @@ +--- +title: 'Navidrome' +description: "Navidrome is a self-hosted music server and streamer compatible with the Subsonic API." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { navidromeIntegration } from '.'; +import { audioStatsWidget } from '@site/docs/widgets/audio-stats'; + + + + +Navidrome provides music library statistics including artist, album, and song counts, as well as now playing information via the Subsonic API. + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + diff --git a/apps/docs/docs/integrations/navidrome/index.ts b/apps/docs/docs/integrations/navidrome/index.ts new file mode 100644 index 000000000..29d3b5b40 --- /dev/null +++ b/apps/docs/docs/integrations/navidrome/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const navidromeIntegration: IntegrationDefinition = { + name: "Navidrome", + description: "Navidrome is a self-hosted music server and streamer compatible with the Subsonic API.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/navidrome.svg", + path: "../../integrations/navidrome", +}; diff --git a/apps/docs/docs/integrations/nextcloud/index.mdx b/apps/docs/docs/integrations/nextcloud/index.mdx new file mode 100644 index 000000000..ba5ab8ee9 --- /dev/null +++ b/apps/docs/docs/integrations/nextcloud/index.mdx @@ -0,0 +1,40 @@ +--- +title: 'Nextcloud' +description: "Nextcloud is a self-hosted productivity platform that provides file storage, collaboration tools, and more." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconCalendar } from "@tabler/icons-react"; +import Alert from '@theme/Admonition'; +import { nextcloudIntegration } from '.'; +import { calendarWidget } from '@site/docs/widgets/calendar'; +import { notificationsWidget } from '@site/docs/widgets/notifications'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + Users who use 2FA will have to use Nextcloud's App Password tool to grant Homarr access, as 2FA breaks the traditional process. For more information, see [Nextcloud's Documentation](https://docs.nextcloud.com/server/stable/admin_manual/configuration_user/authentication.html#app-passwords) + , +}]} /> diff --git a/apps/docs/docs/integrations/nextcloud/index.ts b/apps/docs/docs/integrations/nextcloud/index.ts new file mode 100644 index 000000000..85c747471 --- /dev/null +++ b/apps/docs/docs/integrations/nextcloud/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const nextcloudIntegration: IntegrationDefinition = { + name: "Nextcloud", + description: + "Nextcloud is a self-hosted productivity platform that provides file storage, collaboration tools, and more.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nextcloud.svg", + path: "../../integrations/nextcloud", +}; diff --git a/apps/docs/docs/integrations/npm/index.mdx b/apps/docs/docs/integrations/npm/index.mdx new file mode 100644 index 000000000..c4d21135e --- /dev/null +++ b/apps/docs/docs/integrations/npm/index.mdx @@ -0,0 +1,34 @@ +--- +title: 'NPM' +description: "NPM is a package manager for the JavaScript programming language, primarily used for managing Node.js packages." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { npmIntegration } from '.'; +import { releasesWidget } from '@site/docs/widgets/releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/npm/index.ts b/apps/docs/docs/integrations/npm/index.ts new file mode 100644 index 000000000..34fbafb5c --- /dev/null +++ b/apps/docs/docs/integrations/npm/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const npmIntegration: IntegrationDefinition = { + name: "NPM", + description: + "NPM is a package manager for the JavaScript programming language, primarily used for managing Node.js packages.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/npm.svg", + path: "../../integrations/npm", +}; diff --git a/apps/docs/docs/integrations/ntfy/index.mdx b/apps/docs/docs/integrations/ntfy/index.mdx new file mode 100644 index 000000000..4b21d16a4 --- /dev/null +++ b/apps/docs/docs/integrations/ntfy/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'Ntfy' +description: "Ntfy is a simple, open-source notification service that allows you to send and receive notifications across devices." +hide_title: true +--- + +import { notificationsWidget } from '@site/docs/widgets/notifications'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { IconMessage } from "@tabler/icons-react"; +import { ntfyIntegration } from '.'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/ntfy/index.ts b/apps/docs/docs/integrations/ntfy/index.ts new file mode 100644 index 000000000..b30d366c9 --- /dev/null +++ b/apps/docs/docs/integrations/ntfy/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const ntfyIntegration: IntegrationDefinition = { + name: "Ntfy", + description: + "Ntfy is a simple, open-source notification service that allows you to send and receive notifications across devices.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/ntfy.svg", + path: "../../integrations/ntfy", +}; diff --git a/apps/docs/docs/integrations/nzbget/index.mdx b/apps/docs/docs/integrations/nzbget/index.mdx new file mode 100644 index 000000000..3479f317a --- /dev/null +++ b/apps/docs/docs/integrations/nzbget/index.mdx @@ -0,0 +1,36 @@ +--- +title: 'NZBGet' +description: "NZBGet is a lightweight and efficient Usenet downloader." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IconDownload } from "@tabler/icons-react"; +import { nzbgetIntegration } from '.'; +import Alert from '@theme/Admonition'; +import { downloadsWidget } from '@site/docs/widgets/downloads'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/nzbget/index.ts b/apps/docs/docs/integrations/nzbget/index.ts new file mode 100644 index 000000000..bbf9974fa --- /dev/null +++ b/apps/docs/docs/integrations/nzbget/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const nzbgetIntegration: IntegrationDefinition = { + name: "NZBGet", + description: "NZBGet is a lightweight and efficient Usenet downloader.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nzbget.svg", + path: "../../integrations/nzbget", +}; diff --git a/apps/docs/docs/integrations/open-media-vault/index.mdx b/apps/docs/docs/integrations/open-media-vault/index.mdx new file mode 100644 index 000000000..ac0a42290 --- /dev/null +++ b/apps/docs/docs/integrations/open-media-vault/index.mdx @@ -0,0 +1,42 @@ +--- +title: 'Open Media Vault' +description: "Open Media Vault is a free network-attached storage server based on the Debian operating system." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconHeartRateMonitor } from "@tabler/icons-react"; +import { openMediaVaultIntegration } from '.'; +import Alert from '@theme/Admonition' +import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; +import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + The user used here must have administrative permissions or Homarr won't be able to read the system performance and resource data. + +}]} /> \ No newline at end of file diff --git a/apps/docs/docs/integrations/open-media-vault/index.ts b/apps/docs/docs/integrations/open-media-vault/index.ts new file mode 100644 index 000000000..fe3db9ce7 --- /dev/null +++ b/apps/docs/docs/integrations/open-media-vault/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const openMediaVaultIntegration: IntegrationDefinition = { + name: "Open Media Vault", + description: "Open Media Vault is a free network-attached storage server based on the Debian operating system.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/openmediavault.svg", + path: "../../integrations/open-media-vault", +}; diff --git a/apps/docs/docs/integrations/opnsense/index.mdx b/apps/docs/docs/integrations/opnsense/index.mdx new file mode 100644 index 000000000..37e9a78c6 --- /dev/null +++ b/apps/docs/docs/integrations/opnsense/index.mdx @@ -0,0 +1,65 @@ +--- +title: 'OPNsense' +description: "OPNsense is an open-source, easy-to-use, and easy-to-build firewall and routing platform." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconHeartRateMonitor } from "@tabler/icons-react"; +import { opnsenseIntegration } from '.'; +import Alert from '@theme/Admonition' +import { firewallWidget } from '../../widgets/firewall'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + This integration does not require full API access to the firewall. The following guide outlines the process for creating a restricted OPNsense user with a scrambled password, designed exclusively for API access. This ensures minimal permissions and prevents local login capability. + , + steps: [ + "Log in to the OPNsense web interface as an administrator", + "Navigate to System → Access → Users", + "Click the + (Add) button to create a new user", + <> + Fill in the user details: +
    +
  • Username: Enter a unique name
  • +
  • Password: Leave empty
  • +
  • Scrambled Password: Enable this option
  • +
  • Full name: (Optional) Add a descriptive name
  • +
+ , + <> + In Privileges section → Select the option below: +
    +
  • Lobby: Dashboard
  • +
  • Reporting: Traffic
  • +
+ , + "Click Save", + "Return to the Users list", + "Find the user and click the ticket icon in the Commands column", + "Click Yes in the popup to confirm", + "A txt file will download automatically, containing: Key and Secret", + "Save this file securely—this information will only be shown once" + ], +}]} /> \ No newline at end of file diff --git a/apps/docs/docs/integrations/opnsense/index.ts b/apps/docs/docs/integrations/opnsense/index.ts new file mode 100644 index 000000000..f0997a142 --- /dev/null +++ b/apps/docs/docs/integrations/opnsense/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const opnsenseIntegration: IntegrationDefinition = { + name: "OPNsense", + description: "OPNsense is an open-source, easy-to-use, and easy-to-build firewall and routing platform", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/opnsense.svg", + path: "../../integrations/opnsense", +}; diff --git a/apps/docs/docs/integrations/overseerr/index.mdx b/apps/docs/docs/integrations/overseerr/index.mdx new file mode 100644 index 000000000..ce9e0a3e5 --- /dev/null +++ b/apps/docs/docs/integrations/overseerr/index.mdx @@ -0,0 +1,45 @@ +--- +title: 'Overseerr' +description: "Overseerr is a self-hosted media request management system that integrates with Plex." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconZoomQuestion, IconChartBar, IconSearch } from "@tabler/icons-react"; +import { overseerrIntegration } from '.'; +import { mediaRequestListWidget } from '@site/docs/widgets/media-request-list'; +import { mediaRequestStatsWidget } from '@site/docs/widgets/media-request-stats'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/overseerr/index.ts b/apps/docs/docs/integrations/overseerr/index.ts new file mode 100644 index 000000000..7ed5049a9 --- /dev/null +++ b/apps/docs/docs/integrations/overseerr/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const overseerrIntegration: IntegrationDefinition = { + name: "Overseerr", + description: "Overseerr is a self-hosted media request management system that integrates with Plex.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/overseerr.svg", + path: "../../integrations/overseerr", +}; diff --git a/apps/docs/docs/integrations/paperless-ngx/index.mdx b/apps/docs/docs/integrations/paperless-ngx/index.mdx new file mode 100644 index 000000000..e08840110 --- /dev/null +++ b/apps/docs/docs/integrations/paperless-ngx/index.mdx @@ -0,0 +1,41 @@ +--- +title: 'Paperless-ngx' +description: "Paperless-ngx is a document management system that transforms your physical documents into a searchable online archive." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { paperlessNgxIntegration } from '.'; +import { paperlessNgxWidget } from '@site/docs/widgets/paperless-ngx'; + + + + +Paperless-ngx provides document statistics including total documents, inbox count, correspondents, tags, and document types. + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + diff --git a/apps/docs/docs/integrations/paperless-ngx/index.ts b/apps/docs/docs/integrations/paperless-ngx/index.ts new file mode 100644 index 000000000..f5d905386 --- /dev/null +++ b/apps/docs/docs/integrations/paperless-ngx/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const paperlessNgxIntegration: IntegrationDefinition = { + name: "Paperless-ngx", + description: + "Paperless-ngx is a document management system that transforms your physical documents into a searchable online archive.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/paperless-ngx.svg", + path: "../../integrations/paperless-ngx", +}; diff --git a/apps/docs/docs/integrations/peanut/index.mdx b/apps/docs/docs/integrations/peanut/index.mdx new file mode 100644 index 000000000..751200bed --- /dev/null +++ b/apps/docs/docs/integrations/peanut/index.mdx @@ -0,0 +1,48 @@ +--- +title: 'PeaNUT' +description: 'A tiny dashboard for Network UPS Tools (NUT) servers.' +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { peaNutIntegration } from '.'; +import { upsWidget } from '@site/docs/widgets/ups'; + + + +[PeaNUT](https://github.com/Brandawg93/PeaNUT) exposes the data of your [Network UPS Tools](https://networkupstools.org/) servers +over a REST API, which Homarr reads to display the status of your UPS devices. + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets +PeaNUT secures its API with HTTP Basic authentication when the `WEB_USERNAME` and `WEB_PASSWORD` environment variables +are set on the PeaNUT instance. Provide the same credentials here. If the instance runs with `AUTH_DISABLED=true`, no +secrets are required. + + diff --git a/apps/docs/docs/integrations/peanut/index.ts b/apps/docs/docs/integrations/peanut/index.ts new file mode 100644 index 000000000..926de52a1 --- /dev/null +++ b/apps/docs/docs/integrations/peanut/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const peaNutIntegration: IntegrationDefinition = { + name: "PeaNUT", + description: "A tiny dashboard for Network UPS Tools (NUT) servers.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/peanut.svg", + path: "../../integrations/peanut", +}; diff --git a/apps/docs/docs/integrations/pi-hole/index.mdx b/apps/docs/docs/integrations/pi-hole/index.mdx new file mode 100644 index 000000000..ca2b400e7 --- /dev/null +++ b/apps/docs/docs/integrations/pi-hole/index.mdx @@ -0,0 +1,47 @@ +--- +title: 'Pi-hole' +description: "Pi-hole is a network-wide ad blocker that acts as a DNS sinkhole, blocking unwanted content and improving your browsing experience." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IconAd, IconDeviceGamepad } from "@tabler/icons-react"; +import Alert from '@theme/Admonition'; +import { dnsHoleSummaryWidget } from '@site/docs/widgets/dns-hole-summary'; +import { dnsHoleControlsWidget } from '@site/docs/widgets/dns-hole-controls'; +import { piHoleIntegration } from '.'; + + + + + + Homarr supports both Pi-hole v5 and v6. It automatically detects the version and uses the correct API. + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/pi-hole/index.ts b/apps/docs/docs/integrations/pi-hole/index.ts new file mode 100644 index 000000000..7bb8073fe --- /dev/null +++ b/apps/docs/docs/integrations/pi-hole/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const piHoleIntegration: IntegrationDefinition = { + name: "Pi-hole", + description: + "Pi-hole is a network-wide ad blocker that acts as a DNS sinkhole, blocking unwanted content and improving your browsing experience.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/pi-hole.svg", + path: "../../integrations/pi-hole", +}; diff --git a/apps/docs/docs/integrations/plex/index.mdx b/apps/docs/docs/integrations/plex/index.mdx new file mode 100644 index 000000000..b6394b918 --- /dev/null +++ b/apps/docs/docs/integrations/plex/index.mdx @@ -0,0 +1,41 @@ +--- +title: 'Plex' +description: "Plex is a media server platform that allows you to organize, manage, and stream your personal media collection." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconVideo, IconTicket } from "@tabler/icons-react"; +import { plexIntegration } from '.'; +import { mediaServerWidget } from '@site/docs/widgets/media-server'; +import { mediaReleasesWidget } from '@site/docs/widgets/media-releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + Follow the official Plex documentation to find your authentication token. + + ] +}]} /> \ No newline at end of file diff --git a/apps/docs/docs/integrations/plex/index.ts b/apps/docs/docs/integrations/plex/index.ts new file mode 100644 index 000000000..f6137ebab --- /dev/null +++ b/apps/docs/docs/integrations/plex/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const plexIntegration: IntegrationDefinition = { + name: "Plex", + description: + "Plex is a media server platform that allows you to organize, manage, and stream your personal media collection.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/plex.svg", + path: "../../integrations/plex", +}; diff --git a/apps/docs/docs/integrations/prowlarr/index.mdx b/apps/docs/docs/integrations/prowlarr/index.mdx new file mode 100644 index 000000000..0c5561f91 --- /dev/null +++ b/apps/docs/docs/integrations/prowlarr/index.mdx @@ -0,0 +1,32 @@ +--- +title: 'Prowlarr' +description: "Prowlarr is an indexer manager for Usenet and BitTorrent, providing a unified interface to manage your indexers." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconHeartRateMonitor } from "@tabler/icons-react"; +import { prowlarrIntegration } from '.'; +import { indexerManagerWidget } from '@site/docs/widgets/indexer-manager'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/prowlarr/index.ts b/apps/docs/docs/integrations/prowlarr/index.ts new file mode 100644 index 000000000..838ca8890 --- /dev/null +++ b/apps/docs/docs/integrations/prowlarr/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const prowlarrIntegration: IntegrationDefinition = { + name: "Prowlarr", + description: + "Prowlarr is an indexer manager for Usenet and BitTorrent, providing a unified interface to manage your indexers.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/prowlarr.svg", + path: "../../integrations/prowlarr", +}; diff --git a/apps/docs/docs/integrations/proxmox/index.mdx b/apps/docs/docs/integrations/proxmox/index.mdx new file mode 100644 index 000000000..4ea8eda98 --- /dev/null +++ b/apps/docs/docs/integrations/proxmox/index.mdx @@ -0,0 +1,103 @@ +--- +title: 'Proxmox' +description: "Proxmox is a powerful open-source virtualization platform that allows you to run virtual machines and containers." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconHeartRateMonitor } from "@tabler/icons-react"; +import { proxmoxIntegration } from '.'; +import Alert from '@theme/Admonition' +import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; +import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + The Proxmox API may not work with Linux PAM standard authentication. It is strongly recommended to use the Proxmox VE authentication server realm when creating your API user. + , + credentials: ['username', 'tokenId', 'realm', 'apiKey'], + steps: [ + "Navigate to the Proxmox portal, click on Datacenter", + "Expand Permissions, click on Groups", + "Click the Create button", + "Name the group something informative, like api-users", + "Click on the Permissions 'folder'", + <> + Click Add {"->"} Group Permission +
    +
  • Path: /
  • +
  • Group: group from Step 4 above
  • +
  • Role: PVEAuditor
  • +
  • Propagate: Checked
  • +
+ , + "Expand Permissions, click on Users", + <> + Click the Add button +
    +
  • User name: something informative like api
  • +
  • Realm: Proxmox VE authentication server
  • +
  • Password: create a secure password for the user
  • +
  • Confirm Password: re-enter the password
  • +
  • Group: group from Step 4 above
  • +
+ , + "Expand Permissions, click on API Tokens", + <> + Click the Add button +
    +
  • User: user from Step 8 above
  • +
  • Token ID: something informative like the application or purpose like homarr
  • +
  • Privilege Separation: unchecked
  • +
+ , + "Copy the Secret that is shown in Step 10 because it is only shown once", + "Go back to the 'Permissions' menu", + <> + Click Add {"->"} API Token Permission +
    +
  • Path: /
  • +
  • API Token: select the API token created in Step 10
  • +
  • Role: PVE Auditor
  • +
  • Propagate: Checked
  • +
+ , + ], + body: <> + + Sometimes you'll also find the api@pve!homarr format, + within Homarr you'll have to split it up into: + +
    +
  • + Username: api +
  • +
  • + Realm: pve +
  • +
  • + Token ID: homarr +
  • +
+ +}]} /> \ No newline at end of file diff --git a/apps/docs/docs/integrations/proxmox/index.ts b/apps/docs/docs/integrations/proxmox/index.ts new file mode 100644 index 000000000..0ee9d2425 --- /dev/null +++ b/apps/docs/docs/integrations/proxmox/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const proxmoxIntegration: IntegrationDefinition = { + name: "Proxmox", + description: + "Proxmox is a powerful open-source virtualization platform that allows you to run virtual machines and containers.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmox.svg", + path: "../../integrations/proxmox", +}; diff --git a/apps/docs/docs/integrations/q-bittorent/index.mdx b/apps/docs/docs/integrations/q-bittorent/index.mdx new file mode 100644 index 000000000..ae85fc0ea --- /dev/null +++ b/apps/docs/docs/integrations/q-bittorent/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'qBittorrent' +description: "qBittorrent is a free and open-source BitTorrent client." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IconDownload } from "@tabler/icons-react"; +import { qBittorentIntegration } from '.'; +import Alert from '@theme/Admonition'; +import { downloadsWidget } from '@site/docs/widgets/downloads'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/q-bittorent/index.ts b/apps/docs/docs/integrations/q-bittorent/index.ts new file mode 100644 index 000000000..4c8483639 --- /dev/null +++ b/apps/docs/docs/integrations/q-bittorent/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const qBittorentIntegration: IntegrationDefinition = { + name: "qBittorrent", + description: "qBittorrent is a free and open-source BitTorrent client.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/qbittorrent.svg", + path: "../../integrations/q-bittorent", +}; diff --git a/apps/docs/docs/integrations/quay/index.mdx b/apps/docs/docs/integrations/quay/index.mdx new file mode 100644 index 000000000..9033f81cf --- /dev/null +++ b/apps/docs/docs/integrations/quay/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'Quay' +description: "Quay is a container registry for storing and managing container images." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { quayIntegration } from '.'; +import { releasesWidget } from '@site/docs/widgets/releases'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/quay/index.ts b/apps/docs/docs/integrations/quay/index.ts new file mode 100644 index 000000000..315732bff --- /dev/null +++ b/apps/docs/docs/integrations/quay/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const quayIntegration: IntegrationDefinition = { + name: "Quay", + description: "Quay is a container registry for storing and managing container images.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/quay.png", + path: "../../integrations/quay", +}; diff --git a/apps/docs/docs/integrations/radarr/index.mdx b/apps/docs/docs/integrations/radarr/index.mdx new file mode 100644 index 000000000..286e1b0b7 --- /dev/null +++ b/apps/docs/docs/integrations/radarr/index.mdx @@ -0,0 +1,33 @@ +--- +title: 'Radarr' +description: "Radarr is a movie management tool that automates the process of downloading, sorting, and renaming movies." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconCalendar } from "@tabler/icons-react"; +import { radarrIntegration } from '.'; +import { calendarWidget } from '@site/docs/widgets/calendar'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/radarr/index.ts b/apps/docs/docs/integrations/radarr/index.ts new file mode 100644 index 000000000..e4bfe0bad --- /dev/null +++ b/apps/docs/docs/integrations/radarr/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const radarrIntegration: IntegrationDefinition = { + name: "Radarr", + description: + "Radarr is a movie management tool that automates the process of downloading, sorting, and renaming movies.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/radarr.svg", + path: "../../integrations/radarr", +}; diff --git a/apps/docs/docs/integrations/readarr/index.mdx b/apps/docs/docs/integrations/readarr/index.mdx new file mode 100644 index 000000000..a2c153a91 --- /dev/null +++ b/apps/docs/docs/integrations/readarr/index.mdx @@ -0,0 +1,33 @@ +--- +title: 'Readarr' +description: "Readarr is a book management tool that automates the process of downloading, sorting, and renaming books." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconCalendar } from "@tabler/icons-react"; +import { readarrIntegration } from '.'; +import { calendarWidget } from '@site/docs/widgets/calendar'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/readarr/index.ts b/apps/docs/docs/integrations/readarr/index.ts new file mode 100644 index 000000000..3742c9639 --- /dev/null +++ b/apps/docs/docs/integrations/readarr/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const readarrIntegration: IntegrationDefinition = { + name: "Readarr", + description: + "Readarr is a book management tool that automates the process of downloading, sorting, and renaming books.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/readarr.svg", + path: "../../integrations/readarr", +}; diff --git a/apps/docs/docs/integrations/sabnzbd/index.mdx b/apps/docs/docs/integrations/sabnzbd/index.mdx new file mode 100644 index 000000000..5de72d8c3 --- /dev/null +++ b/apps/docs/docs/integrations/sabnzbd/index.mdx @@ -0,0 +1,34 @@ +--- +title: 'SABnzbd' +description: "SABnzbd is an Open Source Binary Newsreader." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IconDownload } from "@tabler/icons-react"; +import { sabnzbdIntegration } from '.'; +import Alert from '@theme/Admonition'; +import { downloadsWidget } from '@site/docs/widgets/downloads'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/sabnzbd/index.ts b/apps/docs/docs/integrations/sabnzbd/index.ts new file mode 100644 index 000000000..a3eb079b3 --- /dev/null +++ b/apps/docs/docs/integrations/sabnzbd/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const sabnzbdIntegration: IntegrationDefinition = { + name: "SABnzbd", + description: "SABnzbd is an Open Source Binary Newsreader.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/sabnzbd.svg", + path: "../../integrations/sabnzbd", +}; diff --git a/apps/docs/docs/integrations/search-ch/index.mdx b/apps/docs/docs/integrations/search-ch/index.mdx new file mode 100644 index 000000000..6286d5cca --- /dev/null +++ b/apps/docs/docs/integrations/search-ch/index.mdx @@ -0,0 +1,28 @@ +--- +title: 'Search.ch' +description: "Search.ch supports searching for timetables in Switzerland." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IconDownload } from "@tabler/icons-react"; +import { searchChIntegration } from '.'; +import Alert from '@theme/Admonition'; +import { timetableWidget } from '@site/docs/widgets/timetable'; + + + + +### Widgets & Capabilities + + +### Adding the integration + \ No newline at end of file diff --git a/apps/docs/docs/integrations/search-ch/index.ts b/apps/docs/docs/integrations/search-ch/index.ts new file mode 100644 index 000000000..6c5819d67 --- /dev/null +++ b/apps/docs/docs/integrations/search-ch/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const searchChIntegration: IntegrationDefinition = { + name: "Search.ch", + description: "Search.ch supports searching for timetables in Switzerland.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/search-ch.png", + path: "../../integrations/search-ch", +}; diff --git a/apps/docs/docs/integrations/seerr/index.mdx b/apps/docs/docs/integrations/seerr/index.mdx new file mode 100644 index 000000000..81b7e0fb1 --- /dev/null +++ b/apps/docs/docs/integrations/seerr/index.mdx @@ -0,0 +1,45 @@ +--- +title: 'Seerr' +description: "Seerr is a self-hosted media request management system that integrates with various media servers." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconZoomQuestion, IconChartBar, IconSearch } from "@tabler/icons-react"; +import { seerrIntegration } from '.'; +import { mediaRequestListWidget } from '@site/docs/widgets/media-request-list'; +import { mediaRequestStatsWidget } from '@site/docs/widgets/media-request-stats'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/seerr/index.ts b/apps/docs/docs/integrations/seerr/index.ts new file mode 100644 index 000000000..91d72b7c4 --- /dev/null +++ b/apps/docs/docs/integrations/seerr/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const seerrIntegration: IntegrationDefinition = { + name: "Seerr", + description: "Seerr is a self-hosted media request management system that integrates with various media servers.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/seerr.svg", + path: "../../integrations/seerr", +}; diff --git a/apps/docs/docs/integrations/slskd/index.mdx b/apps/docs/docs/integrations/slskd/index.mdx new file mode 100644 index 000000000..70674cb04 --- /dev/null +++ b/apps/docs/docs/integrations/slskd/index.mdx @@ -0,0 +1,34 @@ +--- +title: 'Slskd' +description: "A modern client-server application for the Soulseek file sharing network." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { slskdIntegration } from '.'; +import { downloadsWidget } from '@site/docs/widgets/downloads'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/slskd/index.ts b/apps/docs/docs/integrations/slskd/index.ts new file mode 100644 index 000000000..57a52c0f5 --- /dev/null +++ b/apps/docs/docs/integrations/slskd/index.ts @@ -0,0 +1,11 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const slskdIntegration: IntegrationDefinition = { + name: "Slskd", + description: "A modern client-server application for the Soulseek file sharing network.", + iconUrl: { + light: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/slskd.svg", + dark: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/slskd.svg", + }, + path: "../../integrations/slskd", +}; diff --git a/apps/docs/docs/integrations/sonarr/index.mdx b/apps/docs/docs/integrations/sonarr/index.mdx new file mode 100644 index 000000000..7dc3c7a64 --- /dev/null +++ b/apps/docs/docs/integrations/sonarr/index.mdx @@ -0,0 +1,33 @@ +--- +title: 'Sonarr' +description: "Sonarr is a TV series management tool that automates the process of downloading, sorting, and renaming episodes." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconCalendar } from "@tabler/icons-react"; +import { sonarrIntegration } from '.'; +import { calendarWidget } from '@site/docs/widgets/calendar'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/sonarr/index.ts b/apps/docs/docs/integrations/sonarr/index.ts new file mode 100644 index 000000000..f77f29659 --- /dev/null +++ b/apps/docs/docs/integrations/sonarr/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const sonarrIntegration: IntegrationDefinition = { + name: "Sonarr", + description: + "Sonarr is a TV series management tool that automates the process of downloading, sorting, and renaming episodes.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/sonarr.svg", + path: "../../integrations/sonarr", +}; diff --git a/apps/docs/docs/integrations/speedtest-tracker/index.mdx b/apps/docs/docs/integrations/speedtest-tracker/index.mdx new file mode 100644 index 000000000..2041dad5c --- /dev/null +++ b/apps/docs/docs/integrations/speedtest-tracker/index.mdx @@ -0,0 +1,34 @@ +--- +title: 'Speedtest Tracker' +description: 'Speedtest Tracker is a self-hosted internet performance tracking application.' +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { speedtestTrackerIntegration } from '.'; +import { speedtestTrackerWidget } from '@site/docs/widgets/speedtest-tracker'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + diff --git a/apps/docs/docs/integrations/speedtest-tracker/index.ts b/apps/docs/docs/integrations/speedtest-tracker/index.ts new file mode 100644 index 000000000..2abb51cff --- /dev/null +++ b/apps/docs/docs/integrations/speedtest-tracker/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const speedtestTrackerIntegration: IntegrationDefinition = { + name: "Speedtest Tracker", + description: "Speedtest Tracker is a self-hosted internet performance tracking application.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/speedtest-tracker.png", + path: "../../integrations/speedtest-tracker", +}; diff --git a/apps/docs/docs/integrations/tdarr/index.mdx b/apps/docs/docs/integrations/tdarr/index.mdx new file mode 100644 index 000000000..89a0730d2 --- /dev/null +++ b/apps/docs/docs/integrations/tdarr/index.mdx @@ -0,0 +1,36 @@ +--- +title: 'Tdarr' +description: "Tdarr is a distributed media transcoding system that allows you to process and optimize your media files across multiple nodes." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconTransform } from "@tabler/icons-react"; +import { tdarrIntegration } from '.'; +import { mediaTranscodingWidget } from '@site/docs/widgets/media-transcoding'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/tdarr/index.ts b/apps/docs/docs/integrations/tdarr/index.ts new file mode 100644 index 000000000..f42b04017 --- /dev/null +++ b/apps/docs/docs/integrations/tdarr/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const tdarrIntegration: IntegrationDefinition = { + name: "Tdarr", + description: + "Tdarr is a distributed media transcoding system that allows you to process and optimize your media files across multiple nodes.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tdarr.png", + path: "../../integrations/tdarr", +}; diff --git a/apps/docs/docs/integrations/technitium-dns/index.mdx b/apps/docs/docs/integrations/technitium-dns/index.mdx new file mode 100644 index 000000000..f7b3ce340 --- /dev/null +++ b/apps/docs/docs/integrations/technitium-dns/index.mdx @@ -0,0 +1,62 @@ +--- +title: 'Technitium DNS' +description: "Technitium DNS Server is a self-hosted DNS server with ad-blocking and network-wide filtering capabilities." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import Alert from '@theme/Admonition'; +import { technitiumDnsIntegration } from '.'; +import { dnsHoleSummaryWidget } from '@site/docs/widgets/dns-hole-summary'; +import { dnsHoleControlsWidget } from '@site/docs/widgets/dns-hole-controls'; + + + + + Homarr supports Technitium DNS v11 and above. The correct API version is detected automatically — no manual configuration is required. + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + + The **API token** option is recommended. API tokens are non-expiring and do not require storing your admin password in Homarr. + Username and password authentication uses a session token that expires after inactivity, triggering a silent re-login on the next request. + + + + The **DNS Hole Controls** widget (enabling, disabling, and timed disabling of blocking) requires the token to have settings-level permissions. + The **DNS Hole Summary** widget (stats only) works with any valid token. + If Homarr cannot read the blocking status due to insufficient permissions, the status indicator will be hidden but statistics will still be shown. + + + diff --git a/apps/docs/docs/integrations/technitium-dns/index.ts b/apps/docs/docs/integrations/technitium-dns/index.ts new file mode 100644 index 000000000..f98c2a250 --- /dev/null +++ b/apps/docs/docs/integrations/technitium-dns/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const technitiumDnsIntegration: IntegrationDefinition = { + name: "Technitium DNS", + description: + "Technitium DNS Server is a self-hosted DNS server with ad-blocking and network-wide filtering capabilities.", + iconUrl: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/technitium.svg", + path: "../../integrations/technitium-dns", +}; diff --git a/apps/docs/docs/integrations/tracearr/index.mdx b/apps/docs/docs/integrations/tracearr/index.mdx new file mode 100644 index 000000000..dc4dde8e0 --- /dev/null +++ b/apps/docs/docs/integrations/tracearr/index.mdx @@ -0,0 +1,38 @@ +--- +title: 'Tracearr' +description: "Tracearr is a comprehensive media monitoring solution that tracks streams, user activity, and policy violations in your media server (including Plex, Jellyfin, Emby)." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { tracearrIntegration } from '.'; +import { tracearrWidget } from '@site/docs/widgets/tracearr'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + In Tracearr, go to Settings → API and generate or copy your API key. + + ] +}]} /> diff --git a/apps/docs/docs/integrations/tracearr/index.ts b/apps/docs/docs/integrations/tracearr/index.ts new file mode 100644 index 000000000..3560bb2fa --- /dev/null +++ b/apps/docs/docs/integrations/tracearr/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const tracearrIntegration: IntegrationDefinition = { + name: "Tracearr", + description: + "Tracearr is a comprehensive media monitoring solution that tracks streams, user activity, and policy violations in your media server.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/tracearr.svg", + path: "../../integrations/tracearr", +}; diff --git a/apps/docs/docs/integrations/transmission/index.mdx b/apps/docs/docs/integrations/transmission/index.mdx new file mode 100644 index 000000000..da0c0209e --- /dev/null +++ b/apps/docs/docs/integrations/transmission/index.mdx @@ -0,0 +1,34 @@ +--- +title: 'Transmission' +description: "A Fast, Easy and Free Bittorrent Client." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IconDownload } from "@tabler/icons-react"; +import { transmissionIntegration } from '.'; +import Alert from '@theme/Admonition'; +import { downloadsWidget } from '@site/docs/widgets/downloads'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/transmission/index.ts b/apps/docs/docs/integrations/transmission/index.ts new file mode 100644 index 000000000..8e2c5e8bc --- /dev/null +++ b/apps/docs/docs/integrations/transmission/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const transmissionIntegration: IntegrationDefinition = { + name: "Transmission", + description: "A Fast, Easy and Free Bittorrent Client.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/transmission.svg", + path: "../../integrations/transmission", +}; diff --git a/apps/docs/docs/integrations/truenas/index.mdx b/apps/docs/docs/integrations/truenas/index.mdx new file mode 100644 index 000000000..fb0559f06 --- /dev/null +++ b/apps/docs/docs/integrations/truenas/index.mdx @@ -0,0 +1,61 @@ +--- +title: 'TrueNAS' +description: "Enterprise network-attached storage for your home, office, and cloud." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { truenasIntegration } from '.'; +import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; +import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; +import Alert from '@theme/Admonition'; + + + + +### Widgets & Capabilities + + +### Adding the integration + + + + TrueNAS only serves its API over HTTPS, so enter the https:// URL of your TrueNAS web interface. If it uses a self-signed certificate (the default), add it under Management > Tools > Certificates so Homarr can establish the connection. + + +### Secrets + + API key authentication is the recommended method. It works across current TrueNAS versions and does not depend on user group membership. + , + steps: [ + "In the TrueNAS web interface, click your user avatar in the top-right corner and select \"API Keys\".", + "Click \"Add\", give the key a name such as \"Homarr\", and confirm.", + "Copy the generated key immediately — TrueNAS only shows it once — and paste it as the API Key when creating the integration in Homarr.", + ], + }, + { + credentials: ['username', 'password'], + steps: [ + "In the TrueNAS web interface, go to \"Credentials\" > \"Users\" > \"Add\" and create a user with a secure password.", + "Grant the user administrative access so Homarr can read system, pool, and reporting data.", + "Save the user and create the integration in Homarr with these credentials.", + ], + body: + The account must have administrative API access. The auxiliary_administrator group was removed in TrueNAS 25.10; on that version or newer, use API key authentication instead, or assign the user a full-admin role. + , + }, +]} /> diff --git a/apps/docs/docs/integrations/truenas/index.ts b/apps/docs/docs/integrations/truenas/index.ts new file mode 100644 index 000000000..4c8ce3ca9 --- /dev/null +++ b/apps/docs/docs/integrations/truenas/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const truenasIntegration: IntegrationDefinition = { + name: "TrueNAS", + description: "Enterprise network-attached storage for your home, office, and cloud.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/truenas.svg", + path: "../../integrations/truenas", +}; diff --git a/apps/docs/docs/integrations/umami/index.mdx b/apps/docs/docs/integrations/umami/index.mdx new file mode 100644 index 000000000..864289f5b --- /dev/null +++ b/apps/docs/docs/integrations/umami/index.mdx @@ -0,0 +1,53 @@ +--- +title: 'Umami' +description: 'Privacy-focused, open-source web analytics' +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { umamiIntegration } from '.'; +import { umamiWidget } from '../../widgets/umami'; + + + +### Widgets & Capabilities + + +### Adding the integration + + +:::tip URL configuration +- **Umami Cloud:** Use `https://api.umami.is/v1` +- **Self-hosted:** Use `http://your-umami-host:3000/api` +::: + +### Secrets + diff --git a/apps/docs/docs/integrations/umami/index.ts b/apps/docs/docs/integrations/umami/index.ts new file mode 100644 index 000000000..97a432e21 --- /dev/null +++ b/apps/docs/docs/integrations/umami/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const umamiIntegration: IntegrationDefinition = { + name: "Umami", + description: "Privacy-focused, open-source web analytics", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/umami.svg", + path: "../../integrations/umami", +}; diff --git a/apps/docs/docs/integrations/unifi-controller/index.mdx b/apps/docs/docs/integrations/unifi-controller/index.mdx new file mode 100644 index 000000000..134ce91b8 --- /dev/null +++ b/apps/docs/docs/integrations/unifi-controller/index.mdx @@ -0,0 +1,40 @@ +--- +title: 'Unifi Controller' +description: "Unifi Controller is a network management platform for Unifi devices." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IconTopologyFull } from "@tabler/icons-react"; +import { unifiControllerIntegration } from '.'; +import { networkControllerSummaryWidget } from '@site/docs/widgets/network-controller-summary'; +import { networkControllerStatusWidget } from '@site/docs/widgets/network-controller-status'; + + + + +This integration is using the [node-unifi](https://www.npmjs.com/package/node-unifi) library under the hood to connect to the Unifi Controller. +Therfore it should support CloudKey Gen1, CloudKey Gen2, UnifiOS-based UDM-Pro controllers as well as self-hosted UniFi controllers. + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + \ No newline at end of file diff --git a/apps/docs/docs/integrations/unifi-controller/index.ts b/apps/docs/docs/integrations/unifi-controller/index.ts new file mode 100644 index 000000000..c488a92f0 --- /dev/null +++ b/apps/docs/docs/integrations/unifi-controller/index.ts @@ -0,0 +1,7 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const unifiControllerIntegration: IntegrationDefinition = { + name: "Unifi Controller", + description: "Unifi Controller is a network management platform for Unifi devices.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/unifi.svg", + path: "../../integrations/unifi-controller", +}; diff --git a/apps/docs/docs/integrations/unraid/imgs/copy-api-key.png b/apps/docs/docs/integrations/unraid/imgs/copy-api-key.png new file mode 100644 index 000000000..51796ceac Binary files /dev/null and b/apps/docs/docs/integrations/unraid/imgs/copy-api-key.png differ diff --git a/apps/docs/docs/integrations/unraid/imgs/unraid-create-api-key.png b/apps/docs/docs/integrations/unraid/imgs/unraid-create-api-key.png new file mode 100644 index 000000000..db9f36c1c Binary files /dev/null and b/apps/docs/docs/integrations/unraid/imgs/unraid-create-api-key.png differ diff --git a/apps/docs/docs/integrations/unraid/imgs/unraid-management.png b/apps/docs/docs/integrations/unraid/imgs/unraid-management.png new file mode 100644 index 000000000..80583a63c Binary files /dev/null and b/apps/docs/docs/integrations/unraid/imgs/unraid-management.png differ diff --git a/apps/docs/docs/integrations/unraid/imgs/unraid-select-api-key-preset.png b/apps/docs/docs/integrations/unraid/imgs/unraid-select-api-key-preset.png new file mode 100644 index 000000000..7a072b8d0 Binary files /dev/null and b/apps/docs/docs/integrations/unraid/imgs/unraid-select-api-key-preset.png differ diff --git a/apps/docs/docs/integrations/unraid/index.mdx b/apps/docs/docs/integrations/unraid/index.mdx new file mode 100644 index 000000000..bd1546a78 --- /dev/null +++ b/apps/docs/docs/integrations/unraid/index.mdx @@ -0,0 +1,59 @@ +--- +title: 'Unraid' +description: "Versatile operating system that lets you run applications, virtual machines, and storage devices on your server" +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { unraidIntegration } from '.'; +import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; +import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; + +import imgManagement from "./imgs/unraid-management.png"; +import imgCreateApiKey from "./imgs/unraid-create-api-key.png"; +import imgCopyApiKey from "./imgs/copy-api-key.png"; +import imgSelectApikeyPreset from "./imgs/unraid-select-api-key-preset.png"; + + + + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets +Are you using Unraid pre-7.2? If yes, please first follow the steps here to install the Unraid API., + <> + Open the settings and open the management access
+ Unraid management + , + <> + Click on the "API Keys" tab at the top and click on the "create API key" button. Choose "Create new"
+ Unraid management + , + <> + Enter a suitable name for your API key (e.g. Homarr), select the "Viewer" preset and submit the modal.
+ Unraid management + , + <> + Last, copy the API key after your API key has been created
+ Unraid management + + ], +}]} /> \ No newline at end of file diff --git a/apps/docs/docs/integrations/unraid/index.ts b/apps/docs/docs/integrations/unraid/index.ts new file mode 100644 index 000000000..5ea75c090 --- /dev/null +++ b/apps/docs/docs/integrations/unraid/index.ts @@ -0,0 +1,8 @@ +import { IntegrationDefinition } from "@site/src/types"; +export const unraidIntegration: IntegrationDefinition = { + name: "Unraid", + description: + "Versatile operating system that lets you run applications, virtual machines, and storage devices on your server", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/unraid.svg", + path: "../../integrations/unraid", +}; diff --git a/apps/docs/docs/integrations/uptime-kuma/index.mdx b/apps/docs/docs/integrations/uptime-kuma/index.mdx new file mode 100644 index 000000000..63e6df82b --- /dev/null +++ b/apps/docs/docs/integrations/uptime-kuma/index.mdx @@ -0,0 +1,44 @@ +--- +title: 'Uptime Kuma' +description: "Uptime Kuma is a self-hosted monitoring tool that tracks the availability of your services and websites." +hide_title: true +--- + +import { IntegrationHeader } from '@site/src/components/integrations/header'; +import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { AddingIntegration } from '@site/src/components/integrations/adding'; +import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { uptimeKumaIntegration } from '.'; +import { uptimeKumaWidget } from '@site/docs/widgets/uptime-kuma'; + + + + +Uptime Kuma monitors the availability of your services and provides uptime statistics through its status page API. + +### Widgets & Capabilities + + +### Adding the integration + + +### Secrets + + +:::tip +If you don't specify a slug, Homarr will use `default` as the status page slug. +::: diff --git a/apps/docs/docs/integrations/uptime-kuma/index.ts b/apps/docs/docs/integrations/uptime-kuma/index.ts new file mode 100644 index 000000000..b048eba81 --- /dev/null +++ b/apps/docs/docs/integrations/uptime-kuma/index.ts @@ -0,0 +1,9 @@ +import { IntegrationDefinition } from "@site/src/types"; + +export const uptimeKumaIntegration: IntegrationDefinition = { + name: "Uptime Kuma", + description: + "Uptime Kuma is a self-hosted monitoring tool that tracks the availability of your services and websites.", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/uptime-kuma.svg", + path: "../../integrations/uptime-kuma", +}; diff --git a/apps/docs/docs/management/_category_.json b/apps/docs/docs/management/_category_.json new file mode 100644 index 000000000..e3b87148d --- /dev/null +++ b/apps/docs/docs/management/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Management", + "collapsed": true, + "position": 2, + "link": { + "type": "generated-index", + "title": "Management pages" + } +} diff --git a/apps/docs/docs/management/api/index.mdx b/apps/docs/docs/management/api/index.mdx new file mode 100644 index 000000000..678e54783 --- /dev/null +++ b/apps/docs/docs/management/api/index.mdx @@ -0,0 +1,84 @@ +--- +title: API +tags: + - API + - Development + - Interface +--- + +import { ApiReferenceReact } from "@scalar/api-reference-react" + +Using the Homarr API, you can interface with the application with your own code and business logic. +It enables you to trigger almost all actions that you can perform from the Homarr UI. +With the API, you can build resilient systems that automatically update Homarr with data - for example syncing it with +your deployments in a cluster or dynamically adding integrations depending on how many replicas you run. + +This page is language-neutral, and you must implement the API on your own in your desired language. +It requires you to know your programming language well and have a basic understanding of HTTP, JSON and networking. +You can test out API endpoints using any OpenAPI client - for example [Postman](https://www.postman.com/), [Insomnia](https://insomnia.rest/) or [Hoppscotch](https://hoppscotch.io/). + +## Opening the API specification +The specification is implemented according to the OpenAPI standard. +To access the documentation, you'll need to spin up an instance of Homarr. +Navigate to ``Management`` > ``Tools`` > ``API``. +You can copy the JSON url into your OpenAPI client or try out the endpoints directly from your browser. + +## Authentication +Many endpoints will require you to authenticate. At the top of the API reference, you'll find a button to authenticate yourself with an API key. +You can obtain API keys from the "Authentication" tab at the top of the page. +API keys will not expire and can be used indefinitely. + +### API Key Format +API keys are provided in the format `.`. When making requests, include the key in the `ApiKey` header: + +``` +ApiKey: abc123def456.xyz789tokenvalue... +``` + +### Supported Endpoints +API key authentication works with both endpoint types: + +| Endpoint Type | Path Pattern | API Key Support | +|--------------|--------------|-----------------| +| OpenAPI | `/api/...` | ✅ Supported | +| tRPC | `/api/trpc/...` | ✅ Supported | + +If no API key is provided, Homarr falls back to session cookie authentication (for browser-based access). + +### Usage Examples + +**OpenAPI endpoint:** +```bash +curl -H 'ApiKey: .' http://localhost:7575/api/health/live +``` + +**tRPC endpoint:** +```bash +curl -H 'ApiKey: .' http://localhost:7575/api/trpc/app.all +``` + +### Use Cases +API key authentication enables programmatic access for: +- Automation scripts and CI/CD pipelines +- Third-party integrations +- Custom dashboards and monitoring tools +- Container orchestration systems that need to sync app definitions + +## Specification + +:::info + +This section is automatically being updated hourly. +Last update: +``TEST`` + +::: + + diff --git a/apps/docs/docs/management/apps/img/app-icon-url.png b/apps/docs/docs/management/apps/img/app-icon-url.png new file mode 100644 index 000000000..827ee9ad1 Binary files /dev/null and b/apps/docs/docs/management/apps/img/app-icon-url.png differ diff --git a/apps/docs/docs/management/apps/img/app-list.png b/apps/docs/docs/management/apps/img/app-list.png new file mode 100644 index 000000000..8cf271cc2 Binary files /dev/null and b/apps/docs/docs/management/apps/img/app-list.png differ diff --git a/apps/docs/docs/management/apps/img/new-app-button.png b/apps/docs/docs/management/apps/img/new-app-button.png new file mode 100644 index 000000000..236c5961f Binary files /dev/null and b/apps/docs/docs/management/apps/img/new-app-button.png differ diff --git a/apps/docs/docs/management/apps/img/new-app-form.png b/apps/docs/docs/management/apps/img/new-app-form.png new file mode 100644 index 000000000..9da2b018c Binary files /dev/null and b/apps/docs/docs/management/apps/img/new-app-form.png differ diff --git a/apps/docs/docs/management/apps/index.mdx b/apps/docs/docs/management/apps/index.mdx new file mode 100644 index 000000000..c5c0a2ad7 --- /dev/null +++ b/apps/docs/docs/management/apps/index.mdx @@ -0,0 +1,53 @@ +--- +title: Apps +tags: + - Management + - Apps + - Bookmarks + - Ping +--- + +Apps are the building blocks of your Homarr board. +Most of the time they are a simple link to a website, but used on your board they also support a simple ping to check if your service is up. +Apps are used in the bookmark and app widget. + +## Create an app + +To create an app you can click on the button on the top right of the apps management page: + +![New app button](./img/new-app-button.png) + +Next, you'll need to fill out the required fields to configure the app: + +![New app form](./img/new-app-form.png) + +### Name + +The name must be at least one character long and can be chosen freely. + +### Icon URL + +This is the URL to the icon that will be displayed on the app widget. +It can be a url to an image in the internet, one from the included icon repositories or a local file uploaded through the upload button. + +![Icon URL](./img/app-icon-url.png) + +### Description + +An optional description that can be shown as tooltip on the app widget. + +### URL + +The URL to the website you want to link to. Clicking on the app widget or bookmark will open this URL. + +### Ping URL + +When you want to use another url for the simple status check you can set it here. +This will allow you to set a different URL for the ping than the URL that is opened when clicking on the app widget. +It's useful when you want to ping the service internally for example with a custom ip but open the website externally. + +## List of apps + +On the apps management page you find all apps that exist in your Homarr instance. You can edit and delete them. + +![Apps list](./img/app-list.png) \ No newline at end of file diff --git a/apps/docs/docs/management/boards/img/background-repeat.png b/apps/docs/docs/management/boards/img/background-repeat.png new file mode 100644 index 000000000..897c0ad0f Binary files /dev/null and b/apps/docs/docs/management/boards/img/background-repeat.png differ diff --git a/apps/docs/docs/management/boards/img/change-user-permission-level.png b/apps/docs/docs/management/boards/img/change-user-permission-level.png new file mode 100644 index 000000000..db055b7a3 Binary files /dev/null and b/apps/docs/docs/management/boards/img/change-user-permission-level.png differ diff --git a/apps/docs/docs/management/boards/img/create-board-modal.png b/apps/docs/docs/management/boards/img/create-board-modal.png new file mode 100644 index 000000000..a3f9322fc Binary files /dev/null and b/apps/docs/docs/management/boards/img/create-board-modal.png differ diff --git a/apps/docs/docs/management/boards/img/duplicate-board-modal.png b/apps/docs/docs/management/boards/img/duplicate-board-modal.png new file mode 100644 index 000000000..a94819d17 Binary files /dev/null and b/apps/docs/docs/management/boards/img/duplicate-board-modal.png differ diff --git a/apps/docs/docs/management/boards/img/home-board-flag.png b/apps/docs/docs/management/boards/img/home-board-flag.png new file mode 100644 index 000000000..99522cafb Binary files /dev/null and b/apps/docs/docs/management/boards/img/home-board-flag.png differ diff --git a/apps/docs/docs/management/boards/img/icon-color.png b/apps/docs/docs/management/boards/img/icon-color.png new file mode 100644 index 000000000..63f9ddad1 Binary files /dev/null and b/apps/docs/docs/management/boards/img/icon-color.png differ diff --git a/apps/docs/docs/management/boards/img/item-radius.png b/apps/docs/docs/management/boards/img/item-radius.png new file mode 100644 index 000000000..297d69577 Binary files /dev/null and b/apps/docs/docs/management/boards/img/item-radius.png differ diff --git a/apps/docs/docs/management/boards/img/layout-large.png b/apps/docs/docs/management/boards/img/layout-large.png new file mode 100644 index 000000000..e6e9db61f Binary files /dev/null and b/apps/docs/docs/management/boards/img/layout-large.png differ diff --git a/apps/docs/docs/management/boards/img/layout-medium.png b/apps/docs/docs/management/boards/img/layout-medium.png new file mode 100644 index 000000000..cac88810f Binary files /dev/null and b/apps/docs/docs/management/boards/img/layout-medium.png differ diff --git a/apps/docs/docs/management/boards/img/layout-settings.png b/apps/docs/docs/management/boards/img/layout-settings.png new file mode 100644 index 000000000..7266015cd Binary files /dev/null and b/apps/docs/docs/management/boards/img/layout-settings.png differ diff --git a/apps/docs/docs/management/boards/img/layout-small.png b/apps/docs/docs/management/boards/img/layout-small.png new file mode 100644 index 000000000..da94f7786 Binary files /dev/null and b/apps/docs/docs/management/boards/img/layout-small.png differ diff --git a/apps/docs/docs/management/boards/img/meta-title.png b/apps/docs/docs/management/boards/img/meta-title.png new file mode 100644 index 000000000..bd6fa23ec Binary files /dev/null and b/apps/docs/docs/management/boards/img/meta-title.png differ diff --git a/apps/docs/docs/management/boards/img/navigate-to-settings-2.png b/apps/docs/docs/management/boards/img/navigate-to-settings-2.png new file mode 100644 index 000000000..9f8f7d42c Binary files /dev/null and b/apps/docs/docs/management/boards/img/navigate-to-settings-2.png differ diff --git a/apps/docs/docs/management/boards/img/navigate-to-settings.png b/apps/docs/docs/management/boards/img/navigate-to-settings.png new file mode 100644 index 000000000..1b97f0366 Binary files /dev/null and b/apps/docs/docs/management/boards/img/navigate-to-settings.png differ diff --git a/apps/docs/docs/management/boards/img/page-title.png b/apps/docs/docs/management/boards/img/page-title.png new file mode 100644 index 000000000..39f43046f Binary files /dev/null and b/apps/docs/docs/management/boards/img/page-title.png differ diff --git a/apps/docs/docs/management/boards/img/set-as-home-board-menu.png b/apps/docs/docs/management/boards/img/set-as-home-board-menu.png new file mode 100644 index 000000000..48b5ae803 Binary files /dev/null and b/apps/docs/docs/management/boards/img/set-as-home-board-menu.png differ diff --git a/apps/docs/docs/management/boards/img/set-home-board-global.png b/apps/docs/docs/management/boards/img/set-home-board-global.png new file mode 100644 index 000000000..40ba2309f Binary files /dev/null and b/apps/docs/docs/management/boards/img/set-home-board-global.png differ diff --git a/apps/docs/docs/management/boards/img/set-home-board-other-user.png b/apps/docs/docs/management/boards/img/set-home-board-other-user.png new file mode 100644 index 000000000..88c52a0f7 Binary files /dev/null and b/apps/docs/docs/management/boards/img/set-home-board-other-user.png differ diff --git a/apps/docs/docs/management/boards/img/set-home-board-user-group.png b/apps/docs/docs/management/boards/img/set-home-board-user-group.png new file mode 100644 index 000000000..ba86ccb14 Binary files /dev/null and b/apps/docs/docs/management/boards/img/set-home-board-user-group.png differ diff --git a/apps/docs/docs/management/boards/index.mdx b/apps/docs/docs/management/boards/index.mdx new file mode 100644 index 000000000..f1eb3c572 --- /dev/null +++ b/apps/docs/docs/management/boards/index.mdx @@ -0,0 +1,258 @@ +--- +title: Boards +tags: + - Management + - Boards + - Customization + - Edit mode + - Responsive + - Layout +--- + +import iconColorImage from './img/icon-color.png' +import itemRadiusImage from './img/item-radius.png' +import layoutLargeImage from './img/layout-large.png' +import layoutMediumImage from './img/layout-medium.png' +import layoutSmallImage from './img/layout-small.png' + +Each dashboard is called a "board". +You can create as many boards as you want. +Boards can be restricted to user groups. +A user may also have a "home board" which they will see at the root path (e.g. my-homarr.com or my-homarr.com/board). +Other boards can be viewed by direct links (e.g. my-homarr.com/board/smart-home) or via the management pages. + +Names of boards must be unique because this will be used in the URL to load the desired board. + +## Create a new board +When creating a board, the availability of the board name will be checked for you. + +![](./img/create-board-modal.png) + +### Name +The name must not include any special characters and must be at least one character long. +Underscores and hyphen-minus are allowed. + +### Column count +Homarr has a complex drag and drop system that can be used from the browser. +The column count defines how many horizontal columns are available to drag and drop elements to. + +### Public +This will enable public access for everyone - regardless of whether they are logged in or not. +This can be really useful if you want to have public boards in your company or for family and fiends. +Modifications for public boards must be allowed explicitly using user groups and their permissions. + +## Board settings +You navigate to the board settings by clicking on these three dots: + +![](./img/navigate-to-settings.png) + +Alternatively, you can also navigate from the board page itself using the cog icon at the top right: + +![](./img/navigate-to-settings-2.png) + +### General +#### Page title +This is the title that will be visible at the top left in the navigation bar: + +![](./img/page-title.png) + +This field is optional and Homarr will fall back to "Homarr" if nothing is set. + +#### Meta title +This is the secondary title of the page that is not directly visible in the page itself. +Browser will use it to set the title of tabs: + +![](./img/meta-title.png) + +Homarr will fall back to the board name and a suffix if nothing is set. + +#### Logo image URL +This is the URL that is used for the image at the top left. +Homarr will fall back to the Homarr logo if nothing is set. + +#### Favicon image URL +This is the URL that is used for the favicon in the tab title. +Homarr will fall back to the Homarr logo if nothing is set. + +### Layout + +In this section you can configure the different responsive layouts. Depending on your screens width the layout will change. + +![](./img/layout-settings.png) + +On each element the position and size of items can be changed seperately. +When adding a new layout the position and sizes will automatically be generated depending on the column count. +When adding a new item / dynamic section that will always be 1x1 on each layout and placed on the first available position. + +#### Name + +The name of the layout can be choosen freely. It is only used for the management and will not be visible on the board. + +#### Column count + +Amount of columns for this layout. Defines how many items can be placed in a row. When changed it will automatically adjust the position and size of the items. + +#### Breakpoint + +Minimum width of the screen where the layout will be used. +Once the minmum of the next layout is reached the layout will change. + +#### Preview + + + + + +### Background +#### Background image URL +Homarr can display a background image behind apps and widgets. +This URL can be used to define what image should be shown. + +#### Background image attachment +This defines whether the background should move when the user scrolls. + +#### Background image size +This defines whether the background should cover the entire page (and possibly be cropped) or never be cropped but may not cover the entire page. + +#### Background image repeat +This defines whether the background should be repeated if it cannot cover the entire page. +This option can be useful if you have patterns that can be repeated easily (e.g. patterns): + +![](./img/background-repeat.png) + +### Appearance +#### Primary color +Color that can be chosen freely to give accents to active elements. +#### Secondary color +Color that can be chosen freely to give accents. +#### Opacity +Opacity of the colors. +#### Icon color +Change the color of your bookmark / app icons. + + + +#### Item radius +Change the radius of your items / categories. + + + + +### Custom CSS +This is the field where you can enter custom CSS. +The styling will only be applied on the respective board page. + +[See this guide on how to work with custom CSS](/docs/advanced/styling/). + +### Behaviour + +#### Disable app status +This will disable the status check for apps. + +### Access control +With the access control, you can permit a single user or a group to your board. +The users and groups can have one of these three levels of access: + +| **Permission Level** | View board | Edit mode | Settings | Danger zone (eg. delete) | +|----------------------|------------|-----------|----------|--------------------------| +| View board | X | | | | +| Modify board | X | X | X | | +| Full access | X | X | X | X | + +The permission level can only be changed after adding the user / group: + +![](./img/change-user-permission-level.png) + +If the board is private and the user is not added in any of the three tabs, they cannot access the board. +They also do not see the board on the start page nor do they have access to any links for the board. + +Groups that have high permissions (e.g. administrator or all board permissions) will be shown as "inherited". +They are permitted implicitly due to their permissions. + +After editing permissions, the save button below the table must be pressed. +Otherwise, all changes will be discarded. + +### Danger zone +#### Rename +Renaming a board will break all existing links to it permanently with no redirect. + +#### Board visibility +By default, boards will be private. This means only authenticated users that are authorized have access. +Making a board public will expose it to everyone - including unauthenticated users. + +#### Delete +This will permanently delete the board. +This action is irreversible and cannot be undone. + +## Delete boards +The deletion of boards is permanent and cannot be undone. +There are two ways to delete a board: + +- Navigate to the settings of your board, open the "Danger zone" dropdown and click on the "delete this board" button. +- Navigate to the list of boards in the management pages, click the three dots and click on "delete permanently". + +Both actions will execute the same deletion process. + +## Duplicate boards + +:::note +Duplicating a board will not copy the users and groups that have access to the board +nor the integrations the user does not have access to. +::: + +Duplicating a board will create a new board with the same settings and layout as the original board. +You can duplicate a board by clicking on the three dots in the list of boards and selecting "Duplicate board". + +![](./img/duplicate-board-modal.png) + +## Setting boards as your home board +The home board is the dashboard, that will be shown at the root path of Homarr or if no board name was passed in the URL. +All the following paths will lead to the home board: +- ``my-homarr.com`` +- ``my-homarr.com/boards`` + +Your home board will have a special small badge at the top right in the list of boards: + +![](./img/home-board-flag.png) + +### For yourself +To set the home board yourself, the easiest option is to set it directly in the list of boards: + +![](./img/set-as-home-board-menu.png) + +Alternatively, you can also define it via your user profile: +1. Click on your user profile at the top right +2. Click on ``Your preferences`` +3. Change the home board in the ``home board`` dropdown and click on ``Save``. + +### For other users + +1. Navigate to the users: ``Management`` > ``Users`` > ``Manage`` +2. Click on the username of the user that you want to adjust +3. Select the desired home board via the dropdown and click on ``Save`` \ +![](./img/set-home-board-other-user.png) + +### For user groups + +1. Navigate to the user groups: ``Management`` > ``Users`` > ``Groups`` > ``Manage`` +2. Go to tab ``Settings`` +3. Select the desired home board via the dropdown and click on ``Save`` \ +![](./img/set-home-board-user-group.png) + +### For whole server + +You can also set a global home board that will be used for all users that have not set a home board themselves. +It will also be used for anonymous users. + +1. Navigate to the settings: ``Management`` > ``Settings`` > ``Boards`` +2. Select the desired home board via the dropdown and click on ``Save`` \ +![](./img/set-home-board-global.png) + +:::note +For the global home board you can only select boards that are public. +::: + +### Mobile home board + +Same as the home board, you can also set a mobile home board. +It will be used for devices that are detected as mobile devices. (Using User-Agent header) \ No newline at end of file diff --git a/apps/docs/docs/management/certificates/img/add-button.png b/apps/docs/docs/management/certificates/img/add-button.png new file mode 100644 index 000000000..3cb699f93 Binary files /dev/null and b/apps/docs/docs/management/certificates/img/add-button.png differ diff --git a/apps/docs/docs/management/certificates/img/add-modal.png b/apps/docs/docs/management/certificates/img/add-modal.png new file mode 100644 index 000000000..df107f81f Binary files /dev/null and b/apps/docs/docs/management/certificates/img/add-modal.png differ diff --git a/apps/docs/docs/management/certificates/img/card.png b/apps/docs/docs/management/certificates/img/card.png new file mode 100644 index 000000000..930b38f47 Binary files /dev/null and b/apps/docs/docs/management/certificates/img/card.png differ diff --git a/apps/docs/docs/management/certificates/img/screenshot.png b/apps/docs/docs/management/certificates/img/screenshot.png new file mode 100644 index 000000000..4d0ebf4f7 Binary files /dev/null and b/apps/docs/docs/management/certificates/img/screenshot.png differ diff --git a/apps/docs/docs/management/certificates/index.mdx b/apps/docs/docs/management/certificates/index.mdx new file mode 100644 index 000000000..cceaa54fd --- /dev/null +++ b/apps/docs/docs/management/certificates/index.mdx @@ -0,0 +1,65 @@ +--- +tags: + - Administration + - Self signed + - Certificates + - Integration +--- + +# Certificates +On this page you can manage your trusted certificates. +For example if you use a self signed certificate for one of the integrations you want to connect, you can add it here. + +Below you can see a screenshot of the certificates page. +The items show the subject, filename and when it expires. +The color of the icon indicates how long it is valid. + +![](./img/screenshot.png) + +| Color | Meaning | +| --- | --- | +| 🟩 Green | Valid for more than 30 days | +| 🟨 Yellow | Valid for less than 30 days | +| 🟧 Orange | Valid for less than a week | +| 🟥 Red | Valid for less than a day | + + +## Opening the certificates page +Navigate to ``Management`` > ``Tools`` > ``Certificates``. + +## Add a certificate +To add a certificate click on the "Add certificate" button. + +![](./img/add-button.png) + +Then select the certificate file you want to add. + +![](./img/add-modal.png) + +And click the "Add" button. + +## Delete a certificate + +To delete a certificate you can click on the trash icon in the certificate card. + +![](./img/card.png) + +Then confirm the deletion. + +## Managing it through file system + +The certificates are stored in the `/appdata/trusted-certificates` directory which is mounted through `/appdata`. +This means you can automate the update of the certificates by simply replacing or adding a new file in the directory. + +## Obtaining certificates + +Every integration has its own way of obtaining certificates. +Generally it is recommended to search for the documentation of the integration you are using. +Most of the time you can find the certificate in the file system of the integration. +Below you can find instructions for some of the integrations. + +### Pi-hole (v6) + +Since version 6 of Pi-hole, the web interface can be accessed through HTTPS. +The certificate can be found in the path `/etc/pihole/tls_ca.crt`. To add the certificate, this file needs to be copied and uploaded to Homarr. +You can find more details regarding SSL / TLS for Pi-hole [here](https://docs.pi-hole.net/api/tls/). \ No newline at end of file diff --git a/apps/docs/docs/management/integrations/img/create-integration-dropdown.png b/apps/docs/docs/management/integrations/img/create-integration-dropdown.png new file mode 100644 index 000000000..bf9ebe11e Binary files /dev/null and b/apps/docs/docs/management/integrations/img/create-integration-dropdown.png differ diff --git a/apps/docs/docs/management/integrations/img/form-create-integration.png b/apps/docs/docs/management/integrations/img/form-create-integration.png new file mode 100644 index 000000000..dec08f629 Binary files /dev/null and b/apps/docs/docs/management/integrations/img/form-create-integration.png differ diff --git a/apps/docs/docs/management/integrations/img/integration-permissions.png b/apps/docs/docs/management/integrations/img/integration-permissions.png new file mode 100644 index 000000000..ad352091d Binary files /dev/null and b/apps/docs/docs/management/integrations/img/integration-permissions.png differ diff --git a/apps/docs/docs/management/integrations/index.mdx b/apps/docs/docs/management/integrations/index.mdx new file mode 100644 index 000000000..51b3424d3 --- /dev/null +++ b/apps/docs/docs/management/integrations/index.mdx @@ -0,0 +1,98 @@ +--- +tags: + - Integrations + - Data sources + - Connections +--- + +# Integrations +Integrations are connections to supported third party applications. +This page will describe the process of managing integrations but the process may vary depending on your specific integration. +Check [the available integrations](/docs/category/integrations) for further information. + +## Create an integration +To create an integration, you can choose the supported application from the dropdown at the top right: + +![](./img/create-integration-dropdown.png) + +Next, you'll need to fill out the required fields to configure the integration: + +![](./img/form-create-integration.png) + +### Name +Must be at least 1 character long, can be chosen freely. + +### Url +This must be the base URL of the application where Homarr should connect to. +A few examples for this field include: +- http://sabnzbd.example.com +- https://example.com/sabnzbd + +You must not append any path after the base URL. Some examples for incorrect usage: +- http://sabnzbd.example.com/settings +- https://example.com/sabnzbd/settings + +### Secrets +An integration may or may not require secrets to function. +To process to obtain them is usually [documented in the integration pages](/docs/category/integrations). +Secrets are encrypted using a symmetric encryption and stored in the database. +To improve security, they will never be passed to the client and requests to the integrations are performed from the host where Homarr is running on. + +### Linking applications + +During the creation of an integration you can choose to add / link an application to the integration. +If you want to add one, you can simply specify the app url which will be used for opening the application from Homarr. +The linked application will also be used for any links the integration widget contains. +If you already have an application created, you can also link it to the integration by selecting it from the dropdown. +On the edit page you can always change or remove the linked application. + +### Testing and saving integration +It is not allowed to create an integration without passing the test. +This is to ensure that you minimize the amount of broken applications on your Homarr instance. +The test and create button will perform a network request to the application and authenticate if required. + +## Managing permissions + +On the edit page of an integration, you can manage which users / groups can + +- **Select the integration in items:** Allows users to select the integration and showing data on their board. +- **Interact with the integration:** Allows users to perform actions on the integration, such as pausing a download. +- **Full control over the integration:** Allows users to modify the integration properties, including the URL and secrets. + +![](./img/integration-permissions.png) + +## Troubleshooting connection +The connection to your integrations can fail due to many factors. Most of the time it should show you the reason why it failed. +If it doesn't, you can follow these steps to troubleshoot the issue: + +1. Check whether you are using the correct URL and secrets. + - The URL must be the base URL of the application, **without any paths**. + - The secrets must be correct and have the correct permissions. +2. If you use https to connect to the application, check the chapter below about [certificate issues](#certificate-issues). +3. Check whether you followed the Homarr documentation and didn't skip any steps. +This is the most often mistake that create many noisy support requests and following all steps will often resolve the problems. +4. Check Homarr's logs for more information. As we have no control over breaking changes in upstream APIs and third party software, +they can break without notice in unexpected ways which can also lead to errors within Homarr. In such case, these occurrences must be reported +and fixed within the source code of Homarr. +5. Check whether the host can reach the destination hostname / IP using ``ping`` and ``curl`` or ``wget`` afterward. +Execute this command on the host machine, not inside containers, to check whether it can connect or not. +6. Check whether the container / pod can reach the destination hostname / IP. Execute the same commands in the shell inside the container / pod. +7. Check your reverse proxy / authentication proxy logs for failures / hints +8. Check your security log of tunnels and VPNs +9. Check your router for security events +10. Check your VLAN configuration and firewall rules +11. Check your DNS settings for the host machine and the containers / pods and whether they can resolve the hostnames +12. Check throughput and stability of your network connection using ``iperf3`` +13. Check syslog / drivers of your OS for hints +14. Check logs of your destination applications (eg. SABnzbd) +15. Attempt to disable CSRF / tamper protections when absolutely no other workaround available -> this comes with some security implications - be careful! +Re-enable if this didn't fix the issue. + +If none of these troubleshooting steps worked, you can request support from our team in Discord or GitHub. + +### Certificate issues + +If you are using a self-signed certificate you'll need to add it to the [trusted certificates](../certificates) in Homarr. +Most of the time you should also get a button to add the certificate automatically when you try to connect to the integration. +Please check that the certificate is the one you are expecting to prevent Man in the Middle attacks. +For some integrations, you can find a guide on how to retrieve the certificate [here](../certificates/#obtaining-certificates). \ No newline at end of file diff --git a/apps/docs/docs/management/media/img/screenshot.png b/apps/docs/docs/management/media/img/screenshot.png new file mode 100644 index 000000000..b9ecdd407 Binary files /dev/null and b/apps/docs/docs/management/media/img/screenshot.png differ diff --git a/apps/docs/docs/management/media/index.mdx b/apps/docs/docs/management/media/index.mdx new file mode 100644 index 000000000..090a6559b --- /dev/null +++ b/apps/docs/docs/management/media/index.mdx @@ -0,0 +1,13 @@ +--- +tags: + - Administration + - Media + - Uploads + - Icons +--- + +# Media +Using the media feature, you can upload images for custom icons to Homarr. +Images will be stored in the database. They can be selected in the [icon picker](/docs/advanced/icons). + +![](./img/screenshot.png) \ No newline at end of file diff --git a/apps/docs/docs/management/search-engines/img/create-search-engine.png b/apps/docs/docs/management/search-engines/img/create-search-engine.png new file mode 100644 index 000000000..28b23c9b0 Binary files /dev/null and b/apps/docs/docs/management/search-engines/img/create-search-engine.png differ diff --git a/apps/docs/docs/management/search-engines/img/search-engines.png b/apps/docs/docs/management/search-engines/img/search-engines.png new file mode 100644 index 000000000..45a22570e Binary files /dev/null and b/apps/docs/docs/management/search-engines/img/search-engines.png differ diff --git a/apps/docs/docs/management/search-engines/index.mdx b/apps/docs/docs/management/search-engines/index.mdx new file mode 100644 index 000000000..fe4343b5f --- /dev/null +++ b/apps/docs/docs/management/search-engines/index.mdx @@ -0,0 +1,62 @@ +--- +tags: + - Search engines + - Google + - Search +--- + +# Search Engines +Using the search engines, terms can be quickly searched simply by opening the search bar at the top or using the keyboard shortcut `CTRL + K`. + +![](./img/search-engines.png) + +You can add any search engine that has a search URL that accepts a search term as a parameter. + +## Create search engine +To create a custom search engine, you can click the button at the top of the page. + +![](./img/create-search-engine.png) + +### Name +The name can be chosen freely. It will be displayed in the search box popover. + +### Short +Prefix that is used to choose the search engine in the popover using the keyboard. +It is recommended that this value is kept short (for example ``g`` for Google and ``e`` for Ecosia). + +### Configuration + +In the configuration section you can select between two options. + +#### Search template +The template must be a valid URL that incldues the ``%s`` placeholder. +Homarr will replace the ``%s`` with the term that the user entered. + +##### Examples +- Google: ``https://www.google.com/search?q=%s`` +- Ecosia: ``https://www.ecosia.org/search?q=%s`` +- DuckDuckGo: ``https://duckduckgo.com/?q=%s`` +- Bing: ``https://www.bing.com/search?q=%s`` +- YouTube: ``https://www.youtube.com/results?search_query=%s`` + +## Media request search + +Jellyseerr, Overseerr, and Seerr integrations have a dedicated **Spotlight mode** for searching and requesting media. +This mode does not require creating a search engine entry — it is available automatically when you have a compatible integration configured. + +You can access it from: +- The **Modes list** in Spotlight (opened with `CTRL + K`) +- The **search button** on the media request list and stats widgets + +### Availability indicators + +Search results display colored status badges showing the media's current state in your integration: +- **Available** — fully available in your media library +- **Partial** — some content (e.g. seasons) is available +- **Processing** — currently being downloaded or processed +- **Requested** — requested but not yet available + +### Requesting TV show seasons + +For partially available TV shows, you can request additional seasons. +The request modal shows which seasons are already requested (marked with a status badge and not selectable), so you can select only the missing seasons. diff --git a/apps/docs/docs/management/settings/index.mdx b/apps/docs/docs/management/settings/index.mdx new file mode 100644 index 000000000..d7705e61a --- /dev/null +++ b/apps/docs/docs/management/settings/index.mdx @@ -0,0 +1,105 @@ +--- +tags: + - Settings + - SEO + - Analytics + - Security + - Server + - Administration +--- + +# Settings +The settings page has a few options that will be applied to the entire Homarr application. +They may require a full page reload for changes to apply. + +## Analytics +By default, Homarr is collecting anonymous analytics to identify issues and prioritize bugfixes and improvements. +The data is never shared with any third-parties and is fully GDPR & CCPA compliant. +The software being used is [Umami Analytics](https://umami.is/) which is fully open source. +The main server software can be found [here](https://github.com/umami-software/umami) and [this node library](https://github.com/umami-software/node) to perform server side calls to the API. + +A full list of the collected data by default can be found here: https://umami.is/docs/metric-definitions. + +We understand that you might not want Homarr to communicate with our services. +By unchecking the ``Send anonymous analytics`` checkbox and reloading the full page, all communication by Umami will be disabled and no data will be collected. +If you are paranoid, you can permanently block ``umami.homarr.dev`` from your DNS / firewall. + +Additionally, you opt in to more data collection to help us provide more useful data. + +### Integration data +Enabling this optional data will send the types of integrations (e.g. SABnzbd, Sonarr, ...) and how many you have configured of them. +This will not include any URLs, names, secrets, errors and others. This is disabled by default. + +### Widget data +Enabling this optional data will send the types of widgets (e.g. downloads, media streams, iframe, ...) and how many you have configured of them. +This will not include any URLs, names, secrets, errors and others. This is disabled by default. + +### Users data +Enabling this optional data will send the count of users and whether you activated SSO. +This will not include any usernames, passwords, emails, URLs, authentication flows or client IDs. +This is disabled by default. + +## Search Engine Optimization (SEO) +Big companies [like Google, Microsoft, Baidu and Yandex](https://de.wikipedia.org/wiki/Web-Index) will use [web crawlers](https://de.wikipedia.org/wiki/Webcrawler) to index the Internet for new websites & pages. +This is desirable in many cases (for example when selling products in an online shop) but can lead to unwanted traffic and attention to your personal dashboard. +Homarr is requesting the crawlers to not index Homarr instances by default for this reason. +If you use Homarr as a public website and want it to be searchable on these search engines, you can disable these settings. +Please note that Homarr doesn't have control over what the crawlers do; it is a mere request to them to not perform these actions but will not guarantee that your website doesn't land on some index. + +### No index +This will ask crawlers to not index your Homarr instance on any indexes. +It is up to the crawler to properly respect this request. +By default, this setting is enabled. Disabling it will allow indexing. + +### No follow +If indexing is allowed, crawlers will also attempt to follow any links on your page to further "discover" new parts of the Internet and on your website. +By default, this setting is enabled and will ask crawlers to not follow any links. +Crawler of different companies may behave differently when indexing is prohibited and following is allowed. + +### No translate +Google and Chrome on Android will prompt users to translate pages that are not in their device language. +This can lead to some shifting and can be undesired in some cases. By enabling this, +you ask crawlers to never translate and never prompt users for translation. +It should be noted that some browsers will ignore this and translate regardless. + +### No site links search box +This setting is exclusive to Google. +[Google will create a box below your domain](https://developers.google.com/search/docs/appearance/structured-data/sitelinks-searchbox) that lists the paths that were discovered by the "folowing". +The user can search them directly in Google. +You can ask the crawlers to not allow searches by enabling this setting. +This setting is disabled by default. + +## Boards + +### Global home board +You can set a global home board that will be used for all users that have not set a home board themselves. +It will also be used for anonymous users. +Note that the board must be public to be used as a global home board. + +### Global mobile board + +You can set a global mobile board. It will be shown instead of the global home board on mobile devices that can be detected by Homarr. (Using the User-Agent header). +It will similar to the global home board be as fallback for normal users and for any anonymous users. +It also has to be public. + +### App status + +#### Enable status by default + +You can decide if the app status should be enabled by default when adding a new app to the board. + +#### Force disable status + +You can decide if the app status should be disabled for all boards. + +### + +## Appearance + +### Default color scheme +You can set the default color scheme for all users that have not set a color scheme themselves. + +## Culture + +### Default language +You can set the default language for all users that have not set a language themselves. \ No newline at end of file diff --git a/apps/docs/docs/management/tasks/img/tasks.png b/apps/docs/docs/management/tasks/img/tasks.png new file mode 100644 index 000000000..1f00ff7b9 Binary files /dev/null and b/apps/docs/docs/management/tasks/img/tasks.png differ diff --git a/apps/docs/docs/management/tasks/index.mdx b/apps/docs/docs/management/tasks/index.mdx new file mode 100644 index 000000000..bd9395610 --- /dev/null +++ b/apps/docs/docs/management/tasks/index.mdx @@ -0,0 +1,43 @@ +--- +tags: + - Background + - Jobs + - Tasks +--- + +# Tasks + +Homarr has background jobs for various tasks, most of them are for realtime widget updates. +The tasks page allows you to run background jobs manually and configure them. + +![Tasks page](./img/tasks.png) + +## Opening the tasks page + +Navigate to `Management` > `Tools` > `Tasks`. +The page is only accessible to users with admin permission. + +## Changing interval + +In the column `Schedule interval` you can change the interval in which the task runs. +Different intervals are available, such as `1 minute`, `5 minutes`, `10 minutes`, `30 minutes`, and `1 hour`. +All intervals are cron expressions, which means it will run the next time the cron expression matches the current time. + +## Actions + +You can find different actions for each task on the right side of a task item. + +### Run Manually + +To run a task manually, click the "Play" button, which will execute the task immediately. +During the exection the badge will show `Running`. + +### Disabling / Enabling + +You can disable a task by clicking the "Power" button, which will change it to a "Power-Off" button. +When a task is disabled, it will not run automatically according to its schedule. +You can enable it again by clicking the "Power-Off" button, which will change it back to a "Power" button. +Running a task manually is still possible when it is disabled. + + + diff --git a/apps/docs/docs/management/users/img/add-group-member.png b/apps/docs/docs/management/users/img/add-group-member.png new file mode 100644 index 000000000..f4d84a2a7 Binary files /dev/null and b/apps/docs/docs/management/users/img/add-group-member.png differ diff --git a/apps/docs/docs/management/users/img/button-create-user.png b/apps/docs/docs/management/users/img/button-create-user.png new file mode 100644 index 000000000..4c6271dca Binary files /dev/null and b/apps/docs/docs/management/users/img/button-create-user.png differ diff --git a/apps/docs/docs/management/users/img/changing-group-permissions.png b/apps/docs/docs/management/users/img/changing-group-permissions.png new file mode 100644 index 000000000..90edbccf1 Binary files /dev/null and b/apps/docs/docs/management/users/img/changing-group-permissions.png differ diff --git a/apps/docs/docs/management/users/img/create-invitation-button.png b/apps/docs/docs/management/users/img/create-invitation-button.png new file mode 100644 index 000000000..7c6fd7668 Binary files /dev/null and b/apps/docs/docs/management/users/img/create-invitation-button.png differ diff --git a/apps/docs/docs/management/users/img/create-invitation-confirmation.png b/apps/docs/docs/management/users/img/create-invitation-confirmation.png new file mode 100644 index 000000000..d21d2da76 Binary files /dev/null and b/apps/docs/docs/management/users/img/create-invitation-confirmation.png differ diff --git a/apps/docs/docs/management/users/img/create-wizard.png b/apps/docs/docs/management/users/img/create-wizard.png new file mode 100644 index 000000000..ef3adc21a Binary files /dev/null and b/apps/docs/docs/management/users/img/create-wizard.png differ diff --git a/apps/docs/docs/management/users/img/deleting-invitation.png b/apps/docs/docs/management/users/img/deleting-invitation.png new file mode 100644 index 000000000..5ab71976f Binary files /dev/null and b/apps/docs/docs/management/users/img/deleting-invitation.png differ diff --git a/apps/docs/docs/management/users/img/groups-list.png b/apps/docs/docs/management/users/img/groups-list.png new file mode 100644 index 000000000..27bfd160c Binary files /dev/null and b/apps/docs/docs/management/users/img/groups-list.png differ diff --git a/apps/docs/docs/management/users/img/img-copy-invite-link.png b/apps/docs/docs/management/users/img/img-copy-invite-link.png new file mode 100644 index 000000000..36b42a377 Binary files /dev/null and b/apps/docs/docs/management/users/img/img-copy-invite-link.png differ diff --git a/apps/docs/docs/management/users/img/img-manage-navbar.png b/apps/docs/docs/management/users/img/img-manage-navbar.png new file mode 100644 index 000000000..964f227ae Binary files /dev/null and b/apps/docs/docs/management/users/img/img-manage-navbar.png differ diff --git a/apps/docs/docs/management/users/img/invitation-expiry-date.png b/apps/docs/docs/management/users/img/invitation-expiry-date.png new file mode 100644 index 000000000..d27c81c91 Binary files /dev/null and b/apps/docs/docs/management/users/img/invitation-expiry-date.png differ diff --git a/apps/docs/docs/management/users/img/invitation-self-onboarding.png b/apps/docs/docs/management/users/img/invitation-self-onboarding.png new file mode 100644 index 000000000..cdd113309 Binary files /dev/null and b/apps/docs/docs/management/users/img/invitation-self-onboarding.png differ diff --git a/apps/docs/docs/management/users/img/password-requirements.png b/apps/docs/docs/management/users/img/password-requirements.png new file mode 100644 index 000000000..e962161b5 Binary files /dev/null and b/apps/docs/docs/management/users/img/password-requirements.png differ diff --git a/apps/docs/docs/management/users/img/remove-group-member.png b/apps/docs/docs/management/users/img/remove-group-member.png new file mode 100644 index 000000000..cea0a8b38 Binary files /dev/null and b/apps/docs/docs/management/users/img/remove-group-member.png differ diff --git a/apps/docs/docs/management/users/img/wizard-complete.png b/apps/docs/docs/management/users/img/wizard-complete.png new file mode 100644 index 000000000..f248e19ac Binary files /dev/null and b/apps/docs/docs/management/users/img/wizard-complete.png differ diff --git a/apps/docs/docs/management/users/index.mdx b/apps/docs/docs/management/users/index.mdx new file mode 100644 index 000000000..7be233af0 --- /dev/null +++ b/apps/docs/docs/management/users/index.mdx @@ -0,0 +1,202 @@ +--- +title: Users +tags: + - Users + - Roles + - Permissions + - Groups +--- + +# Users + +Each person accessing Homarr is a user. Using the users management you can configure who has access to certain resources. +A user may have multiple sessions on different devices and can log in from multiple locations at the same time. +A user can be assigned to multiple groups. + +:::tip + +Homarr supports [single sign on for easier and seamless authentication](/docs/advanced/single-sign-on) (e.g. Authelia). + +::: + +## Manage users +### Creating new users +To create new users, you must navigate to ``Mangement`` > ``Users`` > ``Manage`` and click on the create button to create a new one: \ +![](./img/button-create-user.png) + +You'll be guided through the process using a wizard: \ +![](./img/create-wizard.png) + +The username and Email must be unique. A username is required. +When creating a password, you must meet the password requirements: \ +![](./img/password-requirements.png) + +After you completed all steps, you can start over to create another user or choose to go back to the list: \ +![](./img/wizard-complete.png) + +## Editing a user +A user can be edited on the ``Mangement`` > ``Users`` > ``Manage`` page when you click on the username. +Here you'll have access to two tabs: **General** and **Security**. + +### General tab +#### Username +This is the unique username that identifies this user. It can be changed to anything but must be at least 3 characters long with a limit of 255 characters. +This name will be used for the credential's login. It is also used to auto-generate profile pictures if no picture was uploaded. + +#### E-Mail +This is the unique email of the user. As of 1.0, it is not used for any notifications and only for organizational purposes. +This field is optional. + +#### Language +This is the currently selected language of the user. +Changing the language will change all text & the right to left (RTL) feature in some languages. +By default, Homarr will choose English as the default language. Here you can override the language for this specific user. +The user may choose a different language by themselves afterward. + +#### Home board +Optional field for the board that is loaded by default if no board was specified in the URL. +Only boards that the user has permission to are being shown. + +#### Search + +Options to configure default search engine of user and whether to open search results in a new tab. + +#### First day of the week + +Choose the first day of the week for the user. This will affect the calendar widget. + +#### Accessibility + +Option to show icons for status check instead of colored dots. + +#### Delete +This action will permanently delete the user from the database, including any preferences they set. +If the user created boards, they wil **not** be deleted. +This action is **irreversible** and cannot be undone. All data is permanently lost. + +### Security tab + +#### Change password +Here the password for this user can be changed. +It must also meet the password requirements of Homarr. +The password is stored as an encrypted value with a salt in the database - this means the value cannot be read out from the database afterward. +You must take care of sending the new password to the user. +This functionality can also be useful to lock out a bad actor without tampering with any data (except the password hash). +For security reasons, you must confirm the password a second time. + +## Groups +Using groups, you can manage the permissions of users. +Members can be directly assigned to groups. + +A user will have the permissions of all groups they are a member of. +Some permissions include other permissions, for example the "Full board access" permission includes all board permissions. + +By default, a group called "credentials-admin" will be generated where the first user will be placed. +However, you can create as many groups as you'd like. + +### Creating a group +Click on the button ``New group`` to create a new one. +Homarr will prompt you for a group name. + +### Managing a group +#### General tab +##### Name +Name for the group that can be chosen freely. + +##### Transfer ownership +Every group has an owner. Using this button, the ownership can be transferred to a different user. +Group ownership is only organizational. + +##### Delete +Deletes the group permanently. This change is irreversible. + +#### Settings tab +In this tab, you can configure some settings for the group. Those settings will be prioritized by the order of the groups on the groups list page + +##### Priorization +The higher a group in the list, the higher the priority. This means that if a user is in multiple groups, the permissions of the group with the highest priority will be used. +It will always fallback to the everyone group if no other group permissions are set. + +![](./img/groups-list.png) + +##### Boards +Configure board settings for a group. User specific settings will override group settings. + +###### Home board +The board that is loaded by default if no board was specified in the URL. + +###### Mobile board +The board that is loaded by default on mobile devices. + +#### Members tab +In this tab, you can assign users to the group. With the button at the top right, a new member can be added to the group: + +![](./img/add-group-member.png) + +Members can be removed from the group using the remove button at the end: + +![](./img/remove-group-member.png) + +#### Permissions tab +In this tab, you manage what permissions the members of this group will have. +Currently, the following permissions are available: + +- Boards + - **Create boards**: Allow members to create boards + - **View all boards**: Allow members to view all boards + - **Modify all boards**: Allow members to modify all boards (Does not include access control and danger zone) + - **Full board access**: Allow members to view, modify, and delete all boards (Including access control and danger zone) +- Integrations + - **Create integrations**: Allow members to create integrations + - **Use all integrations**: Allows members to add any integrations to their boards + - **Interact with any integration**: Allow members to interact with any integration + - **Full integration access**: Allow members to manage, use and interact with any integration +- **Administrator**: Members with this permission have full access to all features and settings + +When you changed permissions, you must confirm your changes by clicking the banner at the bottom: + +![](./img/changing-group-permissions.png) + +#### Special groups +Currently one special group exists. This group is `everyone`. It automatically adds every user that is known to Homarr to its members. Neither its name nor its members can be changed. + +## Invites +Invites are an easy-to-use system to allow users to onboard themselves. +It is useful in companies or large-scale homelabs where many users must be onboarded at the same time. +You should trust the end user that they enter their data truthfully as the administrator will not confirm the entered data after the user has completed the onboarding. + +This feature can only be used when credentials authentication is enabled. +An invitation link can be used indefinitely. + +### Creating an invitation +Click on the button: + +![](./img/create-invitation-button.png) + +Next, define the expiration time for this invitation. They will expire after some time and will no longer be valid. +It must be at least 1 hour in the future and at max 6 months in the future. +The default is 4 hours in the future. + +![](./img/invitation-expiry-date.png) + +Next, click ``Create`` and you'll get a confirmation with an ID, Token and a link that can be copied: + +![](./img/create-invitation-confirmation.png) + +Both ID and Token are also in the URL. Ensure that you copy either ID & Token or the URL - it will never be shown again. +Clicking the ``Copy & close`` button will copy the URL to your clipboard. + +### Self-onboarding +Clicking the invitation link will bring up a form with fields for the username and password: + +![](./img/invitation-self-onboarding.png) + +At the bottom of the page, the user who created the invitation can be seen. + +### Deleting an invitation +If an invitation needs to be deleted before or after the expiry, the delete button at the end of the table can be used: + +![](./img/deleting-invitation.png) + +The link will become invalid. +If the invitation expires, the link will also expire. diff --git a/apps/docs/docs/widgets/_category_.json b/apps/docs/docs/widgets/_category_.json new file mode 100644 index 000000000..df8d80354 --- /dev/null +++ b/apps/docs/docs/widgets/_category_.json @@ -0,0 +1,11 @@ +{ + "label": "Widgets", + "position": 3, + "collapsed": true, + "link": { + "type": "generated-index", + "title": "Widgets", + "description": "Widgets allow you to show data on your board or control applications. Click on one of the widgets below for further information:", + "image": "/img/docusaurus.png" + } +} diff --git a/apps/docs/docs/widgets/anchor-note/img/widget.png b/apps/docs/docs/widgets/anchor-note/img/widget.png new file mode 100644 index 000000000..c9414c9cb Binary files /dev/null and b/apps/docs/docs/widgets/anchor-note/img/widget.png differ diff --git a/apps/docs/docs/widgets/anchor-note/index.mdx b/apps/docs/docs/widgets/anchor-note/index.mdx new file mode 100644 index 000000000..453a5b51c --- /dev/null +++ b/apps/docs/docs/widgets/anchor-note/index.mdx @@ -0,0 +1,46 @@ +--- +title: 'Anchor Note' +description: 'Display and edit a selected note from Anchor' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { anchorNoteWidget } from '.'; +import { anchorIntegration } from '@site/docs/integrations/anchor'; + + + + +The Anchor Note widget shows a selected note from your Anchor integration. If your note permissions allow it, you can also edit the note title and content directly in Homarr. + +### Screenshots + +import anchorNoteWidgetScreenshot from './img/widget.png'; + +anchor-note-widget + +### Supported Integrations + + + +### Interactions + +- Click **Edit** to start editing the selected note. +- Click **Save** to persist changes to Anchor. +- Click **Cancel** to discard unsaved changes. + +### Adding the widget + + + +### Configuration + + diff --git a/apps/docs/docs/widgets/anchor-note/index.ts b/apps/docs/docs/widgets/anchor-note/index.ts new file mode 100644 index 000000000..c815964a1 --- /dev/null +++ b/apps/docs/docs/widgets/anchor-note/index.ts @@ -0,0 +1,31 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconNotes } from "@tabler/icons-react"; + +export const anchorNoteWidget: WidgetDefinition = { + icon: IconNotes, + name: "Anchor Note", + description: "Display and edit a selected note from Anchor", + path: "../../widgets/anchor-note", + configuration: { + items: [ + { + name: "Note", + description: "Select the note from your Anchor integration to display in the widget.", + values: "One of the notes from your Anchor integration", + defaultValue: "-", + }, + { + name: "Show title", + description: "Show the note title at the top of the widget.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show last updated", + description: "Show the relative last updated time of the note.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/app/img/github.png b/apps/docs/docs/widgets/app/img/github.png new file mode 100644 index 000000000..71c400a26 Binary files /dev/null and b/apps/docs/docs/widgets/app/img/github.png differ diff --git a/apps/docs/docs/widgets/app/img/jellyseerr-description-tooltip.png b/apps/docs/docs/widgets/app/img/jellyseerr-description-tooltip.png new file mode 100644 index 000000000..01ddc2686 Binary files /dev/null and b/apps/docs/docs/widgets/app/img/jellyseerr-description-tooltip.png differ diff --git a/apps/docs/docs/widgets/app/img/pi-hole-ping-icon.png b/apps/docs/docs/widgets/app/img/pi-hole-ping-icon.png new file mode 100644 index 000000000..0f177d595 Binary files /dev/null and b/apps/docs/docs/widgets/app/img/pi-hole-ping-icon.png differ diff --git a/apps/docs/docs/widgets/app/index.mdx b/apps/docs/docs/widgets/app/index.mdx new file mode 100644 index 000000000..ec62d862e --- /dev/null +++ b/apps/docs/docs/widgets/app/index.mdx @@ -0,0 +1,37 @@ +--- +title: 'App' +description: 'Embeds an app into the board.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { appWidget } from '.'; + + + + +The app widget allows you to add a link to an application or a website that you want to access quickly from your Homarr board. +It also supports a status check to indicate whether Homarr can reach the application or website. + +### Screenshots + +import githubApp from './img/github.png'; +import jellyseerrApp from './img/jellyseerr-description-tooltip.png'; +import piHoleApp from './img/pi-hole-ping-icon.png'; + +
+ app github with-status-check + app pi-hole with-status-check status-check-icon + app jellyseerr with-description-tooltip +
+### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/app/index.ts b/apps/docs/docs/widgets/app/index.ts new file mode 100644 index 000000000..773121733 --- /dev/null +++ b/apps/docs/docs/widgets/app/index.ts @@ -0,0 +1,52 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconApps } from "@tabler/icons-react"; + +export const appWidget: WidgetDefinition = { + icon: IconApps, + name: "App", + description: "Embeds an app into the board.", + path: "../../widgets/app", + configuration: { + items: [ + { + name: "Choose app", + description: "Select one of your created apps.", + values: "App from your apps list", + defaultValue: "-", + }, + { + name: "Open in new tab", + description: "Whether to open the link in a new tab.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show app name", + description: "Whether to show the name of the app on the widget.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Description display mode", + description: "Choose how to display the app description", + values: { type: "select", options: ["Within widget", "As tooltip", "Hidden"] }, + defaultValue: "Hidden", + }, + { + name: "Layout", + description: "How to arrange the app widget.", + values: { + type: "select", + options: ["Horizontal", "Horizontal (reversed)", "Vertical", "Vertical (reversed)"], + }, + defaultValue: "Vertical", + }, + { + name: "Enable status check", + description: "Whether to enable the status check for the app.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/audio-stats/index.mdx b/apps/docs/docs/widgets/audio-stats/index.mdx new file mode 100644 index 000000000..f37a4eb83 --- /dev/null +++ b/apps/docs/docs/widgets/audio-stats/index.mdx @@ -0,0 +1,43 @@ +--- +title: 'Audio Stats' +description: 'Displays library statistics from Navidrome or Audiobookshelf, adapting its display based on the linked integration.' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { audioStatsWidget } from '.'; +import { navidromeIntegration } from '@site/docs/integrations/navidrome'; +import { audiobookshelfIntegration } from '@site/docs/integrations/audiobookshelf'; + + + + +This widget adapts its display based on the linked integration: + +- **Navidrome**: Shows artist, album, and song counts, plus a now playing section with active streams +- **Audiobookshelf**: Shows library count, audiobook/podcast totals, listening time, and active sessions + +Only options relevant to your linked integration are shown in the configuration panel. + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/audio-stats/index.ts b/apps/docs/docs/widgets/audio-stats/index.ts new file mode 100644 index 000000000..ab9bd7f2f --- /dev/null +++ b/apps/docs/docs/widgets/audio-stats/index.ts @@ -0,0 +1,86 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconHeadphones } from "@tabler/icons-react"; + +export const audioStatsWidget: WidgetDefinition = { + icon: IconHeadphones, + name: "Audio Stats", + description: + "Displays library statistics from Navidrome or Audiobookshelf, adapting its display based on the linked integration.", + path: "../../widgets/audio-stats", + configuration: { + items: [ + { + name: "Show artists", + description: "Displays the artist count (Navidrome only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show albums", + description: "Displays the album count (Navidrome only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show songs", + description: "Displays the song count (Navidrome only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show now playing", + description: "Displays currently playing tracks (Navidrome only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show now playing list", + description: "Displays a detailed list of now playing tracks (Navidrome only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Max now playing items", + description: "Maximum number of now playing tracks to display (Navidrome only)", + values: "Number (1-5)", + defaultValue: "3", + }, + { + name: "Show library count", + description: "Displays the number of libraries (Audiobookshelf only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show audiobooks", + description: "Displays the total audiobook count (Audiobookshelf only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show podcasts", + description: "Displays the total podcast count (Audiobookshelf only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show listening time", + description: "Displays total listening time (Audiobookshelf only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show active sessions", + description: "Displays the number of active listening sessions (Audiobookshelf only)", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Compact mode", + description: "Uses a more compact layout with smaller icons and tighter spacing", + values: { type: "boolean" }, + defaultValue: "no", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/bookmarks/img/grid-icons-only.png b/apps/docs/docs/widgets/bookmarks/img/grid-icons-only.png new file mode 100644 index 000000000..34c11fbcc Binary files /dev/null and b/apps/docs/docs/widgets/bookmarks/img/grid-icons-only.png differ diff --git a/apps/docs/docs/widgets/bookmarks/img/grid-with-title.png b/apps/docs/docs/widgets/bookmarks/img/grid-with-title.png new file mode 100644 index 000000000..edbe52b6a Binary files /dev/null and b/apps/docs/docs/widgets/bookmarks/img/grid-with-title.png differ diff --git a/apps/docs/docs/widgets/bookmarks/img/vertical-list-all.png b/apps/docs/docs/widgets/bookmarks/img/vertical-list-all.png new file mode 100644 index 000000000..3f61c16ff Binary files /dev/null and b/apps/docs/docs/widgets/bookmarks/img/vertical-list-all.png differ diff --git a/apps/docs/docs/widgets/bookmarks/img/vertical-list-simple.png b/apps/docs/docs/widgets/bookmarks/img/vertical-list-simple.png new file mode 100644 index 000000000..a9f52a4f5 Binary files /dev/null and b/apps/docs/docs/widgets/bookmarks/img/vertical-list-simple.png differ diff --git a/apps/docs/docs/widgets/bookmarks/index.mdx b/apps/docs/docs/widgets/bookmarks/index.mdx new file mode 100644 index 000000000..c3104ad5b --- /dev/null +++ b/apps/docs/docs/widgets/bookmarks/index.mdx @@ -0,0 +1,44 @@ +--- +title: 'Bookmarks' +description: 'Displays multiple app links' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { bookmarksWidget } from '.'; + + + + +The bookmarks widget allows you to display multiple app links in a single widget. +You can add links to your favorite applications, websites, or any other resources you want quick access to. + +### Screenshots + +import gridIconsOnly from './img/grid-icons-only.png'; +import gridWithTitle from './img/grid-with-title.png'; +import verticalListAll from './img/vertical-list-all.png'; +import vericalListSimple from './img/vertical-list-simple.png'; + +
+
+ bookmarks grid icons-only + bookmarks vertical-list no-domain +
+ + bookmarks grid with-title + bookmarks vertical-list all-elements +
+ + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/bookmarks/index.ts b/apps/docs/docs/widgets/bookmarks/index.ts new file mode 100644 index 000000000..57fea9836 --- /dev/null +++ b/apps/docs/docs/widgets/bookmarks/index.ts @@ -0,0 +1,55 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBookmark } from "@tabler/icons-react"; + +export const bookmarksWidget: WidgetDefinition = { + icon: IconBookmark, + name: "Bookmarks", + description: "Displays multiple app links", + path: "../../widgets/bookmarks", + configuration: { + items: [ + { + name: "Title", + description: "Title shown on top of the widget.", + values: { type: "string" }, + defaultValue: "-", + }, + { + name: "Layout", + description: "Layout in which the bookmarks are displayed.", + values: { type: "select", options: ["Vertical", "Horizontal", "Grid", "Grid horizontal"] }, + defaultValue: "Vertical", + }, + { + name: "Hide title", + description: "Whether to hide the title of the bookmark items.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Hide icons", + description: "Whether to hide the icon of the bookmark items.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Hide hostnames", + description: "Whether to hide the hostname of the bookmark items.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Open in new tab", + description: "Whether to open the bookmark items in a new tab.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Bookmarks", + description: "List of bookmarks to display in the widget.", + values: "Select of all your apps and order them as you like.", + defaultValue: "No bookmarks selected", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/calendar/img/popover.png b/apps/docs/docs/widgets/calendar/img/popover.png new file mode 100644 index 000000000..6272053df Binary files /dev/null and b/apps/docs/docs/widgets/calendar/img/popover.png differ diff --git a/apps/docs/docs/widgets/calendar/img/with-integrations.png b/apps/docs/docs/widgets/calendar/img/with-integrations.png new file mode 100644 index 000000000..160e2d2c0 Binary files /dev/null and b/apps/docs/docs/widgets/calendar/img/with-integrations.png differ diff --git a/apps/docs/docs/widgets/calendar/img/without-integrations.png b/apps/docs/docs/widgets/calendar/img/without-integrations.png new file mode 100644 index 000000000..6ef263140 Binary files /dev/null and b/apps/docs/docs/widgets/calendar/img/without-integrations.png differ diff --git a/apps/docs/docs/widgets/calendar/index.mdx b/apps/docs/docs/widgets/calendar/index.mdx new file mode 100644 index 000000000..60095aabe --- /dev/null +++ b/apps/docs/docs/widgets/calendar/index.mdx @@ -0,0 +1,73 @@ +--- +title: 'Calendar' +description: 'Display events from your integrations in a calendar view within a certain relative time period' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { calendarWidget } from '.'; +import { lidarrIntegration } from '@site/docs/integrations/lidarr'; +import { nextcloudIntegration } from '@site/docs/integrations/nextcloud'; +import { homeAssistantIntegration } from '@site/docs/integrations/home-assistant'; +import { radarrIntegration } from '@site/docs/integrations/radarr'; +import { readarrIntegration } from '@site/docs/integrations/readarr'; +import { sonarrIntegration } from '@site/docs/integrations/sonarr'; +import { icalIntegration } from '@site/docs/integrations/ical'; + + + + +The calendar widget shows a month view of events from different integrations. +It allows you to view calendar events or upcoming releases from your media managers. + +### Screenshots + +import popover from './img/popover.png'; +import withIntegrations from './img/with-integrations.png'; +import withoutIntegrations from './img/without-integrations.png'; + +
+ calendar with-integrations big-size +
+ calendar popover-details the-mandalorian + calendar without-integrations small-size +
+
+ +### Supported Integrations + + + +### Interactions + +- View calendar events by clicking on the marked dates. + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/calendar/index.ts b/apps/docs/docs/widgets/calendar/index.ts new file mode 100644 index 000000000..b1e2d83b3 --- /dev/null +++ b/apps/docs/docs/widgets/calendar/index.ts @@ -0,0 +1,39 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconCalendar } from "@tabler/icons-react"; + +export const calendarWidget: WidgetDefinition = { + icon: IconCalendar, + name: "Calendar", + description: "Display events from your integrations in a calendar view within a certain relative time period", + path: "../../widgets/calendar", + configuration: { + items: [ + { + name: "Radarr release type", + description: "Select what type of release date to see.", + values: "List of: 'In cinemas', 'Digital release', 'Physical release'", + defaultValue: "'In cinemas' and 'Digital release'", + }, + { + name: "Start from", + description: + "Amount of months in past that Homarr should load in background. Higher number means more memory usage.", + values: "2-9999", + defaultValue: "2", + }, + { + name: "End at", + description: + "Amount of months in future that Homarr should load in background. Higher number means more memory usage.", + values: "2-9999", + defaultValue: "2", + }, + { + name: "Show unmonitored", + description: "Whether to show releases that are not monitored in the integration.", + values: { type: "boolean" }, + defaultValue: "no", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/clock/img/local.png b/apps/docs/docs/widgets/clock/img/local.png new file mode 100644 index 000000000..fa1cab4cd Binary files /dev/null and b/apps/docs/docs/widgets/clock/img/local.png differ diff --git a/apps/docs/docs/widgets/clock/img/london-with-seconds.png b/apps/docs/docs/widgets/clock/img/london-with-seconds.png new file mode 100644 index 000000000..b233b8445 Binary files /dev/null and b/apps/docs/docs/widgets/clock/img/london-with-seconds.png differ diff --git a/apps/docs/docs/widgets/clock/img/tokyo-12-hour.png b/apps/docs/docs/widgets/clock/img/tokyo-12-hour.png new file mode 100644 index 000000000..687fcc647 Binary files /dev/null and b/apps/docs/docs/widgets/clock/img/tokyo-12-hour.png differ diff --git a/apps/docs/docs/widgets/clock/index.mdx b/apps/docs/docs/widgets/clock/index.mdx new file mode 100644 index 000000000..efdab31d4 --- /dev/null +++ b/apps/docs/docs/widgets/clock/index.mdx @@ -0,0 +1,38 @@ +--- +title: 'Date and time' +description: 'Displays the current date and time.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { clockWidget } from '.'; + + + + +The clock widget displays the current date and time in a customizable format. + +### Screenshots + +import localClock from './img/local.png'; +import londonClock from './img/london-with-seconds.png'; +import tokyoClock from './img/tokyo-12-hour.png'; + +
+ clock format-24-hours timezone-local + clock format-24-hours with-seconds timezone-london + clock format-12-hours timezone-tokyo +
+ + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/clock/index.ts b/apps/docs/docs/widgets/clock/index.ts new file mode 100644 index 000000000..5cdb1e2a8 --- /dev/null +++ b/apps/docs/docs/widgets/clock/index.ts @@ -0,0 +1,73 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconClock } from "@tabler/icons-react"; + +export const clockWidget: WidgetDefinition = { + icon: IconClock, + name: "Date and time", + description: "Displays the current date and time.", + path: "../../widgets/clock", + configuration: { + items: [ + { + name: "Custom Title/City display", + description: "Show off a custom title or the name of the city/country on top of the clock.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Title", + description: 'Title shown on top of the widget. Only shown if "Custom Title/City display" is enabled.', + values: { type: "string" }, + defaultValue: "-", + }, + { + name: "24-hour format", + description: "Use 24-hour format instead of 12-hour format.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Display seconds", + description: "Whether to show seconds in the clock.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Use fixed timezone", + description: "Select custom timezone to display instead of the client timezone.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Timezone", + description: 'Choose the timezone following the IANA standard. Only shown if "Use fixed timezone" is enabled.', + values: "Any IANA timezone, e.g. 'Europe/Berlin', 'America/New_York', 'Asia/Tokyo'", + defaultValue: "Europe/London", + }, + { + name: "Show the date", + description: "Whether to show the date below the clock.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Date format", + description: "Format of the date displayed below the clock.", + values: "A collection of date formats, e.g. 'DD/MM/YYYY', 'MM/DD/YYYY', etc.", + defaultValue: "dddd, MMMM D", + }, + { + name: "Custom time format", + description: "Format of the time displayed in the clock.", + values: 'ISO 8601 format, e.g. "HH:mm:ss", "hh:mm A", etc.', + defaultValue: "-", + }, + { + name: "Custom date format", + description: "Format of the date displayed below the clock.", + values: 'ISO 8601 format, e.g. "YYYY-MM-DD", "DD/MM/YYYY", etc.', + defaultValue: "-", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/coolify/index.mdx b/apps/docs/docs/widgets/coolify/index.mdx new file mode 100644 index 000000000..23eb6ba03 --- /dev/null +++ b/apps/docs/docs/widgets/coolify/index.mdx @@ -0,0 +1,47 @@ +--- +title: 'Coolify' +description: 'Overview of your Coolify instance with servers, applications, and services.' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { coolifyWidget } from '.'; +import { coolifyIntegration } from '@site/docs/integrations/coolify'; + + + +The Coolify widget displays a compact overview of your Coolify instance. It can show servers, applications, and services with status indicators, project and environment context, direct links to Coolify, and the installed Coolify version. + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + + + +### Sections + +| Section | Description | +|---|---| +| **Servers** | Lists Coolify servers, reachability status, and application/service counts per server. | +| **Applications** | Lists applications with runtime status, project and environment context, public URL links, Coolify dashboard links, and log links. | +| **Services** | Lists services with runtime status, project and environment context, public URL links, Coolify dashboard links, and log links. | + +### Notes + +- The widget supports one or more Coolify integrations. With multiple integrations, each instance is shown as a separate card. +- The Coolify API token is team-scoped. Homarr only shows resources available to the team where the token was created. +- Data is cached for 30 seconds and refreshed in the background. diff --git a/apps/docs/docs/widgets/coolify/index.ts b/apps/docs/docs/widgets/coolify/index.ts new file mode 100644 index 000000000..110267075 --- /dev/null +++ b/apps/docs/docs/widgets/coolify/index.ts @@ -0,0 +1,31 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconCloud } from "@tabler/icons-react"; + +export const coolifyWidget: WidgetDefinition = { + icon: IconCloud, + name: "Coolify", + description: "Overview of your Coolify instance with servers, applications, and services.", + path: "../../widgets/coolify", + configuration: { + items: [ + { + name: "Show servers", + description: "Display the servers section with reachability status and resource counts.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show applications", + description: "Display the applications section with status, project, environment, and links.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show services", + description: "Display the services section with status, project, environment, and links.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/dns-hole-controls/img/big.png b/apps/docs/docs/widgets/dns-hole-controls/img/big.png new file mode 100644 index 000000000..24089add1 Binary files /dev/null and b/apps/docs/docs/widgets/dns-hole-controls/img/big.png differ diff --git a/apps/docs/docs/widgets/dns-hole-controls/img/small.png b/apps/docs/docs/widgets/dns-hole-controls/img/small.png new file mode 100644 index 000000000..580890e14 Binary files /dev/null and b/apps/docs/docs/widgets/dns-hole-controls/img/small.png differ diff --git a/apps/docs/docs/widgets/dns-hole-controls/index.mdx b/apps/docs/docs/widgets/dns-hole-controls/index.mdx new file mode 100644 index 000000000..cea517545 --- /dev/null +++ b/apps/docs/docs/widgets/dns-hole-controls/index.mdx @@ -0,0 +1,57 @@ +--- +title: 'DNS Hole Controls' +description: "Control PiHole or AdGuard from your dashboard." +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { dnsHoleControlsWidget } from '.'; +import { adguardHomeIntegration } from '@site/docs/integrations/adguard-home'; +import { piHoleIntegration } from '@site/docs/integrations/pi-hole'; +import { technitiumDnsIntegration } from '@site/docs/integrations/technitium-dns'; + + + + +This widget allows you to enable or disable your DNS Hole. + +### Screenshots + +import bigSize from './img/big.png'; +import smallSize from './img/small.png'; + + +dns-hole-controls big-size with-toggle-all-buttons +dns-hole-controls small-size no-toggle-all-buttons + +### Supported Integrations + + + +### Interactions + +- Enable / Disable one dns-hole by clicking on the badge. +- Disable one dns-hole in x seconds by clicking on the clock icon. +- Do all of the above for all dns-holes by using the top button row. + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/dns-hole-controls/index.ts b/apps/docs/docs/widgets/dns-hole-controls/index.ts new file mode 100644 index 000000000..5125c0ce3 --- /dev/null +++ b/apps/docs/docs/widgets/dns-hole-controls/index.ts @@ -0,0 +1,19 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconDeviceGamepad } from "@tabler/icons-react"; + +export const dnsHoleControlsWidget: WidgetDefinition = { + icon: IconDeviceGamepad, + name: "DNS Hole Controls", + description: "Control PiHole or AdGuard from your dashboard", + path: "../../widgets/dns-hole-controls", + configuration: { + items: [ + { + name: "Show Toggle All Buttons", + description: "Show or not the 2 buttons that may be redundant when having only one DNS-hole.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/dns-hole-summary/img/grid.png b/apps/docs/docs/widgets/dns-hole-summary/img/grid.png new file mode 100644 index 000000000..7cac71f44 Binary files /dev/null and b/apps/docs/docs/widgets/dns-hole-summary/img/grid.png differ diff --git a/apps/docs/docs/widgets/dns-hole-summary/img/horizontal.png b/apps/docs/docs/widgets/dns-hole-summary/img/horizontal.png new file mode 100644 index 000000000..22928f577 Binary files /dev/null and b/apps/docs/docs/widgets/dns-hole-summary/img/horizontal.png differ diff --git a/apps/docs/docs/widgets/dns-hole-summary/img/vertical.png b/apps/docs/docs/widgets/dns-hole-summary/img/vertical.png new file mode 100644 index 000000000..2e64a7a50 Binary files /dev/null and b/apps/docs/docs/widgets/dns-hole-summary/img/vertical.png differ diff --git a/apps/docs/docs/widgets/dns-hole-summary/index.mdx b/apps/docs/docs/widgets/dns-hole-summary/index.mdx new file mode 100644 index 000000000..1dcb123da --- /dev/null +++ b/apps/docs/docs/widgets/dns-hole-summary/index.mdx @@ -0,0 +1,56 @@ +--- +title: 'DNS Hole Summary' +description: "Displays the summary of your DNS Hole." +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { dnsHoleSummaryWidget } from '.'; + + + + +This widget allows you to display statistics about your DNS Hole like total queries, blocked queries, and more. + +### Screenshots + +import gridLayout from './img/grid.png'; +import verticalLayout from './img/vertical.png'; +import horizontalLayout from './img/horizontal.png'; +import { adguardHomeIntegration } from '@site/docs/integrations/adguard-home'; +import { piHoleIntegration } from '@site/docs/integrations/pi-hole'; +import { technitiumDnsIntegration } from '@site/docs/integrations/technitium-dns'; + +
+ grid-layout pi-hole-colors +
+ vertical-layout no-colors + horizontal-layout pi-hole-colors +
+
+ +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/dns-hole-summary/index.ts b/apps/docs/docs/widgets/dns-hole-summary/index.ts new file mode 100644 index 000000000..3f49f9fbd --- /dev/null +++ b/apps/docs/docs/widgets/dns-hole-summary/index.ts @@ -0,0 +1,28 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconAd } from "@tabler/icons-react"; + +export const dnsHoleSummaryWidget: WidgetDefinition = { + icon: IconAd, + name: "DNS Hole Summary", + description: "Displays the summary of your DNS Hole", + path: "../../widgets/dns-hole-summary", + configuration: { + items: [ + { + name: "Layout", + description: "Choose the layout of the widget", + values: { + type: "select", + options: ["Horizontal", "Vertical", "Grid"], + }, + defaultValue: "Grid", + }, + { + name: "Use Pi-Hole colors", + description: "Color the tiles using the background color, that is used by default in PiHole.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/docker-containers/img/table.png b/apps/docs/docs/widgets/docker-containers/img/table.png new file mode 100644 index 000000000..ff5aa337a Binary files /dev/null and b/apps/docs/docs/widgets/docker-containers/img/table.png differ diff --git a/apps/docs/docs/widgets/docker-containers/index.mdx b/apps/docs/docs/widgets/docker-containers/index.mdx new file mode 100644 index 000000000..190006764 --- /dev/null +++ b/apps/docs/docs/widgets/docker-containers/index.mdx @@ -0,0 +1,51 @@ +--- +title: 'Docker stats' +description: 'Stats of your containers' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { dockerContainersWidget } from '.'; +import { dockerIntegration } from '@site/docs/integrations/docker'; + + + + +This widget displays the resource usage of your Docker containers and allows you to manage them. + +:::info +This widget can only be used with administrator privileges. +::: + +### Screenshots + +import dockerTable from './img/table.png'; + +docker-stats table docker-containers + +### Supported Integrations + + + +### Interactions + +Each container row has an action menu (accessible via the three-dot icon) with the following options: +- **View logs** — opens a dedicated terminal page streaming the container's logs +- **Start** / **Stop** / **Restart** — manage the container's state +- **Remove** — remove the container +- **Add to Homarr** — create a bookmark app from the container + +### Adding the widget + + diff --git a/apps/docs/docs/widgets/docker-containers/index.ts b/apps/docs/docs/widgets/docker-containers/index.ts new file mode 100644 index 000000000..3e4a17ab6 --- /dev/null +++ b/apps/docs/docs/widgets/docker-containers/index.ts @@ -0,0 +1,34 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBrandDocker } from "@tabler/icons-react"; + +export const dockerContainersWidget: WidgetDefinition = { + icon: IconBrandDocker, + name: "Docker stats", + description: "Stats of your containers", + path: "../../widgets/docker-containers", + configuration: { + items: [ + { + name: "Enable items sorting", + description: "Allows to sort containers by clicking on the column headers", + values: { type: "boolean" }, + defaultValue: "No", + }, + { + name: "Column used for sorting by default", + description: "Select which column to use for sorting the containers when the widget is loaded", + values: { + type: "select", + options: ["Name", "State", "CPU usage", "Memory usage"], + }, + defaultValue: "Name", + }, + { + name: "Invert sorting", + description: "Invert the sorting order (ascending / descending) for the default sorting column", + values: { type: "boolean" }, + defaultValue: "No", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/downloads/img/screenshot.png b/apps/docs/docs/widgets/downloads/img/screenshot.png new file mode 100644 index 000000000..c6cdde381 Binary files /dev/null and b/apps/docs/docs/widgets/downloads/img/screenshot.png differ diff --git a/apps/docs/docs/widgets/downloads/index.mdx b/apps/docs/docs/widgets/downloads/index.mdx new file mode 100644 index 000000000..9242a84eb --- /dev/null +++ b/apps/docs/docs/widgets/downloads/index.mdx @@ -0,0 +1,71 @@ +--- +title: 'Download Client' +description: 'Allows you to view and manage your Downloads from both Torrent and Usenet clients.' +hide_title: true +--- + +import { delugeIntegration } from '@site/docs/integrations/deluge'; +import { nzbgetIntegration } from '@site/docs/integrations/nzbget'; +import { qBittorentIntegration } from '@site/docs/integrations/q-bittorent'; +import { sabnzbdIntegration } from '@site/docs/integrations/sabnzbd'; +import { transmissionIntegration } from '@site/docs/integrations/transmission'; +import { slskdIntegration } from '@site/docs/integrations/slskd'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; +import { downloadsWidget } from '.'; + + + + +This widget displays a list of torrents or usenet-articles that are currently being downloaded, along with their progress and other relevant information. + +### Screenshots + +import downloadsCard from './img/screenshot.png'; + +
+ downloads +
+ +### Supported Integrations + + + +### Interactions + +- Pause / Resume one download by clicking on the according icon. +- Delete one download by clicking on the trash icon. (Can also delete the files) +- Pause / Resume all downloads by using the bottom button. + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/downloads/index.ts b/apps/docs/docs/widgets/downloads/index.ts new file mode 100644 index 000000000..4810aec89 --- /dev/null +++ b/apps/docs/docs/widgets/downloads/index.ts @@ -0,0 +1,109 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconDownload } from "@tabler/icons-react"; + +const columnsList = [ + "id", + "actions", + "added", + "category", + "downSpeed", + "index", + "integration", + "name", + "progress", + "ratio", + "received", + "sent", + "size", + "state", + "time", + "type", + "upSpeed", +]; +const sortingExclusion = ["actions", "id", "state"]; +const columnsSort = columnsList.filter((column) => !sortingExclusion.some((exclusion) => exclusion === column)); + +export const downloadsWidget: WidgetDefinition = { + icon: IconDownload, + name: "Download Client", + description: "Allows you to view and manage your Downloads from both Torrent and Usenet clients.", + path: "../../widgets/downloads", + configuration: { + items: [ + { + name: "Columns to show", + description: "Select the columns you want to display in the widget.", + values: `List of columns: ${columnsList.join(", ")}`, + defaultValue: ["integration", "name", "progress", "time", "actions"].join(", "), + }, + { + name: "Enable items sorting", + description: "Enables the sorting in the table.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Column used for sorting by default", + description: "By default it will sort by this column.", + defaultValue: "type", + values: `List of columns: ${columnsSort.join(", ")}`, + }, + { + name: "Invert sorting", + description: "This will invert the sorting order of the table.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Show usenet entries marked as completed", + description: "This will show entries that have been completed in your Usenet client.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show torrent entries marked as completed", + description: "This will show entries that have been completed in your Torrent client.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show Miscellaneous entries marked as completed", + description: "This will show entries that have been completed in your Miscellaneous client.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Hide completed torrent under this threshold (in kiB/s)", + description: + "This will hide completed torrent entries that have a download speed below the specified threshold.", + values: "Any number above 1, 0 to disable", + defaultValue: "0", + }, + { + name: "Categories/names to filter", + description: "You can filter the items by categories or names. Use a comma to separate multiple values.", + values: "Comma-separated list of categories or names", + defaultValue: "-", + }, + { + name: "Filter as a whitelist", + description: + "If enabled, only items that match the filter will be shown. If disabled, items that do not match the filter will be hidden.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Use filter to calculate Ratio", + description: "This will use the filter to calculate the ratio of items shown in the widget.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Limit items per integration", + description: "This will limit the number of items shown per integration, not globally", + values: "Any number above 1", + defaultValue: "50", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/firewall/img/firewall_widget.png b/apps/docs/docs/widgets/firewall/img/firewall_widget.png new file mode 100644 index 000000000..80f74f1b8 Binary files /dev/null and b/apps/docs/docs/widgets/firewall/img/firewall_widget.png differ diff --git a/apps/docs/docs/widgets/firewall/index.mdx b/apps/docs/docs/widgets/firewall/index.mdx new file mode 100644 index 000000000..95aaa56d6 --- /dev/null +++ b/apps/docs/docs/widgets/firewall/index.mdx @@ -0,0 +1,33 @@ +--- +title: 'Firewall Monitoring' +description: 'Displays a summary of firewalls.' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { firewallWidget } from '.'; +import { opnsenseIntegration } from '../../integrations/opnsense'; + + + + +### Screenshots + +![Firewall Widget](img/firewall_widget.png) + +### Supported Integrations + + + +### Adding the widget + + diff --git a/apps/docs/docs/widgets/firewall/index.ts b/apps/docs/docs/widgets/firewall/index.ts new file mode 100644 index 000000000..42178c165 --- /dev/null +++ b/apps/docs/docs/widgets/firewall/index.ts @@ -0,0 +1,12 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconWall } from "@tabler/icons-react"; + +export const firewallWidget: WidgetDefinition = { + icon: IconWall, + name: "Firewall Monitoring", + description: "Displays a summary of firewalls.", + path: "../../widgets/firewall", + configuration: { + items: [], + }, +}; diff --git a/apps/docs/docs/widgets/health-monitoring/img/cluster-view.png b/apps/docs/docs/widgets/health-monitoring/img/cluster-view.png new file mode 100644 index 000000000..c39218384 Binary files /dev/null and b/apps/docs/docs/widgets/health-monitoring/img/cluster-view.png differ diff --git a/apps/docs/docs/widgets/health-monitoring/img/system-view.png b/apps/docs/docs/widgets/health-monitoring/img/system-view.png new file mode 100644 index 000000000..ac457dedf Binary files /dev/null and b/apps/docs/docs/widgets/health-monitoring/img/system-view.png differ diff --git a/apps/docs/docs/widgets/health-monitoring/index.mdx b/apps/docs/docs/widgets/health-monitoring/index.mdx new file mode 100644 index 000000000..9e41a5fcc --- /dev/null +++ b/apps/docs/docs/widgets/health-monitoring/index.mdx @@ -0,0 +1,61 @@ +--- +title: 'System Health Monitoring' +description: 'Displays information showing the health and status of your system(s).' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { healthMonitoringWidget } from '.'; +import { dashDotIntegration } from '@site/docs/integrations/dash-dot'; +import { openMediaVaultIntegration } from '@site/docs/integrations/open-media-vault'; +import { proxmoxIntegration } from '@site/docs/integrations/proxmox'; +import { glancesIntegration } from '@site/docs/integrations/glances'; + + + + +This widget displays information about the health and status of your system(s), including CPU, memory, disk usage, and more. + +### Screenshots + +import systemView from './img/system-view.png'; +import clusterView from './img/cluster-view.png'; +import { truenasIntegration } from '@site/docs/integrations/truenas'; + +health-monitoring system-view +health-monitoring cluster-view + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/health-monitoring/index.ts b/apps/docs/docs/widgets/health-monitoring/index.ts new file mode 100644 index 000000000..2a3cc6a58 --- /dev/null +++ b/apps/docs/docs/widgets/health-monitoring/index.ts @@ -0,0 +1,68 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconHeartRateMonitor } from "@tabler/icons-react"; + +export const healthMonitoringWidget: WidgetDefinition = { + icon: IconHeartRateMonitor, + name: "System Health Monitoring", + description: "Displays information showing the health and status of your system(s).", + path: "../../widgets/health-monitoring", + configuration: { + items: [ + { + name: "CPU Temp in Fahrenheit", + description: "Display the CPU temperature in Fahrenheit or Celsius", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Show CPU Info", + description: "Displays CPU info in the system tab", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show Memory Info", + description: "Displays memory info in the system tab", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show Uptime", + description: "Show uptime in the cluster tab", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show Filesystem Info", + description: "Displays filesystem info in the system tab", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Default tab", + description: "Tab that should be visible by default. Only used when multiple integrations are available.", + values: { + type: "select", + options: ["System", "Cluster"], + }, + defaultValue: "System", + }, + { + name: "Visible cluster sections", + description: "Select which sections should be visible in the cluster tab", + values: "List of Nodes, VMs, LXCs, Storage", + defaultValue: "Nodes, VMs, LXCs, Storage", + }, + { + name: "Section indicator requirement", + description: + "'All' requires that all items be online for the indicator to be green. 'Any' requires at least one item to be online.", + values: { + type: "select", + options: ["All", "Any"], + }, + defaultValue: "All", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/iframe/img/homarr-iframes-example.webp b/apps/docs/docs/widgets/iframe/img/homarr-iframes-example.webp new file mode 100644 index 000000000..8d202847f Binary files /dev/null and b/apps/docs/docs/widgets/iframe/img/homarr-iframes-example.webp differ diff --git a/apps/docs/docs/widgets/iframe/img/nasa-iss-stream.png b/apps/docs/docs/widgets/iframe/img/nasa-iss-stream.png new file mode 100644 index 000000000..f1d830be7 Binary files /dev/null and b/apps/docs/docs/widgets/iframe/img/nasa-iss-stream.png differ diff --git a/apps/docs/docs/widgets/iframe/img/transparent-iframe.png b/apps/docs/docs/widgets/iframe/img/transparent-iframe.png new file mode 100644 index 000000000..1675f697a Binary files /dev/null and b/apps/docs/docs/widgets/iframe/img/transparent-iframe.png differ diff --git a/apps/docs/docs/widgets/iframe/img/wikipedia.png b/apps/docs/docs/widgets/iframe/img/wikipedia.png new file mode 100644 index 000000000..f071e0319 Binary files /dev/null and b/apps/docs/docs/widgets/iframe/img/wikipedia.png differ diff --git a/apps/docs/docs/widgets/iframe/index.mdx b/apps/docs/docs/widgets/iframe/index.mdx new file mode 100644 index 000000000..5be26f3b2 --- /dev/null +++ b/apps/docs/docs/widgets/iframe/index.mdx @@ -0,0 +1,103 @@ +--- +title: 'iFrame' +description: 'Embed any content from the internet. Some websites may restrict access.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { iframeWidget } from '.'; + + + + +If your application is not supported natively by Homarr, you can integrate it using the iframe widget. +It uses the [iframe element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe), +which embeds the desired page in the browser. +This means, no traffic is routed through Homarr (and the URL must be reachable from the client). + +### Screenshots + +import wikipediaHomepage from './img/wikipedia.png'; +import youtubeStream from './img/nasa-iss-stream.png'; + +
+ iframe wikipedia-homepage + iframe youtube-iss-stream +
+ +### Adding the widget + + + +### Limitations + +Although you can integrate many websites, some may not work. +This is because the administrators of those sites disallow iframes +for security reasons, as users could easily be tricked +by embeding the original site on a malicious page. + +Some proxies disallow iframes by default for this reason. +You can use https://iframetest.com to check, if the site is allowing iframes. + +If you manage all of your own applications, you can usually change that by configuring +the appropriate headers (such as `X-Frame-Options` or `Content-Security-Policy`) to allow iframes. + +For example, to allow your site to be embedded in iframes from specific domains: + +**Apache (.htaccess or httpd.conf):** +```apache +Header set Content-Security-Policy "frame-ancestors 'self' https://trusted-domain.com" +Header set X-Frame-Options "ALLOW-FROM https://trusted-domain.com" +``` + +**Nginx:** +```nginx +add_header Content-Security-Policy "frame-ancestors 'self' https://trusted-domain.com"; +add_header X-Frame-Options "ALLOW-FROM https://trusted-domain.com"; +``` + +### Example URLs + +- **Wikipedia homepage:** https://en.wikipedia.org/wiki/Main_Page +- **Any YouTube video or stream:** https://www.youtube.com/embed/dQw4w9WgXcQ?si=MWUbbG66UNTla_Ni + +### Configuration + + +### Transparent iframes + +To create a transparent iframe like below you can use the following html code and load it into your iframe: + +```html + + + + + +``` + +![transparent iframe](./img/transparent-iframe.png) + +### Third party content +:::warning + +The content below is an overview of third party projects. All support requests/problems must be redirected to the appropriate repository. +We cannot guarantee the functionality nor security of these tools. + +::: + +### homarr-iframes from Diogo Valentim +The project [homarr-iframes](https://github.com/diogovalentte/homarr-iframes) has iframes designed to be used with Homarr, these iframes offer a minimalist view of other systems: + +- [Vikunja](https://github.com/go-vikunja/vikunja): overview of your tasks with links to them. +- [Linkwarden](https://github.com/linkwarden/linkwarden): overview of your bookmarks with links to them. +- [Cinemark Brazil](https://www.cinemark.com.br): overview of the movies in Cinemark theaters in your city (*only in Brazil*). + +![Image of the Vikunja (left), Linkwarden (middle), and Cinemark Brazil (right) iframes on a Homarr dashboard](./img/homarr-iframes-example.webp "Image of the Vikunja (left), Linkwarden (middle), and Cinemark Brazil (right) iframes on a Homarr dashboard") + +You can [configure the iframes appearance and behavior](https://github.com/diogovalentte/homarr-iframes?tab=readme-ov-file#adding-to-homarr) using query arguments when adding them to your dashboard, like selecting the iframe theme and limit of items to show, and other options specific to each iframe. diff --git a/apps/docs/docs/widgets/iframe/index.ts b/apps/docs/docs/widgets/iframe/index.ts new file mode 100644 index 000000000..f876dc826 --- /dev/null +++ b/apps/docs/docs/widgets/iframe/index.ts @@ -0,0 +1,67 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBrowser } from "@tabler/icons-react"; + +export const iframeWidget: WidgetDefinition = { + icon: IconBrowser, + name: "iFrame", + description: "Embed any content from the internet. Some websites may restrict access.", + path: "../../widgets/iframe", + configuration: { + items: [ + { + name: "Embed URL", + description: "The URL of the content to embed in the widget.", + values: "Any valid URL", + defaultValue: "-", + }, + { + name: "Allow full screen", + description: "Whether to allow the embedded content to be displayed in full screen mode.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Allow scrolling", + description: "Whether to allow the embedded content to be scrolled.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Allow payment", + description: "Whether to allow the embedded content to process payments.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Allow auto play", + description: "Whether to allow the embedded content to auto play media.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Allow microphone", + description: "Whether to allow the embedded content to access the microphone.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Allow camera", + description: "Whether to allow the embedded content to access the camera.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Allow geolocation", + description: "Whether to allow the embedded content to access the geolocation.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Allow modals", + description: "Whether to allow the embedded content to open modal windows.", + values: { type: "boolean" }, + defaultValue: "no", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/immich-album-carousel/img/screen.png b/apps/docs/docs/widgets/immich-album-carousel/img/screen.png new file mode 100644 index 000000000..70e7612d5 Binary files /dev/null and b/apps/docs/docs/widgets/immich-album-carousel/img/screen.png differ diff --git a/apps/docs/docs/widgets/immich-album-carousel/index.mdx b/apps/docs/docs/widgets/immich-album-carousel/index.mdx new file mode 100644 index 000000000..59b1beeb9 --- /dev/null +++ b/apps/docs/docs/widgets/immich-album-carousel/index.mdx @@ -0,0 +1,40 @@ +--- +title: 'Immich Album Carousel' +description: 'Shows a slideshow of your album pictures from Immich' +hide_title: true +--- + +import { immichIntegration } from '../../integrations/immich';import { + AddingWidget +} from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { immichAlbumCarouselWidget } from '.'; + + + + +### Screenshots + +import screen from './img/screen.png'; + +immich album size-big + +### Supported Integrations + + + +### Adding the widget + + + + +### Configuration + + diff --git a/apps/docs/docs/widgets/immich-album-carousel/index.ts b/apps/docs/docs/widgets/immich-album-carousel/index.ts new file mode 100644 index 000000000..327314c3d --- /dev/null +++ b/apps/docs/docs/widgets/immich-album-carousel/index.ts @@ -0,0 +1,32 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconPhoto } from "@tabler/icons-react"; + +export const immichAlbumCarouselWidget: WidgetDefinition = { + icon: IconPhoto, + name: "Immich Album", + description: "Shows a slideshow of your album pictures from Immich", + path: "../../widgets/immich-album-carousel", + configuration: { + items: [ + { + name: "Album ID", + description: + "This is a unique ID which refers to your Immich album. You can find this id by opening an album and copying the unique string from the URL, for example 'a21aca09-9f05-47dc-b1a1-7b53c547226e'", + values: { type: "string" }, + defaultValue: "", + }, + { + name: "Interval in seconds", + description: "Rotate between pictures in the album every X seconds. Must be at least 1. Must be below 3600", + values: { type: "string" }, + defaultValue: "", + }, + { + name: "Show photo info", + description: "Display date of the picture and the current index at the bottom of the slideshow", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/immich-server-stats/img/screen.png b/apps/docs/docs/widgets/immich-server-stats/img/screen.png new file mode 100644 index 000000000..2b59fcfdd Binary files /dev/null and b/apps/docs/docs/widgets/immich-server-stats/img/screen.png differ diff --git a/apps/docs/docs/widgets/immich-server-stats/index.mdx b/apps/docs/docs/widgets/immich-server-stats/index.mdx new file mode 100644 index 000000000..73d278a91 --- /dev/null +++ b/apps/docs/docs/widgets/immich-server-stats/index.mdx @@ -0,0 +1,40 @@ +--- +title: 'Immich Server Stats' +description: 'Information about your Immich instance' +hide_title: true +--- + +import { immichIntegration } from '../../integrations/immich'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { immichServerStatsWidget } from '.'; + + + + +### Screenshots + +import screen from './img/screen.png'; + + +immich server stats size-big + +### Supported Integrations + + + +### Adding the widget + + + + +### Configuration + + diff --git a/apps/docs/docs/widgets/immich-server-stats/index.ts b/apps/docs/docs/widgets/immich-server-stats/index.ts new file mode 100644 index 000000000..13a1a339e --- /dev/null +++ b/apps/docs/docs/widgets/immich-server-stats/index.ts @@ -0,0 +1,37 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconGraph } from "@tabler/icons-react"; + +export const immichServerStatsWidget: WidgetDefinition = { + icon: IconGraph, + name: "Immich Server Stats", + description: "Information about your Immich instance", + path: "../../widgets/immich-server-stats", + configuration: { + items: [ + { + name: "Show users", + description: "Show count of users on your instance", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show photos", + description: "Show count of photos on your instance", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show videos", + description: "Show count of videos on your instance", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show storage", + description: "Show the total amount of storage used", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/indexer-manager/img/big.png b/apps/docs/docs/widgets/indexer-manager/img/big.png new file mode 100644 index 000000000..6292fbd66 Binary files /dev/null and b/apps/docs/docs/widgets/indexer-manager/img/big.png differ diff --git a/apps/docs/docs/widgets/indexer-manager/img/small.png b/apps/docs/docs/widgets/indexer-manager/img/small.png new file mode 100644 index 000000000..d35a37a90 Binary files /dev/null and b/apps/docs/docs/widgets/indexer-manager/img/small.png differ diff --git a/apps/docs/docs/widgets/indexer-manager/index.mdx b/apps/docs/docs/widgets/indexer-manager/index.mdx new file mode 100644 index 000000000..fad8c341b --- /dev/null +++ b/apps/docs/docs/widgets/indexer-manager/index.mdx @@ -0,0 +1,47 @@ +--- +title: 'Indexer manager status' +description: 'View the status of your indexers.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { indexerManagerWidget } from '.'; + + + + +### Screenshots + +import bigItem from './img/big.png'; +import smallItem from './img/small.png'; +import { prowlarrIntegration } from '@site/docs/integrations/prowlarr'; + +
+ indexer-manager size-big + indexer-manager size-small +
+ +### Supported Integrations + + + +### Interactions + +- Test all indexers by clicking on the test button. + +### Adding the widget + + + + +### Configuration + + diff --git a/apps/docs/docs/widgets/indexer-manager/index.ts b/apps/docs/docs/widgets/indexer-manager/index.ts new file mode 100644 index 000000000..aaa521551 --- /dev/null +++ b/apps/docs/docs/widgets/indexer-manager/index.ts @@ -0,0 +1,19 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconReportSearch } from "@tabler/icons-react"; + +export const indexerManagerWidget: WidgetDefinition = { + icon: IconReportSearch, + name: "Indexer manager status", + description: "View the status of your indexers.", + path: "../../widgets/indexer-manager", + configuration: { + items: [ + { + name: "Open in new tab", + description: "Open indexer site in new tab", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/media-releases/img/backdrop.png b/apps/docs/docs/widgets/media-releases/img/backdrop.png new file mode 100644 index 000000000..fb768b41f Binary files /dev/null and b/apps/docs/docs/widgets/media-releases/img/backdrop.png differ diff --git a/apps/docs/docs/widgets/media-releases/img/poster.png b/apps/docs/docs/widgets/media-releases/img/poster.png new file mode 100644 index 000000000..bce8e0dd4 Binary files /dev/null and b/apps/docs/docs/widgets/media-releases/img/poster.png differ diff --git a/apps/docs/docs/widgets/media-releases/index.mdx b/apps/docs/docs/widgets/media-releases/index.mdx new file mode 100644 index 000000000..fece199eb --- /dev/null +++ b/apps/docs/docs/widgets/media-releases/index.mdx @@ -0,0 +1,49 @@ +--- +title: 'Media releases' +description: 'Display newly added medias or upcoming releases from different integrations' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { mediaReleasesWidget } from '.'; +import { embyIntegration } from '@site/docs/integrations/emby'; +import { jellyfinIntegration } from '@site/docs/integrations/jellyfin'; +import { plexIntegration } from '@site/docs/integrations/plex'; + + + + +Provides a list of newly added media or upcoming releases from your media server. + +### Screenshots + +import backdrop from './img/backdrop.png'; +import poster from './img/poster.png'; + +
+ media-releases layout-backdrop + media-releases layout-poster +
+ +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/media-releases/index.ts b/apps/docs/docs/widgets/media-releases/index.ts new file mode 100644 index 000000000..8f2f2644a --- /dev/null +++ b/apps/docs/docs/widgets/media-releases/index.ts @@ -0,0 +1,46 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconTicket } from "@tabler/icons-react"; + +export const mediaReleasesWidget: WidgetDefinition = { + icon: IconTicket, + name: "Media releases", + description: "Display newly added medias or upcoming releases from different integrations", + path: "../../widgets/media-releases", + configuration: { + items: [ + { + name: "Layout", + description: "How the image should be displayed", + values: { + type: "select", + options: ["Backdrop", "Poster"], + }, + defaultValue: "Backdrop", + }, + { + name: "Show description tooltip", + description: "Show a tooltip with the description of the media when hovering over the media item", + values: { + type: "boolean", + }, + defaultValue: "true", + }, + { + name: "Show media type badge", + description: "Show a badge indicating the type of media (e.g., movie, series)", + values: { + type: "boolean", + }, + defaultValue: "true", + }, + { + name: "Show source integration", + description: "Show avatar of the source integration", + values: { + type: "boolean", + }, + defaultValue: "true", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/media-request-list/img/list.png b/apps/docs/docs/widgets/media-request-list/img/list.png new file mode 100644 index 000000000..a6cf190fd Binary files /dev/null and b/apps/docs/docs/widgets/media-request-list/img/list.png differ diff --git a/apps/docs/docs/widgets/media-request-list/index.mdx b/apps/docs/docs/widgets/media-request-list/index.mdx new file mode 100644 index 000000000..2f52a8e1f --- /dev/null +++ b/apps/docs/docs/widgets/media-request-list/index.mdx @@ -0,0 +1,50 @@ +--- +title: 'Media Request List' +description: 'See a list of all media requests from your integration' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { mediaRequestListWidget } from '.'; +import { jellyseerrIntegration } from '@site/docs/integrations/jellyseerr'; +import { overseerrIntegration } from '@site/docs/integrations/overseerr'; + + + + +Provides a list of all open and recently closed requests. It also provides the functionality to approve or reject requests. + +### Screenshots + +import mediaRequestList from './img/list.png'; + +media-request-list + +### Supported Integrations + + + +### Interactions + +- Approve / decline a request by clicking on the thumbs up or down icon. +- Hover over the widget to reveal a **search button** that opens Spotlight in media request search mode, scoped to the widget's integrations. + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/media-request-list/index.ts b/apps/docs/docs/widgets/media-request-list/index.ts new file mode 100644 index 000000000..8eb9d8bfb --- /dev/null +++ b/apps/docs/docs/widgets/media-request-list/index.ts @@ -0,0 +1,19 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconZoomQuestion } from "@tabler/icons-react"; + +export const mediaRequestListWidget: WidgetDefinition = { + icon: IconZoomQuestion, + name: "Media Request List", + description: "See a list of all media requests from your integration", + path: "../../widgets/media-request-list", + configuration: { + items: [ + { + name: "Open links in new tab", + description: "If enabled, links will open in a new tab.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/media-request-stats/img/stats.png b/apps/docs/docs/widgets/media-request-stats/img/stats.png new file mode 100644 index 000000000..6aad5b95c Binary files /dev/null and b/apps/docs/docs/widgets/media-request-stats/img/stats.png differ diff --git a/apps/docs/docs/widgets/media-request-stats/index.mdx b/apps/docs/docs/widgets/media-request-stats/index.mdx new file mode 100644 index 000000000..a7b40f624 --- /dev/null +++ b/apps/docs/docs/widgets/media-request-stats/index.mdx @@ -0,0 +1,46 @@ +--- +title: 'Media Requests Stats' +description: 'Statistics about your media requests' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { mediaRequestStatsWidget } from '.'; +import { jellyseerrIntegration } from '@site/docs/integrations/jellyseerr'; +import { overseerrIntegration } from '@site/docs/integrations/overseerr'; + + + + +Provide a statistics overview of your media requests, such as mount of requests, open requests, approvement and rejections. + +### Supported Integrations + + + +### Screenshots + +import mediaRequestStats from './img/stats.png'; + +media-request-stats + +### Interactions + +- Hover over the widget to reveal a **search button** that opens Spotlight in media request search mode, scoped to the widget's integrations. + +### Adding the widget + + diff --git a/apps/docs/docs/widgets/media-request-stats/index.ts b/apps/docs/docs/widgets/media-request-stats/index.ts new file mode 100644 index 000000000..6842817ee --- /dev/null +++ b/apps/docs/docs/widgets/media-request-stats/index.ts @@ -0,0 +1,12 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconChartBar } from "@tabler/icons-react"; + +export const mediaRequestStatsWidget: WidgetDefinition = { + icon: IconChartBar, + name: "Media Requests Stats", + description: "Statistics about your media requests", + path: "../../widgets/media-request-stats", + configuration: { + items: [], + }, +}; diff --git a/apps/docs/docs/widgets/media-server/img/table.png b/apps/docs/docs/widgets/media-server/img/table.png new file mode 100644 index 000000000..d8153d22f Binary files /dev/null and b/apps/docs/docs/widgets/media-server/img/table.png differ diff --git a/apps/docs/docs/widgets/media-server/index.mdx b/apps/docs/docs/widgets/media-server/index.mdx new file mode 100644 index 000000000..accd83f8e --- /dev/null +++ b/apps/docs/docs/widgets/media-server/index.mdx @@ -0,0 +1,53 @@ +--- +title: 'Media server streams' +description: 'Show the current streams on your media servers' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { mediaServerWidget } from '.'; +import { embyIntegration } from '@site/docs/integrations/emby'; +import { jellyfinIntegration } from '@site/docs/integrations/jellyfin'; +import { plexIntegration } from '@site/docs/integrations/plex'; + + + + +The media server widget enables you to watch and view current active sessions over all your media servers. +It also displays useful information, that you can use when providing support to users or debugging a problem. + + + +### Screenshots + +import mediaTable from './img/table.png'; + +media-server-streams + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + + diff --git a/apps/docs/docs/widgets/media-server/index.ts b/apps/docs/docs/widgets/media-server/index.ts new file mode 100644 index 000000000..b9f5ec76f --- /dev/null +++ b/apps/docs/docs/widgets/media-server/index.ts @@ -0,0 +1,19 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconVideo } from "@tabler/icons-react"; + +export const mediaServerWidget: WidgetDefinition = { + icon: IconVideo, + name: "Media server streams", + description: "Show the current streams on your media servers", + path: "../../widgets/media-server", + configuration: { + items: [ + { + name: "Show only currently playing", + description: "Disabling this will not work for plex.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/media-transcoding/img/queue.png b/apps/docs/docs/widgets/media-transcoding/img/queue.png new file mode 100644 index 000000000..5678ee924 Binary files /dev/null and b/apps/docs/docs/widgets/media-transcoding/img/queue.png differ diff --git a/apps/docs/docs/widgets/media-transcoding/img/statistics.png b/apps/docs/docs/widgets/media-transcoding/img/statistics.png new file mode 100644 index 000000000..ba74cea92 Binary files /dev/null and b/apps/docs/docs/widgets/media-transcoding/img/statistics.png differ diff --git a/apps/docs/docs/widgets/media-transcoding/img/workers.png b/apps/docs/docs/widgets/media-transcoding/img/workers.png new file mode 100644 index 000000000..aa2124d6e Binary files /dev/null and b/apps/docs/docs/widgets/media-transcoding/img/workers.png differ diff --git a/apps/docs/docs/widgets/media-transcoding/index.mdx b/apps/docs/docs/widgets/media-transcoding/index.mdx new file mode 100644 index 000000000..0fc280021 --- /dev/null +++ b/apps/docs/docs/widgets/media-transcoding/index.mdx @@ -0,0 +1,51 @@ +--- +title: 'Media transcoding' +description: 'Statistics, current queue and worker status of your media transcoding' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { mediaTranscodingWidget } from '.'; +import { tdarrIntegration } from '@site/docs/integrations/tdarr'; + + + + +The media transcoding widget provides you with an overview of your media transcoding status. +It shows you the current queue, worker status, and statistics about your transcoding jobs. + + + +### Screenshots + +import queueCard from './img/queue.png'; +import workersCard from './img/workers.png'; +import statisticsCard from './img/statistics.png'; + +
+ media-transcoding workers-tab + media-transcoding  queue-tab + media-transcoding statistics-tab +
+ +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/media-transcoding/index.ts b/apps/docs/docs/widgets/media-transcoding/index.ts new file mode 100644 index 000000000..612a6a08a --- /dev/null +++ b/apps/docs/docs/widgets/media-transcoding/index.ts @@ -0,0 +1,25 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconTransform } from "@tabler/icons-react"; + +export const mediaTranscodingWidget: WidgetDefinition = { + icon: IconTransform, + name: "Media transcoding", + description: "Statistics, current queue and worker status of your media transcoding", + path: "../../widgets/media-transcoding", + configuration: { + items: [ + { + name: "Default view", + description: "Tab that is shown by default when the widget is opened", + values: { type: "select", options: ["Queue", "Workers", "Statistics"] }, + defaultValue: "Statistics", + }, + { + name: "Queue page size", + description: "Number of items shown per page in the queue", + values: "1-30", + defaultValue: "10", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/minecraft-server-status/img/bedrock.png b/apps/docs/docs/widgets/minecraft-server-status/img/bedrock.png new file mode 100644 index 000000000..e847201e8 Binary files /dev/null and b/apps/docs/docs/widgets/minecraft-server-status/img/bedrock.png differ diff --git a/apps/docs/docs/widgets/minecraft-server-status/img/java.png b/apps/docs/docs/widgets/minecraft-server-status/img/java.png new file mode 100644 index 000000000..8333a21a4 Binary files /dev/null and b/apps/docs/docs/widgets/minecraft-server-status/img/java.png differ diff --git a/apps/docs/docs/widgets/minecraft-server-status/index.mdx b/apps/docs/docs/widgets/minecraft-server-status/index.mdx new file mode 100644 index 000000000..51101246b --- /dev/null +++ b/apps/docs/docs/widgets/minecraft-server-status/index.mdx @@ -0,0 +1,44 @@ +--- +title: 'Minecraft Server Status' +description: 'Displays the status of a Minecraft server.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; +import { minecraftServerStatusWidget } from '.'; + + + + +Shows the status and amount of players on a Minecraft server. It supports both Java and Bedrock editions, however only public servers are supported which can be reached through the used api of [api.mcsrvstat.us](https://api.mcsrvstat.us). + +### Screenshots + +import javaItem from './img/java.png'; +import bedrockItem from './img/bedrock.png'; + +
+ minecraft-server-status java-edition + minecraft-server-status bedrock-editon +
+ +### Adding the widget + + + +### Configuration + + +### Data source + +We use the Minecraft Server Status API to fetch the server status. +If you need to whitelist the api, please use the following URL: `hhttps://api.mcsrvstat.us` \ No newline at end of file diff --git a/apps/docs/docs/widgets/minecraft-server-status/index.ts b/apps/docs/docs/widgets/minecraft-server-status/index.ts new file mode 100644 index 000000000..b97aea667 --- /dev/null +++ b/apps/docs/docs/widgets/minecraft-server-status/index.ts @@ -0,0 +1,31 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBrandMinecraft } from "@tabler/icons-react"; + +export const minecraftServerStatusWidget: WidgetDefinition = { + icon: IconBrandMinecraft, + name: "Minecraft Server Status", + description: "Displays the status of a Minecraft server.", + path: "../../widgets/minecraft-server-status", + configuration: { + items: [ + { + name: "Title", + description: "Title to show on top. Leave empty to show server address.", + values: { type: "string" }, + defaultValue: "-", + }, + { + name: "Server address", + description: "Public address of the Minecraft server", + values: { type: "string" }, + defaultValue: "hypixel.net", + }, + { + name: "Bedrock server", + description: "Wheter the server is a Bedrock server", + values: { type: "boolean" }, + defaultValue: "no", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/network-controller-status/img/wifi.png b/apps/docs/docs/widgets/network-controller-status/img/wifi.png new file mode 100644 index 000000000..6399ab842 Binary files /dev/null and b/apps/docs/docs/widgets/network-controller-status/img/wifi.png differ diff --git a/apps/docs/docs/widgets/network-controller-status/img/wired.png b/apps/docs/docs/widgets/network-controller-status/img/wired.png new file mode 100644 index 000000000..59f07c91a Binary files /dev/null and b/apps/docs/docs/widgets/network-controller-status/img/wired.png differ diff --git a/apps/docs/docs/widgets/network-controller-status/index.mdx b/apps/docs/docs/widgets/network-controller-status/index.mdx new file mode 100644 index 000000000..a01496234 --- /dev/null +++ b/apps/docs/docs/widgets/network-controller-status/index.mdx @@ -0,0 +1,44 @@ +--- +title: 'Network Status' +description: 'Display connected devices on a network' +hide_title: true +--- + +import { unifiControllerIntegration } from '@site/docs/integrations/unifi-controller'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; +import { networkControllerStatusWidget } from '.'; + + + + +Shows connected users and connected guest devices on wired or wireless networks. + +### Screenshots + +import wifiCard from './img/wifi.png'; +import wiredCard from './img/wired.png'; + +network-controller-status wifi +network-controller-status wired + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/network-controller-status/index.ts b/apps/docs/docs/widgets/network-controller-status/index.ts new file mode 100644 index 000000000..6b0dc41f5 --- /dev/null +++ b/apps/docs/docs/widgets/network-controller-status/index.ts @@ -0,0 +1,22 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconTopologyFull } from "@tabler/icons-react"; + +export const networkControllerStatusWidget: WidgetDefinition = { + icon: IconTopologyFull, + name: "Network Status", + description: "Display connected devices on a network", + path: "../../widgets/network-controller-status", + configuration: { + items: [ + { + name: "Widget Content", + description: "Select the type to display in the widget", + values: { + type: "select", + options: ["Wired", "Wi-Fi"], + }, + defaultValue: "Wi-Fi", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/network-controller-summary/img/summary.png b/apps/docs/docs/widgets/network-controller-summary/img/summary.png new file mode 100644 index 000000000..d280f684e Binary files /dev/null and b/apps/docs/docs/widgets/network-controller-summary/img/summary.png differ diff --git a/apps/docs/docs/widgets/network-controller-summary/index.mdx b/apps/docs/docs/widgets/network-controller-summary/index.mdx new file mode 100644 index 000000000..fe4cd3357 --- /dev/null +++ b/apps/docs/docs/widgets/network-controller-summary/index.mdx @@ -0,0 +1,39 @@ +--- +title: 'Network Controller Summary' +description: 'Displays the summary of a Network Controller' +hide_title: true +--- + +import { unifiControllerIntegration } from '@site/docs/integrations/unifi-controller'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; +import { networkControllerSummaryWidget } from '.'; + + + + +Shows information whether your WAN is connected, Wi-Fi is active and several other information. + +### Screenshots + +import summaryCard from './img/summary.png'; + +network-controller-summary + +### Supported Integrations + + + +### Adding the widget + + diff --git a/apps/docs/docs/widgets/network-controller-summary/index.ts b/apps/docs/docs/widgets/network-controller-summary/index.ts new file mode 100644 index 000000000..be10c3531 --- /dev/null +++ b/apps/docs/docs/widgets/network-controller-summary/index.ts @@ -0,0 +1,9 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconTopologyFull } from "@tabler/icons-react"; + +export const networkControllerSummaryWidget: WidgetDefinition = { + icon: IconTopologyFull, + name: "Network Controller Summary", + description: "Displays the summary of a Network Controller", + path: "../../widgets/network-controller-summary", +}; diff --git a/apps/docs/docs/widgets/notebook/img/edit.png b/apps/docs/docs/widgets/notebook/img/edit.png new file mode 100644 index 000000000..1a5ae7272 Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/edit.png differ diff --git a/apps/docs/docs/widgets/notebook/img/normal.png b/apps/docs/docs/widgets/notebook/img/normal.png new file mode 100644 index 000000000..ead662249 Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/normal.png differ diff --git a/apps/docs/docs/widgets/notebook/img/notebook-enter-editing.webp b/apps/docs/docs/widgets/notebook/img/notebook-enter-editing.webp new file mode 100644 index 000000000..48ebcd193 Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/notebook-enter-editing.webp differ diff --git a/apps/docs/docs/widgets/notebook/img/notebook-exit-editing.webp b/apps/docs/docs/widgets/notebook/img/notebook-exit-editing.webp new file mode 100644 index 000000000..850e3880a Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/notebook-exit-editing.webp differ diff --git a/apps/docs/docs/widgets/notebook/img/notebook-image-modal.webp b/apps/docs/docs/widgets/notebook/img/notebook-image-modal.webp new file mode 100644 index 000000000..0d9bab54d Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/notebook-image-modal.webp differ diff --git a/apps/docs/docs/widgets/notebook/img/notebook-link-modal.webp b/apps/docs/docs/widgets/notebook/img/notebook-link-modal.webp new file mode 100644 index 000000000..5cd3deb58 Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/notebook-link-modal.webp differ diff --git a/apps/docs/docs/widgets/notebook/img/notebook-table-modal.webp b/apps/docs/docs/widgets/notebook/img/notebook-table-modal.webp new file mode 100644 index 000000000..042f5edb1 Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/notebook-table-modal.webp differ diff --git a/apps/docs/docs/widgets/notebook/img/notebook-toolbar-lists.webp b/apps/docs/docs/widgets/notebook/img/notebook-toolbar-lists.webp new file mode 100644 index 000000000..9f3782aa2 Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/notebook-toolbar-lists.webp differ diff --git a/apps/docs/docs/widgets/notebook/img/notebook-toolbar-table.webp b/apps/docs/docs/widgets/notebook/img/notebook-toolbar-table.webp new file mode 100644 index 000000000..656fa80bb Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/notebook-toolbar-table.webp differ diff --git a/apps/docs/docs/widgets/notebook/img/notebook-toolbar.webp b/apps/docs/docs/widgets/notebook/img/notebook-toolbar.webp new file mode 100644 index 000000000..b85224ba0 Binary files /dev/null and b/apps/docs/docs/widgets/notebook/img/notebook-toolbar.webp differ diff --git a/apps/docs/docs/widgets/notebook/index.mdx b/apps/docs/docs/widgets/notebook/index.mdx new file mode 100644 index 000000000..5728e0113 --- /dev/null +++ b/apps/docs/docs/widgets/notebook/index.mdx @@ -0,0 +1,137 @@ +--- +title: 'Notebook' +description: 'A simple notebook widget that supports markdown.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { notebookWidget } from '.'; + + + + +The notebook widget focuses on usability and is designed to be as simple as possible to bring a familiar editing experience to regular users. +It is based on Tiptap.dev and supports most of its features. + +### Screenshots + +import editOff from './img/normal.png'; +import editOn from './img/edit.png'; + +
+ notebook edit-off + notebook edit-on +
+ +### Adding the widget + + + +### Configuration + + +### Editing +When the permissions of the user allows it, you can enter the editing of the text by clicking the following button in the top right. + +![](./img/notebook-enter-editing.webp) + + +You can then decide to save your changes or cancel them to exit editing, using the buttons placed in the same location. + +![](./img/notebook-exit-editing.webp) + +### Notebook toolbar functions +The notebook offers a variaty of functions to edit the text and more. + +![](./img/notebook-toolbar.webp) + +#### Common text formatting +| Function | Description | +| ---------------------- | ------------------------------------------------------------------- | +| Bold | Makes the selected text bold | +| Italic | Tilts the selected text | +| Strikethrough | Puts a bar through the selected text | +| Color text | Changes the color of the text | +| Colored highlight text | Highlights the text with a chosen color | +| Code | Elevates the text to a box | +| Clear formatting | Erases any of the preceding function's effects on the selected text | + +#### Heading +Choose a heading size for the line, making the text bigger. Working like titles and sub-titles. + +#### Text Alignement +Select the alignement on the line. Left, center or right. + +#### Misc functions +##### Blockquote +Puts the current line in a quoting block. + +##### Horizontal line +Adds a line that goes from the far right to the far left as a separator. + +#### Lists +##### Bullet lists +Simple list with a dot preceding each element. + +##### Ordered lists +List with numbers preceding each element. + +##### Check lists +List with a checkbox on each element. + +##### Indentation changes +![](./img/notebook-toolbar-lists.webp) + +When you are currently in a list of any sort, the last 2 buttons will appear and will allow you to change the indentation of the current list item. + +#### Insert functions +##### Link controls +The first buttons is to insert a link, or edit an existing link. The link will be applied on the selected text. + +Pasting a link directly into the text will automatically put the link anchor on it too. + +The second button will remove the link while leaving the text intact. + +![](./img/notebook-link-modal.webp) + +This is the modal for the link, The little button in the textbox can be clicked to make the link open in a new tab. + +##### Image controls +![](./img/notebook-image-modal.webp) + +##### Source +You can use a normal link to an image or you can also use locally stored images. + +##### Width +The aspect ratio will always be respected, so only the width field is necessary. +You can provide a value in a plain number or you can also use percents to have your image size dynamically change on different screens. + +#### Table +This last control allows you to add a table, for which you can determine the number of columns and row before inserting it. + +![](./img/notebook-table-modal.webp) + +Clicking that button while in a table will delete it. + +##### Table controls +![](./img/notebook-toolbar-table.webp) + +While in a table, further controls will appear to help edit the table. + +The first one will color the background of the selected cells. + +The second will merge selected cells. + +All the following ones are for editing the wize of the table: + +- Add column on the right +- Add column on the left +- Delete Column +- Add row on top +- Add row below +- Delete Row \ No newline at end of file diff --git a/apps/docs/docs/widgets/notebook/index.ts b/apps/docs/docs/widgets/notebook/index.ts new file mode 100644 index 000000000..f477281e1 --- /dev/null +++ b/apps/docs/docs/widgets/notebook/index.ts @@ -0,0 +1,25 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconNotes } from "@tabler/icons-react"; + +export const notebookWidget: WidgetDefinition = { + icon: IconNotes, + name: "Notebook", + description: "A simple notebook widget that supports markdown.", + path: "../../widgets/notebook", + configuration: { + items: [ + { + name: "Show the toolbar to help you write markdown", + description: "Upon editing, enables a toolbar at the top with document editing functions.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Allow check in read only mode", + description: "Allows the ability to check the boxes from checklists outside of editing", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/notifications/img/notifications.png b/apps/docs/docs/widgets/notifications/img/notifications.png new file mode 100644 index 000000000..11809be55 Binary files /dev/null and b/apps/docs/docs/widgets/notifications/img/notifications.png differ diff --git a/apps/docs/docs/widgets/notifications/index.mdx b/apps/docs/docs/widgets/notifications/index.mdx new file mode 100644 index 000000000..e6f927b8a --- /dev/null +++ b/apps/docs/docs/widgets/notifications/index.mdx @@ -0,0 +1,42 @@ +--- +title: 'Notifications' +description: 'Display notification history from an integration' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { notificationsWidget } from '.'; +import { ntfyIntegration } from '@site/docs/integrations/ntfy'; +import { nextcloudIntegration } from '@site/docs/integrations/nextcloud' + + + +The notifications widget allows you to display notifications from various integrations in a unified view. + +### Screenshots + +import notificationsScreenshot from './img/notifications.png'; + +notifications + +### Supported Integrations + + + +### Adding the widget + + diff --git a/apps/docs/docs/widgets/notifications/index.ts b/apps/docs/docs/widgets/notifications/index.ts new file mode 100644 index 000000000..e1cce49ce --- /dev/null +++ b/apps/docs/docs/widgets/notifications/index.ts @@ -0,0 +1,12 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconMessage } from "@tabler/icons-react"; + +export const notificationsWidget: WidgetDefinition = { + icon: IconMessage, + name: "Notifications", + description: "Display notification history from an integration", + path: "../../widgets/notifications", + configuration: { + items: [], + }, +}; diff --git a/apps/docs/docs/widgets/paperless-ngx/index.mdx b/apps/docs/docs/widgets/paperless-ngx/index.mdx new file mode 100644 index 000000000..3dd684efd --- /dev/null +++ b/apps/docs/docs/widgets/paperless-ngx/index.mdx @@ -0,0 +1,34 @@ +--- +title: 'Paperless-ngx' +description: 'Displays document management statistics including inbox ratio, document counts, and metadata.' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { paperlessNgxWidget } from '.'; +import { paperlessNgxIntegration } from '@site/docs/integrations/paperless-ngx'; + + + + +This widget displays statistics from your Paperless-ngx instance, including an inbox ratio ring showing how many documents are in your inbox versus total, along with counts for correspondents, tags, and document types. + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/paperless-ngx/index.ts b/apps/docs/docs/widgets/paperless-ngx/index.ts new file mode 100644 index 000000000..4b5957684 --- /dev/null +++ b/apps/docs/docs/widgets/paperless-ngx/index.ts @@ -0,0 +1,55 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconFileText } from "@tabler/icons-react"; + +export const paperlessNgxWidget: WidgetDefinition = { + icon: IconFileText, + name: "Paperless-ngx", + description: "Displays document management statistics including inbox ratio, document counts, and metadata.", + path: "../../widgets/paperless-ngx", + configuration: { + items: [ + { + name: "Show inbox ratio", + description: "Displays the inbox-to-total documents ratio as a hero section", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show inbox ring", + description: "Displays a ring progress indicator for the inbox ratio", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show documents total", + description: "Displays the total number of documents", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show documents inbox", + description: "Displays the number of documents in the inbox", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show correspondents", + description: "Displays the number of correspondents", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show tags", + description: "Displays the number of tags", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show document types", + description: "Displays the number of document types", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/releases/img/collapsible.png b/apps/docs/docs/widgets/releases/img/collapsible.png new file mode 100644 index 000000000..f3a7e7a85 Binary files /dev/null and b/apps/docs/docs/widgets/releases/img/collapsible.png differ diff --git a/apps/docs/docs/widgets/releases/img/full.png b/apps/docs/docs/widgets/releases/img/full.png new file mode 100644 index 000000000..33d4c7b4b Binary files /dev/null and b/apps/docs/docs/widgets/releases/img/full.png differ diff --git a/apps/docs/docs/widgets/releases/img/no-details.png b/apps/docs/docs/widgets/releases/img/no-details.png new file mode 100644 index 000000000..cfa80a09d Binary files /dev/null and b/apps/docs/docs/widgets/releases/img/no-details.png differ diff --git a/apps/docs/docs/widgets/releases/index.mdx b/apps/docs/docs/widgets/releases/index.mdx new file mode 100644 index 000000000..7808756f0 --- /dev/null +++ b/apps/docs/docs/widgets/releases/index.mdx @@ -0,0 +1,77 @@ +--- +title: 'Releases' +description: 'Displays a list of the current version of the given repositories with the given version regex.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { releasesWidget } from '.'; +import { githubIntegration } from '@site/docs/integrations/github'; +import { gitlabIntegration } from '@site/docs/integrations/gitlab'; +import { dockerHubIntegration } from '@site/docs/integrations/docker-hub'; +import { npmIntegration } from '@site/docs/integrations/npm'; +import { codebergIntegration } from '@site/docs/integrations/codeberg'; + + + +The releases widget enables you to track a list of repositories and see their respective latest release. +It also supports importing releases from your local docker containers. + +### Screenshots + +import collapsibleCard from './img/collapsible.png'; +import fullCard from './img/full.png'; +import noDetailsCard from './img/no-details.png'; +import { quayIntegration } from '@site/docs/integrations/quay'; +import { gitHubContainerRegistryIntegration } from '@site/docs/integrations/github-containerregistry'; +import { linuxServerIoIntegration } from '@site/docs/integrations/linux-server-io'; + +
+ releases full + releases collapsible + releases no details +
+ +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + + +:::note + +The version filter is used to match the version tag of the release. It is a combination of the prefix, precision and suffix. + +Setting the Prefix to `v`, precision to `2` and the Suffix to `-alpha`, will match `v1.0-alpha` but not `v1.0-beta`. +Setting the Prefix to `v`, precision to `3`, will match `v5.2.0` but not `v1.0.2-alpha` or `Beta v5.2.1`. + +::: + diff --git a/apps/docs/docs/widgets/releases/index.ts b/apps/docs/docs/widgets/releases/index.ts new file mode 100644 index 000000000..dbe3c1271 --- /dev/null +++ b/apps/docs/docs/widgets/releases/index.ts @@ -0,0 +1,120 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconRocket } from "@tabler/icons-react"; + +export const releasesWidget: WidgetDefinition = { + icon: IconRocket, + name: "Releases", + description: "Displays a list of the current version of the given repositories with the given version regex.", + path: "../../widgets/releases", + configuration: { + items: [ + { + name: "New Release Within", + description: "The time period in which a new release is marked as new.", + values: "Any timespan in format '12h', '3d', '2w', '6M', '1y'.", + defaultValue: "1w", + }, + { + name: "Stale Release Within", + description: "The time period in which a release is marked as stale.", + values: "Any timespan in format '12h', '3d', '2w', '6M', '1y'.", + defaultValue: "6M", + }, + { + name: "Show Only Highlighted", + description: "Show only new or stale releases. As per the above.", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Show Details", + description: "Show the row below the repository with stats about the repository.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show only icon", + description: "Hides the repository name or identifier", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Top Releases", + description: "The max number of latest releases to show. Zero means no limit.", + values: "Any positive integer or zero to disable the limit.", + defaultValue: "0", + }, + { + name: "Repositories", + description: "The repositories to show releases for.", + values: { + name: "Repositories", + type: "array", + configuration: { + items: [ + { + name: "Provider", + description: "Integration to fetch the repository from.", + values: "Select from the available integrations.", + defaultValue: "-", + }, + { + name: "Identifier", + description: 'The identifier of the repository, e.g. "homarr-labs/homarr".', + values: "Any valid repository identifier.", + defaultValue: "-", + }, + { + name: "Name", + description: "Display name of the repository.", + values: { type: "string" }, + defaultValue: "-", + }, + { + name: "Icon URL", + description: "URL to the icon of the repository.", + values: { type: "string" }, + defaultValue: "-", + }, + { + name: "Version Regex", + description: "The regex to extract the version from the release tag.", + values: { + name: "Version Regex", + type: "object", + configuration: { + items: [ + { + name: "Prefix", + description: "The prefix to match before the version.", + values: { type: "string" }, + defaultValue: "", + }, + { + name: "Precision", + description: "The precision of the version", + values: { + type: "select", + options: ["None", "#", "#.#", "#.#.#", "#.#.#.#", "#.#.#.#.#"], + }, + defaultValue: "None", + }, + { + name: "Suffix", + description: "The suffix to match after the version.", + values: { type: "string" }, + defaultValue: "", + }, + ], + }, + }, + defaultValue: "None", + }, + ], + }, + }, + defaultValue: "None", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/rss-feed/img/screenshot.png b/apps/docs/docs/widgets/rss-feed/img/screenshot.png new file mode 100644 index 000000000..1996420f7 Binary files /dev/null and b/apps/docs/docs/widgets/rss-feed/img/screenshot.png differ diff --git a/apps/docs/docs/widgets/rss-feed/index.mdx b/apps/docs/docs/widgets/rss-feed/index.mdx new file mode 100644 index 000000000..68bbb1071 --- /dev/null +++ b/apps/docs/docs/widgets/rss-feed/index.mdx @@ -0,0 +1,48 @@ +--- +title: 'RSS Feed' +description: 'Monitor and display one or more generic RSS, ATOM or JSON feeds.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { rssFeedWidget } from '.'; + + + + +Using the RSS standard, you can integrate most News websites, applications and more on your dashboard. + +### Screenshots + +import screenshot from './img/screenshot.png'; + +rss-feed noted-lol + +### Adding the widget + + + +### Configuration + + +### Examples +Here's a small collection of examples, that you can use for testing or actual use (in no particular order): +- https://noted.lol/rss/ +- https://blog.google/products/chrome/rss/ +- https://www.w3.org/blog/feed/ +- https://partner-feeds.beta.20min.ch/rss/20minuten +- http://rss.cnn.com/rss/money_topstories.rss +- https://www.wired.com/rss/ +- http://www.chinadaily.com.cn/rss/world_rss.xml +- https://www.srf.ch/news/bnf/rss/1646 +- https://torrentfreak.com/feed/ +- http://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml +- http://feeds.foxnews.com/foxnews/latest + +There is a good list of feeds here: +https://github.com/greysonp/rss-feeds/blob/master/feeds.json \ No newline at end of file diff --git a/apps/docs/docs/widgets/rss-feed/index.tsx b/apps/docs/docs/widgets/rss-feed/index.tsx new file mode 100644 index 000000000..3c2026337 --- /dev/null +++ b/apps/docs/docs/widgets/rss-feed/index.tsx @@ -0,0 +1,65 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconRss } from "@tabler/icons-react"; + +export const rssFeedWidget: WidgetDefinition = { + icon: IconRss, + name: "RSS Feed", + description: "Monitor and display one or more generic RSS, ATOM or JSON feeds.", + path: "../../widgets/rss-feed", + configuration: { + items: [ + { + name: "Feed URLs", + description: ( + + A list of RSS feed URLs. They must conform to one of the following standards{" "} + + RSS + + ,{" "} + + ATOM + {" "} + or{" "} + + JSON Feed + + . + + ), + defaultValue: "Empty list", + values: "List of URLs", + }, + { + name: "Enable RTL", + description: "Enable right-to-left layout for feeds in such languages", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Description line clamp", + description: "Maximum number of lines to show for the feed description", + values: "1-50", + defaultValue: "5", + }, + { + name: "Amount posts limit", + description: "Maximum number of posts to show", + values: "1-9999", + defaultValue: "100", + }, + { + name: "Hide description", + description: "Hide the description of individual feeds", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Show poster image", + description: "Show the poster image beside the content", + values: { type: "boolean" }, + defaultValue: "no", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/smart-home-entity-state/img/light-switch.png b/apps/docs/docs/widgets/smart-home-entity-state/img/light-switch.png new file mode 100644 index 000000000..03c2c8d58 Binary files /dev/null and b/apps/docs/docs/widgets/smart-home-entity-state/img/light-switch.png differ diff --git a/apps/docs/docs/widgets/smart-home-entity-state/img/retrieve-entity-id.png b/apps/docs/docs/widgets/smart-home-entity-state/img/retrieve-entity-id.png new file mode 100644 index 000000000..e8471744c Binary files /dev/null and b/apps/docs/docs/widgets/smart-home-entity-state/img/retrieve-entity-id.png differ diff --git a/apps/docs/docs/widgets/smart-home-entity-state/img/sun.png b/apps/docs/docs/widgets/smart-home-entity-state/img/sun.png new file mode 100644 index 000000000..38d79e53f Binary files /dev/null and b/apps/docs/docs/widgets/smart-home-entity-state/img/sun.png differ diff --git a/apps/docs/docs/widgets/smart-home-entity-state/img/temperature.png b/apps/docs/docs/widgets/smart-home-entity-state/img/temperature.png new file mode 100644 index 000000000..3bd28e58b Binary files /dev/null and b/apps/docs/docs/widgets/smart-home-entity-state/img/temperature.png differ diff --git a/apps/docs/docs/widgets/smart-home-entity-state/index.mdx b/apps/docs/docs/widgets/smart-home-entity-state/index.mdx new file mode 100644 index 000000000..d101d6376 --- /dev/null +++ b/apps/docs/docs/widgets/smart-home-entity-state/index.mdx @@ -0,0 +1,67 @@ +--- +title: 'Entity State' +description: 'Display the state of an entity and toggle it optionally' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { smartHomeEntityStateWidget } from '.'; +import { homeAssistantIntegration } from '@site/docs/integrations/home-assistant'; + + + + +The entity state enables you to display the current state of an entity. +This works with most entities and enables you display almost any data. +It is recommended that you transform data on the integration as much as possible since Homarr's capabilities in transformation are very limited. + +### Screenshots + +import sun from './img/sun.png'; +import lightSwitch from './img/light-switch.png'; +import temperature from './img/temperature.png'; + +smart-home-entity-state sun +smart-home-entity-state light-switch +smart-home-entity-state temperature + +### Supported Integrations + + + +### Interactions + +- Toggle entity state by clicking on the entity (only when clickable enabled). + +### Adding the widget + + + +### Configuration + + +### How to find the entity ID + +To find the entity ID in Home Assistant, follow these steps: +1. Open Home Assistant and go to the **Developer Tools** section (usually found in the sidebar). +2. Click on the **States** tab. +3. In the list of entities, find the entity you want to use. +4. The entity ID will be displayed in the format `domain.object_id` (e.g., `light.living_room_light`). +5. Copy the entity ID and paste it into the widget configuration in Homarr. It will then show the State that is visible in Home Assistant. + +import retrieveEntityId from './img/retrieve-entity-id.png'; + +
+ homeassistant retrieve-entity-id +
\ No newline at end of file diff --git a/apps/docs/docs/widgets/smart-home-entity-state/index.ts b/apps/docs/docs/widgets/smart-home-entity-state/index.ts new file mode 100644 index 000000000..1e6f7af53 --- /dev/null +++ b/apps/docs/docs/widgets/smart-home-entity-state/index.ts @@ -0,0 +1,38 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBinaryTree } from "@tabler/icons-react"; + +export const smartHomeEntityStateWidget: WidgetDefinition = { + icon: IconBinaryTree, + name: "Entity State", + description: "Display the state of an entity and toggle it optionally", + path: "../../widgets/smart-home-entity-state", + configuration: { + items: [ + { + name: "Entity ID", + description: + "The ID of the entity to display. This can be any entity that is available in your smart home integration.", + values: { type: "string" }, + defaultValue: "sun.sun", + }, + { + name: "Display Name", + description: "Display name for the entity, if not set the entity ID will be used.", + values: { type: "string" }, + defaultValue: "Sun", + }, + { + name: "Entity unit", + description: "Optional unit for the entity (will be displayed after the value).", + values: { type: "string" }, + defaultValue: "", + }, + { + name: "Clickable", + description: "If enabled, the entity will be clickable and will toggle the state of the entity.", + values: { type: "boolean" }, + defaultValue: "no", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/smart-home-execute-automation/img/empty.png b/apps/docs/docs/widgets/smart-home-execute-automation/img/empty.png new file mode 100644 index 000000000..4bf6c559a Binary files /dev/null and b/apps/docs/docs/widgets/smart-home-execute-automation/img/empty.png differ diff --git a/apps/docs/docs/widgets/smart-home-execute-automation/img/with-displayname.png b/apps/docs/docs/widgets/smart-home-execute-automation/img/with-displayname.png new file mode 100644 index 000000000..8b32c6bcf Binary files /dev/null and b/apps/docs/docs/widgets/smart-home-execute-automation/img/with-displayname.png differ diff --git a/apps/docs/docs/widgets/smart-home-execute-automation/index.mdx b/apps/docs/docs/widgets/smart-home-execute-automation/index.mdx new file mode 100644 index 000000000..522c113ca --- /dev/null +++ b/apps/docs/docs/widgets/smart-home-execute-automation/index.mdx @@ -0,0 +1,50 @@ +--- +title: 'Execute Automation' +description: 'Trigger an automation with one click' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { IconAd } from "@tabler/icons-react"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { smartHomeExecuteAutomationWidget } from '.'; +import { homeAssistantIntegration } from '@site/docs/integrations/home-assistant'; + + + + +The execute automation widget allows you to trigger an automation with one click. + +### Screenshots + +import empty from './img/empty.png'; +import withDisplayname from './img/with-displayname.png'; + +
+ smart-home-execute-automation empty + smart-home-execute-automation with-displayname +
+ +### Supported Integrations + + + +### Interactions + +- Trigger the automation by clicking on the widget. + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/smart-home-execute-automation/index.ts b/apps/docs/docs/widgets/smart-home-execute-automation/index.ts new file mode 100644 index 000000000..92b6534aa --- /dev/null +++ b/apps/docs/docs/widgets/smart-home-execute-automation/index.ts @@ -0,0 +1,25 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBinaryTree } from "@tabler/icons-react"; + +export const smartHomeExecuteAutomationWidget: WidgetDefinition = { + icon: IconBinaryTree, + name: "Execute Automation", + description: "Trigger an automation with one click", + path: "../../widgets/smart-home-execute-automation", + configuration: { + items: [ + { + name: "Display name", + description: "Title that will be displayed on the widget.", + values: { type: "string" }, + defaultValue: "-", + }, + { + name: "Automation ID", + description: "The ID of the automation to execute.", + values: { type: "string" }, + defaultValue: "", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/speedtest-tracker/img/screenshot.png b/apps/docs/docs/widgets/speedtest-tracker/img/screenshot.png new file mode 100644 index 000000000..2d2eacd35 Binary files /dev/null and b/apps/docs/docs/widgets/speedtest-tracker/img/screenshot.png differ diff --git a/apps/docs/docs/widgets/speedtest-tracker/index.mdx b/apps/docs/docs/widgets/speedtest-tracker/index.mdx new file mode 100644 index 000000000..94be18dd7 --- /dev/null +++ b/apps/docs/docs/widgets/speedtest-tracker/index.mdx @@ -0,0 +1,39 @@ +--- +title: 'Speedtest Tracker' +description: 'Displays speed test results from your Speedtest Tracker instance.' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { speedtestTrackerWidget } from '.'; +import { speedtestTrackerIntegration } from '@site/docs/integrations/speedtest-tracker'; + + + +This widget displays internet speed test results from your [Speedtest Tracker](https://docs.speedtest-tracker.dev/) instance, +including the latest result, historical averages, and a live chart of the last 12 hours. + +### Screenshots + +import screenshot from './img/screenshot.png'; + +speedtest-tracker image + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/speedtest-tracker/index.ts b/apps/docs/docs/widgets/speedtest-tracker/index.ts new file mode 100644 index 000000000..7b2c46cc8 --- /dev/null +++ b/apps/docs/docs/widgets/speedtest-tracker/index.ts @@ -0,0 +1,38 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconSpeedboat } from "@tabler/icons-react"; + +export const speedtestTrackerWidget: WidgetDefinition = { + icon: IconSpeedboat, + name: "Speedtest Tracker", + description: "Displays speed test results from your Speedtest Tracker instance.", + path: "../../widgets/speedtest-tracker", + configuration: { + items: [ + { + name: "Show latest result", + description: + "Displays the most recent speed test result, including download speed, upload speed, ping, and health status.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show averages", + description: "Displays average download speed, upload speed, and ping across all recorded tests.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show recent results", + description: "Displays an area chart of the last 12 hours of speed test results.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show ping results", + description: "Displays a chart of ping results. Only shown if 'Show recent results' is disabled.", + values: { type: "boolean" }, + defaultValue: "no", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/stock-price/img/apple.png b/apps/docs/docs/widgets/stock-price/img/apple.png new file mode 100644 index 000000000..4468c9e2d Binary files /dev/null and b/apps/docs/docs/widgets/stock-price/img/apple.png differ diff --git a/apps/docs/docs/widgets/stock-price/img/ethereum.png b/apps/docs/docs/widgets/stock-price/img/ethereum.png new file mode 100644 index 000000000..7a81715b7 Binary files /dev/null and b/apps/docs/docs/widgets/stock-price/img/ethereum.png differ diff --git a/apps/docs/docs/widgets/stock-price/img/google.png b/apps/docs/docs/widgets/stock-price/img/google.png new file mode 100644 index 000000000..b3e2a2ff2 Binary files /dev/null and b/apps/docs/docs/widgets/stock-price/img/google.png differ diff --git a/apps/docs/docs/widgets/stock-price/img/nvidia.png b/apps/docs/docs/widgets/stock-price/img/nvidia.png new file mode 100644 index 000000000..3b2c7b79a Binary files /dev/null and b/apps/docs/docs/widgets/stock-price/img/nvidia.png differ diff --git a/apps/docs/docs/widgets/stock-price/index.mdx b/apps/docs/docs/widgets/stock-price/index.mdx new file mode 100644 index 000000000..5d9a24c64 --- /dev/null +++ b/apps/docs/docs/widgets/stock-price/index.mdx @@ -0,0 +1,62 @@ +--- +title: 'Stock Price' +description: 'Displays the current stock price of a company.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { stockPriceWidget } from '.'; + + + + +Using the Stocks widget, you can show the current stock prices of your favorite companies on your dashboard. + +### Screenshots + +import apple from './img/apple.png'; +import google from './img/google.png'; +import ethereum from './img/ethereum.png'; +import nvidia from './img/nvidia.png'; + +
+
+
+ stock-price apple + stock-price google +
+ stock-price ethereum +
+ stock-price nvidia +
+ + +### Adding the widget + + + +### Configuration + + +### Examples +Here's a small collection of examples, that you can use for testing or actual use (in no particular order): +- AAPL +- GOOGL +- AMZN +- TSLA +- MSFT +- META +- NVDA +- NFLX +- BTC-USD +- ETH-USD + +### Data source + +We use the Yahoo Finance API to fetch the stock prices. +If you need to whitelist the api, please use the following URL: `https://query1.finance.yahoo.com` \ No newline at end of file diff --git a/apps/docs/docs/widgets/stock-price/index.tsx b/apps/docs/docs/widgets/stock-price/index.tsx new file mode 100644 index 000000000..052560da1 --- /dev/null +++ b/apps/docs/docs/widgets/stock-price/index.tsx @@ -0,0 +1,49 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBuildingBank } from "@tabler/icons-react"; + +export const stockPriceWidget: WidgetDefinition = { + icon: IconBuildingBank, + name: "Stock Price", + description: "Displays the current stock price of a company.", + path: "../../widgets/stock-price", + configuration: { + items: [ + { + name: "Stock symbol", + description: "The stock symbol of the company you want to track", + defaultValue: "AAPL", + values: "List of URLs", + }, + { + name: "Time Range", + description: "Time range of the diagram", + values: { + type: "select", + options: [ + "1 Day", + "5 Day", + "1 Month", + "3 Months", + "6 Months", + "Year to Date", + "1 Year", + "2 Years", + "5 Years", + "10 Years", + "Max", + ], + }, + defaultValue: "1 Month", + }, + { + name: "Time Interval", + description: "Interval between data points", + values: { + type: "select", + options: ["5 Minutes", "15 Minutes", "30 Minutes", "1 Hour", "1 Day", "5 Days", "1 Week", "1 Month"], + }, + defaultValue: "1 Day", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/system-resources/img/cpu-and-memory.png b/apps/docs/docs/widgets/system-resources/img/cpu-and-memory.png new file mode 100644 index 000000000..18911befc Binary files /dev/null and b/apps/docs/docs/widgets/system-resources/img/cpu-and-memory.png differ diff --git a/apps/docs/docs/widgets/system-resources/img/cpu.png b/apps/docs/docs/widgets/system-resources/img/cpu.png new file mode 100644 index 000000000..05e20574d Binary files /dev/null and b/apps/docs/docs/widgets/system-resources/img/cpu.png differ diff --git a/apps/docs/docs/widgets/system-resources/img/memory.png b/apps/docs/docs/widgets/system-resources/img/memory.png new file mode 100644 index 000000000..424ac7b77 Binary files /dev/null and b/apps/docs/docs/widgets/system-resources/img/memory.png differ diff --git a/apps/docs/docs/widgets/system-resources/img/network.png b/apps/docs/docs/widgets/system-resources/img/network.png new file mode 100644 index 000000000..3b50ce210 Binary files /dev/null and b/apps/docs/docs/widgets/system-resources/img/network.png differ diff --git a/apps/docs/docs/widgets/system-resources/index.mdx b/apps/docs/docs/widgets/system-resources/index.mdx new file mode 100644 index 000000000..143e2a9cf --- /dev/null +++ b/apps/docs/docs/widgets/system-resources/index.mdx @@ -0,0 +1,62 @@ +--- +title: 'System Resources' +description: 'Displays CPU, RAM and network of your host in real time' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { systemResourcesWidget } from '.'; +import { dashDotIntegration } from '@site/docs/integrations/dash-dot'; +import { glancesIntegration } from '@site/docs/integrations/glances'; +import { openMediaVaultIntegration } from '@site/docs/integrations/open-media-vault'; +import { proxmoxIntegration } from '@site/docs/integrations/proxmox'; + + + + +Displays CPU, RAM and network of your host in real time + +### Screenshots + +import network from './img/network.png'; +import cpu from './img/cpu.png'; +import memory from './img/memory.png'; +import cpuAndMemory from './img/cpu-and-memory.png'; +import { truenasIntegration } from '@site/docs/integrations/truenas'; + +
+
+ system-resources-widget network-only icon-label +
+ system-resources-widget cpu-only no-label item-title + system-resources-widget memory-only text-label +
+
+ system-resources-widget cpu-and-memory icon-text-label +
+ +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + + \ No newline at end of file diff --git a/apps/docs/docs/widgets/system-resources/index.ts b/apps/docs/docs/widgets/system-resources/index.ts new file mode 100644 index 000000000..ce1e213b4 --- /dev/null +++ b/apps/docs/docs/widgets/system-resources/index.ts @@ -0,0 +1,39 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconGraph } from "@tabler/icons-react"; + +export const systemResourcesWidget: WidgetDefinition = { + icon: IconGraph, + name: "System Resources", + description: "Displays CPU, RAM and network of your host", + path: "../../widgets/system-resources", + configuration: { + items: [ + { + name: "Visible charts", + description: "Select the charts you want to be visible.", + values: { + type: "select", + options: ["CPU", "Memory", "Network"], + }, + defaultValue: "CPU, Memory, Network", + }, + { + name: "Label display mode", + description: "Select how the graphs should be labeled", + values: { + type: "select", + options: ["Show text with icon", "Show only text", "Show only icon", "Hide label"], + }, + defaultValue: "Show text with icon", + }, + { + name: "Enable chart shading", + description: "Not only show a line, but also fill the area below", + values: { + type: "boolean", + }, + defaultValue: "Yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/timetable/img/street-departures.png b/apps/docs/docs/widgets/timetable/img/street-departures.png new file mode 100644 index 000000000..aef6091ad Binary files /dev/null and b/apps/docs/docs/widgets/timetable/img/street-departures.png differ diff --git a/apps/docs/docs/widgets/timetable/img/train-departures.png b/apps/docs/docs/widgets/timetable/img/train-departures.png new file mode 100644 index 000000000..3a0f772d8 Binary files /dev/null and b/apps/docs/docs/widgets/timetable/img/train-departures.png differ diff --git a/apps/docs/docs/widgets/timetable/index.mdx b/apps/docs/docs/widgets/timetable/index.mdx new file mode 100644 index 000000000..fe9a1b11c --- /dev/null +++ b/apps/docs/docs/widgets/timetable/index.mdx @@ -0,0 +1,44 @@ +--- +title: 'Timetable' +description: 'Displays departure times for a station.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { timetableWidget } from '.'; +import { searchChIntegration } from '@site/docs/integrations/search-ch'; + + + + +The Timetable widget provides real-time departure times for a selected station. + +### Screenshots + +import trainDepartures from './img/train-departures.png'; +import streetDepartures from './img/street-departures.png'; + +
+ timetable-widget-train-departures + timetable-widget-bus-and-tram-departures +
+ +### Adding the widget + + + +### Supported Integrations + + + +### Configuration + diff --git a/apps/docs/docs/widgets/timetable/index.ts b/apps/docs/docs/widgets/timetable/index.ts new file mode 100644 index 000000000..6f36349ee --- /dev/null +++ b/apps/docs/docs/widgets/timetable/index.ts @@ -0,0 +1,19 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBusStop } from "@tabler/icons-react"; + +export const timetableWidget: WidgetDefinition = { + icon: IconBusStop, + name: "Timetable", + description: "Displays departure times for a station.", + path: "../../widgets/timetable", + configuration: { + items: [ + { + name: "Station", + description: "Select the station", + values: "List of station names", + defaultValue: "-", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/tracearr/img/streams-and-stats.png b/apps/docs/docs/widgets/tracearr/img/streams-and-stats.png new file mode 100644 index 000000000..2c9ebeef4 Binary files /dev/null and b/apps/docs/docs/widgets/tracearr/img/streams-and-stats.png differ diff --git a/apps/docs/docs/widgets/tracearr/img/widget-overview.png b/apps/docs/docs/widgets/tracearr/img/widget-overview.png new file mode 100644 index 000000000..5aaef9ec8 Binary files /dev/null and b/apps/docs/docs/widgets/tracearr/img/widget-overview.png differ diff --git a/apps/docs/docs/widgets/tracearr/index.mdx b/apps/docs/docs/widgets/tracearr/index.mdx new file mode 100644 index 000000000..a579d8af3 --- /dev/null +++ b/apps/docs/docs/widgets/tracearr/index.mdx @@ -0,0 +1,52 @@ +--- +title: 'Tracearr' +description: 'Monitor media server streams, user activity, and policy violations.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { tracearrWidget } from '.'; +import { tracearrIntegration } from '@site/docs/integrations/tracearr'; + + + + +The Tracearr widget provides a real-time monitoring dashboard for your media server activity. It displays active streams, user statistics, recent watching history, and policy violations. + +### Sections + +| Section | Description | +|---|---| +| **Stats Bar** | Displays Active Streams, Total Users, Transcode Count, and Total Bandwidth at a glance. | +| **Active Streams** | Shows currently playing media with poster art, user info, progress bar, resolution, and transcoding status (Direct Play or Transcode). | +| **Recent Activity** | A paginated list of watching history with user avatars and watched status. | +| **Violations** | Alerts for policy violations (e.g., concurrent stream limits) with severity levels. | + +### Screenshots + +import widgetOverview from './img/widget-overview.png'; +import streamsAndStats from './img/streams-and-stats.png'; + +
+ tracearr-widget-overview + tracearr-streams-and-stats +
+ +### Adding the widget + + + +### Supported Integrations + + + +### Configuration + diff --git a/apps/docs/docs/widgets/tracearr/index.ts b/apps/docs/docs/widgets/tracearr/index.ts new file mode 100644 index 000000000..3804b852e --- /dev/null +++ b/apps/docs/docs/widgets/tracearr/index.ts @@ -0,0 +1,37 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconActivity } from "@tabler/icons-react"; + +export const tracearrWidget: WidgetDefinition = { + icon: IconActivity, + name: "Tracearr", + description: "Monitor media server streams, user activity, and policy violations.", + path: "../../widgets/tracearr", + configuration: { + items: [ + { + name: "Show Streams", + description: "Display the active streams section.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show Stats", + description: "Display the stats bar with active streams, total users, transcode count, and bandwidth.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show Recent Activity", + description: "Display the recent activity list with user watch history.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show Violations", + description: "Display the violations alerts for policy breaches.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/umami/index.mdx b/apps/docs/docs/widgets/umami/index.mdx new file mode 100644 index 000000000..53ef7ee4e --- /dev/null +++ b/apps/docs/docs/widgets/umami/index.mdx @@ -0,0 +1,49 @@ +--- +title: 'Umami Analytics' +description: 'Display visitor stats from your Umami analytics instance' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { umamiWidget } from '.'; +import { umamiIntegration } from '@site/docs/integrations/umami'; + + + +The Umami Analytics widget displays key visitor metrics from a website tracked by your [Umami](https://umami.is) instance — pageviews, unique visitors, visits, bounce rate, avg. visit duration, and real-time active visitor count. The widget body can be switched between a visitor/event chart, a multi-event chart, and ranked top pages or referrers lists. + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + + + +### View modes + +| View | Description | +|---|---| +| **Chart** | Bar chart or sparkline of unique visitors over the selected time frame. Optionally overlay a single named event as a second series. | +| **Events chart** | Multi-select one or more named events and chart each as its own colored series — no visitor baseline. Supports bar and sparkline. | +| **Top pages** | Ranked list of URLs by pageview count for the selected time frame. | +| **Top referrers** | Ranked list of referrer sources by session count. Direct traffic (no referrer) is labeled "Direct". | + +### Notes + +- The **Website** selector is populated automatically from the websites tracked by the connected Umami integration. No manual ID entry is required. +- **Event names** for the Event and Events selectors are fetched from Umami's metrics API based on the past 30 days of activity. +- Active visitor count refreshes every 30 seconds independently of the main data cache. +- All other data is cached for 5 minutes and refreshed in the background by a cron job. diff --git a/apps/docs/docs/widgets/umami/index.ts b/apps/docs/docs/widgets/umami/index.ts new file mode 100644 index 000000000..602c0238f --- /dev/null +++ b/apps/docs/docs/widgets/umami/index.ts @@ -0,0 +1,77 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconChartBar } from "@tabler/icons-react"; + +export const umamiWidget: WidgetDefinition = { + icon: IconChartBar, + name: "Umami Analytics", + description: "Display visitor stats from your Umami analytics instance", + path: "../../widgets/umami", + configuration: { + items: [ + { + name: "Website", + description: + "Select a website tracked by your Umami instance. Populated automatically from the connected integration.", + values: "Website selector", + defaultValue: "None", + }, + { + name: "Time frame", + description: "The time period to display visitor data for", + values: { + type: "select", + options: ["Today", "Last 24 hours", "Last 7 days", "Last 30 days", "This month", "Last month"], + }, + defaultValue: "Last 24 hours", + }, + { + name: "View", + description: "What to display in the widget body. Visible once a website is selected.", + values: { + type: "select", + options: ["Chart", "Events chart", "Top pages", "Top referrers"], + }, + defaultValue: "Chart", + }, + { + name: "Chart type", + description: 'Display style for the chart. Visible when View is "Chart" or "Events chart".', + values: { + type: "select", + options: ["Bar chart", "Sparkline"], + }, + defaultValue: "Bar chart", + }, + { + name: "Chart style", + description: + 'How to render the event series alongside visitors. Visible when View is "Chart", Chart type is "Bar chart", and an Event is selected.', + values: { + type: "select", + options: ["Side by side", "Overlay (subset)"], + }, + defaultValue: "Side by side", + }, + { + name: "Event", + description: + 'Overlay a single named event on the visitor chart. Populated from event names recorded by Umami. Visible when View is "Chart".', + values: "Event name selector", + defaultValue: "None", + }, + { + name: "Events", + description: + 'Select one or more events to plot as individual series with no visitors baseline. Populated from event names recorded by Umami. Visible when View is "Events chart".', + values: "Multi-select event name selector", + defaultValue: "None", + }, + { + name: "Items to show", + description: 'Number of top items to display. Visible when View is "Top pages" or "Top referrers".', + values: "Number (1–500)", + defaultValue: "5", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/ups/img/screenshot-compact.png b/apps/docs/docs/widgets/ups/img/screenshot-compact.png new file mode 100644 index 000000000..62e934a41 Binary files /dev/null and b/apps/docs/docs/widgets/ups/img/screenshot-compact.png differ diff --git a/apps/docs/docs/widgets/ups/img/screenshot-mini.png b/apps/docs/docs/widgets/ups/img/screenshot-mini.png new file mode 100644 index 000000000..1ff71a4cc Binary files /dev/null and b/apps/docs/docs/widgets/ups/img/screenshot-mini.png differ diff --git a/apps/docs/docs/widgets/ups/img/screenshot.png b/apps/docs/docs/widgets/ups/img/screenshot.png new file mode 100644 index 000000000..96b6070ec Binary files /dev/null and b/apps/docs/docs/widgets/ups/img/screenshot.png differ diff --git a/apps/docs/docs/widgets/ups/index.mdx b/apps/docs/docs/widgets/ups/index.mdx new file mode 100644 index 000000000..bf512990d --- /dev/null +++ b/apps/docs/docs/widgets/ups/index.mdx @@ -0,0 +1,48 @@ +--- +title: 'UPS' +description: 'Monitor the status of your UPS devices through a NUT server.' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { upsWidget } from '.'; +import { peaNutIntegration } from '@site/docs/integrations/peanut'; + + + +This widget displays the status of the UPS devices reported by a Network UPS Tools (NUT) server. Each device shows its +status (online, on battery, charging or low battery), battery charge and estimated runtime, output load, and input and +output voltage. + +### Layouts + +import screenshotFull from './img/screenshot.png'; +import screenshotCompact from './img/screenshot-compact.png'; +import screenshotMini from './img/screenshot-mini.png'; + +The widget adapts to the size of the tile, so it stays readable from a full dashboard panel down to a single cell. Multiple UPS devices scroll within the widget at any height. + +| Layout | Size | Preview | +| --- | --- | --- | +| Full | 3+ columns wide | UPS widget full layout | +| Compact | ~2 columns | UPS widget compact layout | +| Mini | 1 column | UPS widget mini layout | + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/ups/index.ts b/apps/docs/docs/widgets/ups/index.ts new file mode 100644 index 000000000..b54d68647 --- /dev/null +++ b/apps/docs/docs/widgets/ups/index.ts @@ -0,0 +1,31 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconBatteryCharging } from "@tabler/icons-react"; + +export const upsWidget: WidgetDefinition = { + icon: IconBatteryCharging, + name: "UPS", + description: "Monitor the status of your UPS devices through a NUT server.", + path: "../../widgets/ups", + configuration: { + items: [ + { + name: "Show battery", + description: "Displays the battery charge ring and estimated runtime for each UPS device.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show load", + description: "Displays the current output load percentage for each UPS device.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show voltage", + description: "Displays the input and output voltage for each UPS device.", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/uptime-kuma/index.mdx b/apps/docs/docs/widgets/uptime-kuma/index.mdx new file mode 100644 index 000000000..3a6592b2e --- /dev/null +++ b/apps/docs/docs/widgets/uptime-kuma/index.mdx @@ -0,0 +1,34 @@ +--- +title: 'Uptime Kuma' +description: 'Displays monitor uptime statistics, average uptime percentage, and service status counts.' +hide_title: true +--- + +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { uptimeKumaWidget } from '.'; +import { uptimeKumaIntegration } from '@site/docs/integrations/uptime-kuma'; + + + + +This widget displays uptime statistics from your Uptime Kuma status page, including a visual uptime ring, average uptime percentage, and per-status monitor counts. + +### Supported Integrations + + + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/uptime-kuma/index.ts b/apps/docs/docs/widgets/uptime-kuma/index.ts new file mode 100644 index 000000000..69c8468e5 --- /dev/null +++ b/apps/docs/docs/widgets/uptime-kuma/index.ts @@ -0,0 +1,49 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconHeartbeat } from "@tabler/icons-react"; + +export const uptimeKumaWidget: WidgetDefinition = { + icon: IconHeartbeat, + name: "Uptime Kuma", + description: "Displays monitor uptime statistics, average uptime percentage, and service status counts.", + path: "../../widgets/uptime-kuma", + configuration: { + items: [ + { + name: "Show average uptime", + description: "Displays the average uptime percentage across all monitors", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show uptime ring", + description: "Displays a ring progress indicator for average uptime", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show total monitors", + description: "Displays the total number of monitors", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show up count", + description: "Displays the number of monitors that are up", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show down count", + description: "Displays the number of monitors that are down", + values: { type: "boolean" }, + defaultValue: "yes", + }, + { + name: "Show paused count", + description: "Displays the number of paused monitors", + values: { type: "boolean" }, + defaultValue: "yes", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/video/img/bunny.png b/apps/docs/docs/widgets/video/img/bunny.png new file mode 100644 index 000000000..ff342c20e Binary files /dev/null and b/apps/docs/docs/widgets/video/img/bunny.png differ diff --git a/apps/docs/docs/widgets/video/index.mdx b/apps/docs/docs/widgets/video/index.mdx new file mode 100644 index 000000000..3ccf3760a --- /dev/null +++ b/apps/docs/docs/widgets/video/index.mdx @@ -0,0 +1,38 @@ +--- +title: 'Video Stream' +description: 'Embed a video stream or video from a camera or a website.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { videoWidget } from '.'; + + + + +Do you run surveilance cameras? Or maybe you have a favourite video? +The video widget enables you to integrate both seamlessly into your dashboard. +This widget uses [video.js](https://videojs.com/) to play HLS or DASH video natively. + +DRM content is not yet supported. More info here: +https://videojs.com/guides/faqs/#q-what-is-videojs + + +You can use the following URL to test: +http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4 + +### Screenshots + +![video big-buck-bunny](./img/bunny.png) + +### Adding the widget + + + +### Configuration + diff --git a/apps/docs/docs/widgets/video/index.tsx b/apps/docs/docs/widgets/video/index.tsx new file mode 100644 index 000000000..e0df87ce0 --- /dev/null +++ b/apps/docs/docs/widgets/video/index.tsx @@ -0,0 +1,43 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconDeviceCctv } from "@tabler/icons-react"; + +export const videoWidget: WidgetDefinition = { + icon: IconDeviceCctv, + name: "Video Stream", + description: "Embed a video stream or video from a camera or a website.", + path: "../../widgets/stock-price", + configuration: { + items: [ + { + name: "Feed URL", + description: "The URL of the video feed or video file", + defaultValue: "-", + values: "URL to video", + }, + { + name: "Autoplay", + description: "Autoplay only works when muted because of browser restrictions", + values: { + type: "boolean", + }, + defaultValue: "yes", + }, + { + name: "Muted", + description: "Mute the video stream", + values: { + type: "boolean", + }, + defaultValue: "yes", + }, + { + name: "Show controls", + description: "Show video controls like play, pause, volume etc.", + values: { + type: "boolean", + }, + defaultValue: "no", + }, + ], + }, +}; diff --git a/apps/docs/docs/widgets/weather/img/current.png b/apps/docs/docs/widgets/weather/img/current.png new file mode 100644 index 000000000..45cc08169 Binary files /dev/null and b/apps/docs/docs/widgets/weather/img/current.png differ diff --git a/apps/docs/docs/widgets/weather/img/forecast.png b/apps/docs/docs/widgets/weather/img/forecast.png new file mode 100644 index 000000000..2de9b1224 Binary files /dev/null and b/apps/docs/docs/widgets/weather/img/forecast.png differ diff --git a/apps/docs/docs/widgets/weather/index.mdx b/apps/docs/docs/widgets/weather/index.mdx new file mode 100644 index 000000000..0ff4081d7 --- /dev/null +++ b/apps/docs/docs/widgets/weather/index.mdx @@ -0,0 +1,40 @@ +--- +title: 'Weather' +description: 'Displays the current weather information of a set location.' +hide_title: true +--- + +import { AddingWidget } from '@site/src/components/widgets/adding'; +import { WidgetConfig } from '@site/src/components/widgets/configuration'; +import { WidgetHeader } from '@site/src/components/widgets/header'; +import { weatherWidget } from '.'; + + + + +The Weather Widget uses your location to display the current, highest and lowest temperature. + +### Screenshots + +import forecastWeather from './img/forecast.png'; +import currentWeather from './img/current.png'; + +
+ weather forecast-5-days + weather current +
+ +### Adding the widget + + + +### Configuration + + +### Data source + +We use the Open Meteo API to fetch the weather and locations. +If you need to whitelist the api, please use the following URL: `https://open-meteo.com` \ No newline at end of file diff --git a/apps/docs/docs/widgets/weather/index.tsx b/apps/docs/docs/widgets/weather/index.tsx new file mode 100644 index 000000000..ff795f984 --- /dev/null +++ b/apps/docs/docs/widgets/weather/index.tsx @@ -0,0 +1,80 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconCloud } from "@tabler/icons-react"; + +export const weatherWidget: WidgetDefinition = { + icon: IconCloud, + name: "Weather", + description: "Displays the current weather information of a set location.", + path: "../../widgets/weather", + configuration: { + items: [ + { + name: "Temperature in Fahrenheit", + description: "Display temperature in Fahrenheit instead of Celsius", + values: { type: "boolean" }, + defaultValue: "no", + }, + { + name: "Disable temperature decimals", + description: "Show temperature as full number", + values: { + type: "boolean", + }, + defaultValue: "no", + }, + { + name: "Show current wind speed", + description: "Display current wind speed, only for current weather", + values: { + type: "boolean", + }, + defaultValue: "yes", + }, + { + name: "Use imperial speed units", + description: "Display wind speed in mph instead of km/h", + values: { + type: "boolean", + }, + defaultValue: "no", + }, + { + name: "Weather location", + description: "Location for which to display the weather information", + values: "Select location through search or longitude/latitude", + defaultValue: "Paris / 48.85341, 2.3488", + }, + { + name: "Date format", + description: "Format for displaying the date in the widget", + values: { + type: "select", + options: ["dddd, MMMM D", "dddd, D MMMM", "MMM D", "D MMM", "DD/MM/YYYY", "MM/DD/YYYY", "DD/MM", "MM/DD"], + }, + defaultValue: "dddd, MMMM D", + }, + { + name: "Show city", + description: "Display the city name in the widget", + values: { + type: "boolean", + }, + defaultValue: "no", + }, + { + name: "Has forecast", + description: "Display a forecast for the next few days", + values: { + type: "boolean", + }, + defaultValue: "no", + }, + { + name: "Amount of forecast days", + description: "Number of days to show in the forecast", + values: "1-7", + defaultValue: "5", + }, + ], + }, +}; diff --git a/apps/docs/docsearch.config.js b/apps/docs/docsearch.config.js new file mode 100644 index 000000000..0af932a97 --- /dev/null +++ b/apps/docs/docsearch.config.js @@ -0,0 +1,122 @@ +// Algolia DocSearch crawler for homarr.dev +// Crawler ID: cd77a285-2756-4557-bf21-ee703748df15 +// DocSearch-managed crawlers: paste this in the Algolia crawler editor or send to DocSearch support. +// Template: https://docsearch.algolia.com/docs/templates/#docusaurus-v3-template +// Markdown indexing: https://www.algolia.com/doc/guides/algolia-ai/askai/guides/markdown-indexing + +new Crawler({ + appId: "N69WSPZTID", + apiKey: "YOUR_CRAWLER_ADMIN_API_KEY", + rateLimit: 8, + maxDepth: 10, + startUrls: ["https://homarr.dev/"], + sitemaps: ["https://homarr.dev/sitemap.xml"], + ignoreCanonicalTo: true, + discoveryPatterns: ["https://homarr.dev/**"], + actions: [ + { + indexName: "Docusaurus", + pathsToMatch: ["https://homarr.dev/**"], + recordExtractor: ({ $, helpers }) => { + const lvl0 = + $(".menu__link.menu__link--sublist.menu__link--active, .navbar__item.navbar__link--active").last().text() || + "Documentation"; + + return helpers.docsearch({ + recordProps: { + lvl0: { + selectors: "", + defaultValue: lvl0, + }, + lvl1: ["header h1", "article h1"], + lvl2: "article h2", + lvl3: "article h3", + lvl4: "article h4", + lvl5: "article h5, article td:first-child", + lvl6: "article h6", + content: "article p, article li, article td:last-child", + }, + indexHeadings: true, + aggregateContent: true, + recordVersion: "v3", + }); + }, + }, + { + indexName: "markdown", + pathsToMatch: ["https://homarr.dev/**"], + recordExtractor: ({ $, url, helpers }) => { + const text = helpers.markdown("article > *:not(nav):not(header):not(.breadcrumb)"); + + if (text === "") { + return []; + } + + const language = $("html").attr("lang") || "en"; + const title = $("head > title").text(); + const h1 = $("article h1").first().text(); + + return helpers.splitTextIntoRecords({ + text, + baseRecord: { + url, + objectID: url, + title: title || h1, + heading: h1, + lang: language, + language, + version: "current", + docusaurus_tag: "docs-default-current", + }, + maxRecordBytes: 100000, + orderingAttributeName: "part", + }); + }, + }, + ], + initialIndexSettings: { + Docusaurus: { + attributesForFaceting: ["type", "lang", "language", "version", "docusaurus_tag"], + attributesToRetrieve: ["hierarchy", "content", "anchor", "url", "url_without_anchor", "type"], + attributesToHighlight: ["hierarchy", "content"], + attributesToSnippet: ["content:10"], + camelCaseAttributes: ["hierarchy", "content"], + searchableAttributes: [ + "unordered(hierarchy.lvl0)", + "unordered(hierarchy.lvl1)", + "unordered(hierarchy.lvl2)", + "unordered(hierarchy.lvl3)", + "unordered(hierarchy.lvl4)", + "unordered(hierarchy.lvl5)", + "unordered(hierarchy.lvl6)", + "content", + ], + distinct: true, + attributeForDistinct: "url", + customRanking: ["desc(weight.pageRank)", "desc(weight.level)", "asc(weight.position)"], + ranking: ["words", "filters", "typo", "attribute", "proximity", "exact", "custom"], + highlightPreTag: '', + highlightPostTag: "", + minWordSizefor1Typo: 3, + minWordSizefor2Typos: 7, + allowTyposOnNumericTokens: false, + minProximity: 1, + ignorePlurals: true, + advancedSyntax: true, + attributeCriteriaComputedByMinProximity: true, + removeWordsIfNoResults: "allOptional", + separatorsToIndex: "_", + }, + markdown: { + attributesForFaceting: ["lang", "language", "version", "docusaurus_tag"], + ignorePlurals: true, + minProximity: 1, + removeStopWords: false, + searchableAttributes: ["title", "heading", "unordered(text)"], + removeWordsIfNoResults: "lastWords", + attributesToHighlight: ["title", "text"], + typoTolerance: false, + advancedSyntax: false, + }, + }, +}); diff --git a/apps/docs/docusaurus.config.ts b/apps/docs/docusaurus.config.ts new file mode 100644 index 000000000..cadc08fe6 --- /dev/null +++ b/apps/docs/docusaurus.config.ts @@ -0,0 +1,302 @@ +import type * as Preset from "@docusaurus/preset-classic"; +import type { Config } from "@docusaurus/types"; +import { themes as prismThemes } from "prism-react-renderer"; +const a11yEmoji = require("@fec/remark-a11y-emoji"); + +const config: Config = { + title: "Homarr documentation", + tagline: "A simple yet powerful dashboard for your server.", + url: "https://homarr.dev", + baseUrl: "/", + favicon: "img/logo.png", + organizationName: "homarr-labs", + projectName: "homarr", + i18n: { + defaultLocale: "en", + locales: ["en"], + }, + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "throw", + onBrokenAnchors: "throw", + onDuplicateRoutes: "throw", + + future: { + v4: { + removeLegacyPostBuildHeadAttribute: true, + useCssCascadeLayers: true, + siteStorageNamespacing: true, + fasterByDefault: true, + mdx1CompatDisabledByDefault: false, + }, + }, + + markdown: { + mermaid: true, + format: "detect", + }, + + themes: ["@docusaurus/theme-mermaid"], + + scripts: [ + { + src: "https://widget.kapa.ai/kapa-widget.bundle.js", + "data-website-id": "1e4656f4-abeb-4343-bbae-1d8626f52378", + "data-project-name": "Homarr", + "data-project-color": "#2B2B2B", + "data-project-logo": "https://homarr.dev/img/favicon.png", + async: true, + }, + ], + + presets: [ + [ + "classic", + { + docs: { + sidebarPath: require.resolve("./sidebars.js"), + editUrl: ({ docPath }) => `https://github.com/homarr-labs/homarr/edit/dev/apps/docs/docs/${docPath}`, + remarkPlugins: [a11yEmoji], + exclude: ["**/custom-widget.mdx"], + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + blog: { + showReadingTime: true, + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: "https://github.com/homarr-labs/homarr/edit/dev/apps/docs", + authorsMapPath: "authors.yml", + }, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + sitemap: { + changefreq: "weekly", + priority: 0.5, + ignorePatterns: ["/tags/**"], + filename: "sitemap.xml", + }, + } satisfies Preset.Options, + ], + ], + + themeConfig: { + navbar: { + title: "Homarr", + logo: { + alt: "Homarr Logo", + src: "img/logo.png", + }, + items: [ + { + label: "Documentation", + type: "doc", + position: "left", + docId: "getting-started/index", + }, + { + label: "Blog", + position: "left", + to: "/blog", + }, + { + label: "About us", + position: "left", + to: "/about-us", + }, + { + to: "https://demo.homarr.dev/", + label: "Demo", + position: "right", + }, + { + to: "https://opencollective.com/homarr", + label: "💴 Donate", + position: "right", + }, + { + type: "dropdown", + label: "Community", + position: "right", + items: [ + { + to: "https://discord.com/invite/aCsmEV5RgA", + label: "Discord", + }, + { + to: "https://github.com/homarr-labs/homarr", + label: "GitHub", + }, + { + to: "https://www.answeroverflow.com/c/972958686051962910", + label: "Answer Overflow", + }, + { + to: "https://crowdin.com/project/homarr_labs", + label: "Community translations (Crowdin)", + }, + { + to: "https://www.reddit.com/r/homarr/", + label: "Reddit", + }, + { + to: "https://opencollective.com/homarr", + label: "OpenCollective", + }, + { + to: "https://x.com/homarr_labs", + label: "X / Twitter", + }, + ], + }, + { + type: "search", + position: "right", + }, + ], + hideOnScroll: false, + }, + algolia: { + appId: "N69WSPZTID", + apiKey: "b2b00f4ed8ca3dc87b5d211c55121416", + indexName: "Docusaurus", + contextualSearch: false, + searchPagePath: "search", + insights: false, + replaceSearchResultPathname: { + from: "/docs/(next|\\d+(?:\\.\\d+)*)/", + to: "/docs/", + }, + }, + footer: { + links: [ + { + title: "Documentation", + items: [ + { + label: "Installation", + to: "/docs/category/getting-started", + }, + ], + }, + { + title: "Community", + items: [ + { + label: "Discord", + to: "https://discord.com/invite/aCsmEV5RgA", + }, + { + label: "GitHub", + to: "https://github.com/homarr-labs/homarr", + }, + { + label: "Donate", + to: "https://opencollective.com/homarr", + }, + ], + }, + { + title: "More", + items: [ + { + label: "Blog", + to: "/blog", + }, + { + label: "About us", + to: "/about-us", + }, + ], + }, + ], + logo: { + alt: "Homarr Logo", + src: "img/logo.png", + height: 100, + }, + copyright: `Copyright © ${new Date().getFullYear()} Homarr — License`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + defaultLanguage: "bash", + }, + colorMode: { + defaultMode: "dark", + respectPrefersColorScheme: true, + }, + metadata: [ + { + name: "keywords", + content: "Homarr, Dashboard, Selfhosted, Hosting, Modules, Open-Source", + }, + ], + zoom: { + selector: ".markdown :not(em) > img", + background: { + light: "rgb(255, 255, 255)", + dark: "rgb(50, 50, 50)", + }, + config: { + // options you can specify via https://github.com/francoischalifour/medium-zoom#usage + margin: 80, + }, + }, + tableOfContents: { + minHeadingLevel: 2, + maxHeadingLevel: 4, + }, + } satisfies Preset.ThemeConfig, + plugins: [ + function homarrPackagesPlugin() { + return { + name: "resolve-homarr-packages", + configureWebpack() { + return { resolve: { symlinks: false } }; + }, + }; + }, + [ + "posthog-docusaurus", + { + apiKey: "phc_pWxeD1hbl4ip02JYReX1Crjkt5DhB3dduigirHMCtFE", + appUrl: "https://hog.homarr.dev", + enableInDevelopment: true, + ui_host: "https://eu.posthog.com", + defaults: "2026-01-30", + autocapture: true, + disable_session_recording: true, + advanced_disable_feature_flags: true, + }, + ], + "docusaurus-plugin-image-zoom", + require.resolve("./plugins/validate-docs-coverage"), + function disableExpensiveBundlerOptimizationPlugin() { + return { + name: "disable-expensive-bundler-optimizations", + configureWebpack(_config: unknown, isServer: boolean) { + return { + optimization: { + concatenateModules: process.env.CI != null && process.env.CI !== "false" ? !isServer : false, + }, + }; + }, + }; + }, + "@signalwire/docusaurus-plugin-llms-txt", + async function tailwindCssPlugin(context, options) { + return { + name: "docusaurus-tailwindcss", + configurePostCss(postcssOptions) { + // Appends TailwindCSS and AutoPrefixer. + postcssOptions.plugins.push(require("tailwindcss")); + postcssOptions.plugins.push(require("autoprefixer")); + return postcssOptions; + }, + }; + }, + ], +}; + +export default config; diff --git a/apps/docs/package.json b/apps/docs/package.json new file mode 100644 index 000000000..0a2c4bbd5 --- /dev/null +++ b/apps/docs/package.json @@ -0,0 +1,77 @@ +{ + "name": "@homarr/docs", + "version": "0.2.3", + "private": true, + "license": "Apache-2.0", + "scripts": { + "docusaurus": "docusaurus", + "dev": "docusaurus start --no-open --port 3003", + "start": "docusaurus start --port 3003", + "build": "docusaurus build", + "serve": "docusaurus serve", + "clear": "docusaurus clear", + "typecheck": "tsc --noEmit", + "lint": "oxlint", + "format": "oxfmt .", + "clean": "rm -rf build .docusaurus", + "swizzle": "docusaurus swizzle", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "api-dump-contributors": "node ./scripts/dump-contributors.mjs", + "verify:search": "node ./scripts/verify-algolia-search.mjs" + }, + "dependencies": { + "@docusaurus/core": "^3.10.1", + "@docusaurus/faster": "^3.10.1", + "@docusaurus/plugin-content-docs": "^3.10.1", + "@docusaurus/plugin-sitemap": "^3.10.1", + "@docusaurus/preset-classic": "^3.10.1", + "@homarr/definitions": "workspace:^", + "@mdx-js/react": "^3.1.1", + "@nivo/line": "^0.99.0", + "@scalar/api-reference-react": "catalog:", + "@signalwire/docusaurus-plugin-llms-txt": "^1.2.2", + "@tabler/icons-react": "catalog:", + "autoprefixer": "^10.5.0", + "clsx": "catalog:", + "dayjs": "catalog:", + "docusaurus-plugin-image-zoom": "^3.0.1", + "leader-line-new": "^1.1.9", + "postcss": "^8.4.32", + "posthog-docusaurus": "^2.0.5", + "prism-react-renderer": "^2.4.1", + "random-word-slugs": "^0.1.7", + "react": "catalog:", + "react-dom": "catalog:", + "swiper": "^12.2.0", + "tailwindcss": "^3.4.19" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.10.1", + "@docusaurus/tsconfig": "^3.10.1", + "@docusaurus/types": "^3.10.1", + "@fec/remark-a11y-emoji": "^3.1.0", + "@tsconfig/docusaurus": "^2.0.9", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "cheerio": "^1.2.0", + "typescript": "catalog:", + "zod": "catalog:" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.10.1", + "@docusaurus/theme-mermaid": "^3.10.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/apps/docs/plugins/validate-docs-coverage.ts b/apps/docs/plugins/validate-docs-coverage.ts new file mode 100644 index 000000000..a3e077fea --- /dev/null +++ b/apps/docs/plugins/validate-docs-coverage.ts @@ -0,0 +1,38 @@ +import type { LoadContext, Plugin } from "@docusaurus/types"; +import fs from "node:fs"; +import path from "node:path"; + +import { integrationDocSlugs } from "@homarr/definitions/docs/integration-doc-slugs"; +import { widgetDocSlugs } from "@homarr/definitions/docs/widget-doc-slugs"; + +const slugMaps = { + Integration: { slugs: integrationDocSlugs, folder: "integrations" }, + Widget: { slugs: widgetDocSlugs, folder: "widgets" }, +} as const; + +export default function validateDocsCoveragePlugin(context: LoadContext): Plugin { + return { + name: "validate-docs-coverage", + async loadContent() { + const docsDir = path.resolve(context.siteDir, "docs"); + const missing: string[] = []; + + for (const [label, { slugs, folder }] of Object.entries(slugMaps)) { + for (const [kind, slug] of Object.entries(slugs)) { + if (!slug) continue; + if (!fs.existsSync(path.join(docsDir, folder, slug))) { + missing.push(`${label} "${kind}" -> docs/${folder}/${slug}/`); + } + } + } + + if (missing.length > 0) { + throw new Error( + `Missing documentation for ${missing.length} feature(s):\n` + + missing.map((m) => ` - ${m}`).join("\n") + + "\n\nCreate the missing doc folders with index.ts + index.mdx.", + ); + } + }, + }; +} diff --git a/apps/docs/scripts/dump-contributors.mjs b/apps/docs/scripts/dump-contributors.mjs new file mode 100644 index 000000000..f2cd60fb4 --- /dev/null +++ b/apps/docs/scripts/dump-contributors.mjs @@ -0,0 +1,103 @@ +import { z } from 'zod'; +import fs from 'fs/promises'; + +const sources = { + crowdin: [ + { projectId: 534422, tokenName: 'HOMARR_CROWDIN_TOKEN' }, + { projectId: 742587, tokenName: 'HOMARR_LABS_CROWDIN_TOKEN' }, + ], + github: [ + { repository: 'homarr', slug: 'ajnart' }, + { repository: 'homarr', slug: 'homarr-labs' }, + ], +}; + +const schema = z.object({ + GITHUB_TOKEN: z.string().nonempty(), + HOMARR_CROWDIN_TOKEN: z.string().nonempty(), + HOMARR_LABS_CROWDIN_TOKEN: z.string().nonempty(), +}); + +const env = schema.parse(process.env); + +const fetchGithubContributors = async (slug, repository) => { + const url = `https://api.github.com/repos/${slug}/${repository}/contributors?per_page=999`; + const options = { + method: 'GET', + headers: { + Authorization: `Bearer ${env.GITHUB_TOKEN}`, + Accept: 'application/vnd.github+json', + 'X-GitHub-Api-Version': '2022-11-28', + }, + }; + + const response = await fetch(url, options); + const data = await response.json(); + + const dataSchema = z.array( + z.object({ + login: z.string(), + avatar_url: z.string().url(), + contributions: z.number(), + }) + ); + + return dataSchema.parse(data); +}; + +const fetchCrowdinMembers = async (projectId, tokenName) => { + const url = `https://crowdin.com/api/v2/projects/${projectId}/members`; + const options = { + method: 'GET', + headers: { + Accept: 'application/json', + Authorization: `Bearer ${env[tokenName]}`, + }, + }; + + const response = await fetch(url, options); + const data = await response.json(); + + const dataSchema = z.object({ + data: z.array( + z.object({ + data: z.object({ + username: z.string(), + avatarUrl: z.string().url(), + }), + }) + ), + }); + + const contributionsData = dataSchema.parse(data); + + return contributionsData.data.flatMap((data) => data.data); +}; + +const distinctBy = (callback) => (value, index, self) => { + return self.findIndex((item) => callback(item) == callback(value)) === index; +}; + +const githubContributors = []; +const crowdinContributors = []; + +for (const { repository, slug } of sources.github) { + githubContributors.push(...(await fetchGithubContributors(slug, repository))); +} +const distinctGithubContributors = githubContributors + .filter(distinctBy((contributor) => contributor.login)) + .sort((a, b) => b.contributions - a.contributions) + .map(({ contributions, ...props }) => props) + .filter((contributor) => !contributor.login.includes('[bot]')); +await fs.writeFile('./static/data/contributions.json', JSON.stringify(distinctGithubContributors)); + +for (const { projectId, tokenName } of sources.crowdin) { + crowdinContributors.push(...(await fetchCrowdinMembers(projectId, tokenName))); +} +const distinctCrowdinContributors = crowdinContributors.filter( + distinctBy((contributor) => contributor.username) +); +await fs.writeFile( + './static/data/translation-contributions.json', + JSON.stringify(distinctCrowdinContributors) +); diff --git a/apps/docs/scripts/verify-algolia-search.mjs b/apps/docs/scripts/verify-algolia-search.mjs new file mode 100644 index 000000000..4aa5e30e7 --- /dev/null +++ b/apps/docs/scripts/verify-algolia-search.mjs @@ -0,0 +1,189 @@ +const APP_ID = 'N69WSPZTID'; +const API_KEY = 'b2b00f4ed8ca3dc87b5d211c55121416'; +const DOCSEARCH_INDEX = 'Docusaurus'; +const MARKDOWN_INDEX = 'markdown'; +const MIN_DOCSEARCH_HITS = 100; +const MIN_MARKDOWN_HITS = 10; + +const DOCSEARCH_FACETS = [ + 'docusaurus_tag', + 'language', + 'lang', + 'version', + 'type', +]; + +const SEARCH_CASES = [ + { term: 'docker', minHits: 1 }, + { term: 'coolify', minHits: 1 }, + { term: 'jellyseerr', minHits: 1 }, + { term: 'keyboard shortcuts', minHits: 1 }, + { term: 'version 0.12', minHits: 1 }, +]; + +const STALE_URL_PATTERN = /\/docs\/(next|\d+(?:\.\d+)+)\//; + +async function algoliaQuery(index, body) { + const response = await fetch( + `https://${APP_ID}-dsn.algolia.net/1/indexes/${index}/query`, + { + method: 'POST', + headers: { + 'X-Algolia-Application-Id': APP_ID, + 'X-Algolia-API-Key': API_KEY, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }, + ); + + if (!response.ok) { + throw new Error(`Algolia query on "${index}" failed: HTTP ${response.status}`); + } + + return response.json(); +} + +function reportLine(ok, message) { + const prefix = ok ? 'OK' : 'FAIL'; + console.log(`${prefix}: ${message}`); + return ok; +} + +async function resolveDocsearchIndex() { + const candidates = [DOCSEARCH_INDEX, `${DOCSEARCH_INDEX}.tmp`]; + + for (const index of candidates) { + const result = await algoliaQuery(index, { query: '', hitsPerPage: 0 }); + const hitCount = result.nbHits ?? 0; + if (hitCount >= MIN_DOCSEARCH_HITS) { + return { index, hitCount }; + } + } + + const fallback = await algoliaQuery(DOCSEARCH_INDEX, { query: '', hitsPerPage: 0 }); + return { index: DOCSEARCH_INDEX, hitCount: fallback.nbHits ?? 0 }; +} + +async function resolveMarkdownIndex() { + const candidates = [MARKDOWN_INDEX, `${MARKDOWN_INDEX}.tmp`]; + + for (const index of candidates) { + const result = await algoliaQuery(index, { query: '', hitsPerPage: 0 }); + const hitCount = result.nbHits ?? 0; + if (hitCount >= MIN_MARKDOWN_HITS) { + return { index, hitCount }; + } + } + + const fallback = await algoliaQuery(MARKDOWN_INDEX, { query: '', hitsPerPage: 0 }); + return { index: MARKDOWN_INDEX, hitCount: fallback.nbHits ?? 0 }; +} + +async function verifyDocsearchIndex(index, hitCount) { + let ok = reportLine( + hitCount >= MIN_DOCSEARCH_HITS, + `index "${index}" has ${hitCount} records (need >= ${MIN_DOCSEARCH_HITS})`, + ); + + const sample = await algoliaQuery(index, { + query: 'docker', + hitsPerPage: 1, + attributesToRetrieve: DOCSEARCH_FACETS, + }); + + const record = sample.hits?.[0] ?? {}; + const recordFields = ['docusaurus_tag', 'language', 'lang', 'version', 'type']; + for (const field of recordFields) { + const present = record[field] !== undefined && record[field] !== null; + ok = reportLine(present, `records include "${field}"`) && ok; + } + + for (const searchCase of SEARCH_CASES) { + const result = await algoliaQuery(index, { + query: searchCase.term, + hitsPerPage: 5, + attributesToRetrieve: ['url'], + }); + + const caseHits = result.nbHits ?? 0; + ok = + reportLine( + caseHits >= searchCase.minHits, + `"${searchCase.term}" returns ${caseHits} hits (need >= ${searchCase.minHits})`, + ) && ok; + + const staleUrls = (result.hits ?? []) + .map((hit) => hit.url) + .filter((url) => STALE_URL_PATTERN.test(url)); + + ok = + reportLine( + staleUrls.length === 0, + `"${searchCase.term}" has no stale versioned URLs (${staleUrls.length} stale)`, + ) && ok; + } + + return ok; +} + +async function verifyMarkdownIndex(index, hitCount) { + let ok = reportLine( + hitCount >= MIN_MARKDOWN_HITS, + `markdown index "${index}" has ${hitCount} records (need >= ${MIN_MARKDOWN_HITS})`, + ); + + const coolify = await algoliaQuery(index, { + query: 'coolify', + hitsPerPage: 3, + attributesToRetrieve: ['url', 'title', 'heading', 'text'], + }); + + ok = + reportLine( + (coolify.nbHits ?? 0) >= 1, + `markdown index "${index}" returns coolify (${coolify.nbHits ?? 0} hits)`, + ) && ok; + + const sample = coolify.hits?.[0]; + ok = + reportLine( + Boolean(sample?.text?.length), + `markdown records include chunked text content`, + ) && ok; + + return ok; +} + +async function main() { + console.log('Verifying Algolia DocSearch + markdown indices...\n'); + + const docsearch = await resolveDocsearchIndex(); + console.log(`Using DocSearch index: ${docsearch.index}\n`); + const docsearchOk = await verifyDocsearchIndex( + docsearch.index, + docsearch.hitCount, + ); + + console.log(''); + const markdown = await resolveMarkdownIndex(); + console.log(`Using markdown index: ${markdown.index}\n`); + const markdownOk = await verifyMarkdownIndex( + markdown.index, + markdown.hitCount, + ); + + const allOk = docsearchOk && markdownOk; + console.log(''); + console.log( + allOk + ? 'All checks passed.' + : 'Some checks failed — ensure the crawler config in docsearch.config.js is applied and a full recrawl has finished.', + ); + process.exit(allOk ? 0 : 1); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/apps/docs/sidebars.js b/apps/docs/sidebars.js new file mode 100644 index 000000000..50b2a2723 --- /dev/null +++ b/apps/docs/sidebars.js @@ -0,0 +1,32 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + GettingStarted: [{ type: "autogenerated", dirName: "getting-started" }], + Docs: [{ type: "autogenerated", dirName: "." }], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + { + type: 'category', + label: 'Tutorial', + items: ['about'], + }, + ], + */ +}; + +module.exports = sidebars; diff --git a/apps/docs/src/components/carbon.tsx b/apps/docs/src/components/carbon.tsx new file mode 100644 index 000000000..68e2708e1 --- /dev/null +++ b/apps/docs/src/components/carbon.tsx @@ -0,0 +1,170 @@ +import { useLocation } from "@docusaurus/router"; +import React, { useEffect } from "react"; + +export function Carbon() { + const ref = React.useRef(null!); + const location = useLocation(); + if (process.env.NODE_ENV === "development") { + return null; + } + + useEffect(() => { + const serve = "CWBDTKQM"; + const placement = "homarrdev"; + ref.current.innerHTML = ""; + const s = document.createElement("script"); + s.id = "_carbonads_js"; + s.src = `//cdn.carbonads.com/carbon.js?serve=${serve}&placement=${placement}&format=cover`; + ref.current.appendChild(s); + }, [location]); + + return ( + <> +
+ + ); +} + +// Variant 1: Strict re-initialization – remove prior scripts and injected nodes, then load cover +export function CarbonCoverStrict() { + const ref = React.useRef(null!); + const location = useLocation(); + if (process.env.NODE_ENV === "development") { + return null; + } + + useEffect(() => { + const serve = "CWBDTKQM"; + const placement = "homarrdev"; + + // Clear our local container + ref.current.innerHTML = ""; + + // Remove any globally injected Carbon ad containers + Array.from(document.querySelectorAll('[id^="carbonads"], .carbonads')).forEach( + (el) => el.parentElement && el.parentElement.removeChild(el), + ); + + // Remove existing script if present + const existing = document.getElementById("_carbonads_js"); + if (existing && existing.parentElement) existing.parentElement.removeChild(existing); + + // Reset possible global handle + try { + delete (window as any)._carbonads; + } catch {} + + // Inject fresh cover script into our container + const s = document.createElement("script"); + s.id = "_carbonads_js"; + s.src = `https://cdn.carbonads.com/carbon.js?serve=${serve}&placement=${placement}&format=cover`; + ref.current.appendChild(s); + }, [location]); + + return ( + <> + +
+ + ); +} + +// Variant 2: Observer – load cover then keep only the latest injected ad node +export function CarbonCoverObserver() { + const ref = React.useRef(null!); + const location = useLocation(); + if (process.env.NODE_ENV === "development") { + return null; + } + + useEffect(() => { + const serve = "CWBDTKQM"; + const placement = "homarrdev"; + + ref.current.innerHTML = ""; + + const s = document.createElement("script"); + s.id = "_carbonads_js"; + s.src = `https://cdn.carbonads.com/carbon.js?serve=${serve}&placement=${placement}&format=cover`; + ref.current.appendChild(s); + + // Observe body and ensure we keep only the most recent carbon container + const trim = () => { + const nodes = Array.from(document.querySelectorAll('[id^="carbonads"]')) as HTMLElement[]; + if (nodes.length > 1) { + // Keep the last (most recently inserted); remove the rest + nodes.slice(0, -1).forEach((n) => n.parentElement && n.parentElement.removeChild(n)); + } + }; + + const observer = new MutationObserver(() => trim()); + observer.observe(document.body, { childList: true, subtree: true }); + + // Initial pass + trim(); + + return () => observer.disconnect(); + }, [location]); + + return ( + <> + +
+ + ); +} + +// Variant 3: CSS-only – hide the first instance so only the second (cover) remains visible +export function CarbonCoverCssOnlySecond() { + const ref = React.useRef(null!); + const location = useLocation(); + if (process.env.NODE_ENV === "development") { + return null; + } + + useEffect(() => { + const serve = "CWBDTKQM"; + const placement = "homarrdev"; + ref.current.innerHTML = ""; + const s = document.createElement("script"); + s.id = "_carbonads_js"; + s.src = `https://cdn.carbonads.com/carbon.js?serve=${serve}&placement=${placement}&format=cover`; + ref.current.appendChild(s); + }, [location]); + + return ( + <> + +
+ + ); +} diff --git a/apps/docs/src/components/integrations/adding.tsx b/apps/docs/src/components/integrations/adding.tsx new file mode 100644 index 000000000..9846675ab --- /dev/null +++ b/apps/docs/src/components/integrations/adding.tsx @@ -0,0 +1,8 @@ +export const AddingIntegration = () => { + return ( +

+ You can find how to add the integration on the Integrations Management{" "} + documentation page. +

+ ); +}; diff --git a/apps/docs/src/components/integrations/header.tsx b/apps/docs/src/components/integrations/header.tsx new file mode 100644 index 000000000..411a7dbdc --- /dev/null +++ b/apps/docs/src/components/integrations/header.tsx @@ -0,0 +1,28 @@ +import { IntegrationDefinition } from "@site/src/types"; +import { DocsHeader } from "../ui/header"; +import { useColorMode } from "@docusaurus/theme-common"; + +interface IntegrationHeaderProps { + integration: IntegrationDefinition; + categories: string[]; +} + +export const IntegrationHeader = (props: IntegrationHeaderProps) => { + const { isDarkTheme } = useColorMode(); + + return ( + } + categories={props.categories} + /> + ); +}; + +export const getIntegrationIconUrl = (integration: IntegrationDefinition, isDarkTheme: boolean): string => + typeof integration.iconUrl === "string" + ? integration.iconUrl + : isDarkTheme + ? integration.iconUrl.dark + : integration.iconUrl.light; diff --git a/apps/docs/src/components/integrations/secrets.tsx b/apps/docs/src/components/integrations/secrets.tsx new file mode 100644 index 000000000..2fc09fc6d --- /dev/null +++ b/apps/docs/src/components/integrations/secrets.tsx @@ -0,0 +1,169 @@ +import { IconCode, IconKey, IconKeyOff, IconLink, IconPassword, IconPlug, IconUser } from "@tabler/icons-react"; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; +import { ReactNode } from "react"; +import Alert from "@theme/Admonition"; + +const secretKinds = { + apiKey: { + name: "API Key", + description: "API Key from the service for authentication.", + icon: IconKey, + }, + username: { + name: "Username", + description: "Account username for authentication.", + icon: IconUser, + }, + password: { + name: "Password", + description: "Account password for authentication.", + icon: IconPassword, + }, + tokenId: { + name: "Token ID", + description: "Token ID used for authentication", + }, + realm: { + name: "Realm", + description: "The realm used for authentication, most of the time this is pve", + }, + topic: { + name: "Topic", + description: "The topic to from which notifications should be retrieved.", + }, + personalAccessToken: { + name: "Personal Access Token", + description: "A personal access token for authentication.", + icon: IconKey, + }, + opnsenseApiKey: { + name: "Api Key (Key)", + description: "The Key part of the API Key for authentication.", + icon: IconKey, + }, + opnsenseApiSecret: { + name: "Api Key (Secret)", + description: "The Secret part of the API Key for authentication.", + icon: IconPassword, + }, + githubAppId: { name: "App ID", description: "The ID of the GitHub App", icon: IconCode }, + githubInstallationId: { + name: "Installation ID", + description: "The ID of the GitHub Installation", + icon: IconPlug, + }, + privateKey: { + name: "Private Key", + description: "The private key for authentication", + icon: IconKey, + }, + url: { + name: "Url", + description: "The url of the service", + icon: IconLink, + }, + slug: { + name: "Slug", + description: "The slug or path identifier for the resource", + icon: IconLink, + }, +}; + +type SecretKind = keyof typeof secretKinds; + +interface IntegrationSecretsProps { + secrets: { + tabLabel?: string; + credentials: SecretKind[]; + steps: ReactNode[]; + header?: ReactNode; + body?: ReactNode; + footer?: ReactNode; + }[]; +} + +export const IntegrationSecrets = ({ secrets }: IntegrationSecretsProps) => { + return ( +
+
+ + {secrets.map((secret) => { + const key = secret.credentials.join("-"); + const Icon = + secret.credentials.map((value) => secretKinds[value]).find((value) => "icon" in value)?.icon || + IconKeyOff; + const tabLabel = + secret.tabLabel ?? + (secret.credentials.length === 0 + ? "No Authentication" + : secret.credentials.map((value) => secretKinds[value].name).join(" & ")); + + return ( + + + {tabLabel} +
+ } + className="w-100" + value={key} + > +
+ {secret.header} + {secret.credentials.length >= 1 && ( + + + + + + + + + {secret.credentials.map((credential) => { + const kind = secretKinds[credential]; + return ( + + + + + ); + })} + +
NameDescription
+
{kind.name}
+
{kind.description}
+ )} + {secret.credentials.length === 0 && ( + + This integration does not require any credentials to be set. + + )} + {secret.body} + + {secret.steps.length >= 1 && ( + <> +

Steps to retrieve the credentials:

+ +
    + {secret.steps.map((step, index) => ( +
  1. + {step} +
  2. + ))} +
+ + )} + + {secret.footer} +
+ + ); + })} + +
+
+ ); +}; diff --git a/apps/docs/src/components/integrations/widgets.tsx b/apps/docs/src/components/integrations/widgets.tsx new file mode 100644 index 000000000..c39bc36e7 --- /dev/null +++ b/apps/docs/src/components/integrations/widgets.tsx @@ -0,0 +1,59 @@ +import { WidgetDefinition } from "@site/src/types"; +import { IconExternalLink, TablerIcon } from "@tabler/icons-react"; + +interface IntegrationCapabilitesProps { + items: ( + | { + widget: WidgetDefinition; + note?: string; + } + | { + capability: { + icon: TablerIcon; + name: string; + description: string; + path: string; + }; + note?: string; + } + )[]; +} + +export const IntegrationCapabilites = ({ items }: IntegrationCapabilitesProps) => { + return ( +
+
+ {items.map((item) => { + const capability = "widget" in item ? item.widget : item.capability; + + return ( +
+
+
+ +
+ +
+ {capability.name} + {capability.description} + {item.note && {item.note}} +
+
+ + + + Details + +
+ ); + })} +
+
+ ); +}; diff --git a/apps/docs/src/components/pages/about/code-contributors/code-contributor-list.tsx b/apps/docs/src/components/pages/about/code-contributors/code-contributor-list.tsx new file mode 100644 index 000000000..6d6993403 --- /dev/null +++ b/apps/docs/src/components/pages/about/code-contributors/code-contributor-list.tsx @@ -0,0 +1,31 @@ +import { useEffect, useState } from "react"; + +type Contributor = { + login: string; + avatar_url: string; +}; + +// do not add any real users here +const blacklistedUsernames = ["deepsource-autofix[bot]", "deepsource-io[bot]", "renovate[bot]", "dependabot[bot]"]; + +export const CodeContributorList = () => { + const [contributors, setContributors] = useState([]); + + useEffect(() => { + fetch("/data/contributions.json").then(async (response) => { + const data = await response.json(); + setContributors(data.filter((contributor: Contributor) => !blacklistedUsernames.includes(contributor.login))); + }); + }, []); + + return ( +
+ {contributors.map((contributor: Contributor) => ( +
+ {""} +
{contributor.login}
+
+ ))} +
+ ); +}; diff --git a/apps/docs/src/components/pages/about/translations-contributors/translation-constributor-list.tsx b/apps/docs/src/components/pages/about/translations-contributors/translation-constributor-list.tsx new file mode 100644 index 000000000..c4aabd223 --- /dev/null +++ b/apps/docs/src/components/pages/about/translations-contributors/translation-constributor-list.tsx @@ -0,0 +1,28 @@ +import { useEffect, useState } from "react"; + +type Contributor = { + username: string; + avatarUrl: string; +}; + +export const TranslationContributorList = () => { + const [contributors, setContributors] = useState([]); + + useEffect(() => { + fetch("/data/translation-contributions.json").then(async (response) => { + const data = await response.json(); + setContributors(data); + }); + }, []); + + return ( +
+ {contributors.map((contributor: Contributor) => ( +
+ {""} +
{contributor.username}
+
+ ))} +
+ ); +}; diff --git a/apps/docs/src/components/pages/home/container/section-container.tsx b/apps/docs/src/components/pages/home/container/section-container.tsx new file mode 100644 index 000000000..2055f75d9 --- /dev/null +++ b/apps/docs/src/components/pages/home/container/section-container.tsx @@ -0,0 +1,12 @@ +import { ReactNode } from "react"; + +interface SectionContainerProps { + children: ReactNode; + className?: string; +} + +export const SectionContainer = ({ children, className }: SectionContainerProps) => { + return ( +
{children}
+ ); +}; diff --git a/apps/docs/src/components/pages/home/dataflow/dataflow.tsx b/apps/docs/src/components/pages/home/dataflow/dataflow.tsx new file mode 100644 index 000000000..0c04cb279 --- /dev/null +++ b/apps/docs/src/components/pages/home/dataflow/dataflow.tsx @@ -0,0 +1,147 @@ +import React, { useRef } from "react"; + +import LeaderLine, { SocketType } from "leader-line-new"; + +export const DataflowVisualizationComponent = () => { + const homarrRef = useRef(null); + const sonarrRef = useRef(null); + const lidarrRef = useRef(null); + const radarrRef = useRef(null); + const jellyfinRef = useRef(null); + const plexRef = useRef(null); + const sabnzbdRef = useRef(null); + + return ( +
+

+ No YAML configurations. +
+ Easy and quick to manage integrations. +

+ +
+ {"Homarr + + {"Radarr"} + {"Sonarr"} + {"Lidarr"} + + {"Jellyfin"} + + {"Plex"} + + {"Sabnzbd"} + + + + + + + +
+
+ ); +}; + +export const LineTree = ({ + start, + end, + startSocket, + endSocket, + x = 0, +}: { + start: any; + end: any; + startSocket: SocketType; + endSocket: SocketType; + x?: number; +}) => { + const line = useRef(null); + let leaderLine: LeaderLine; + + React.useEffect(() => { + const drawLine = () => { + leaderLine = new LeaderLine(start.current, LeaderLine.pointAnchor(end.current, { x: `${x}%` }), { + startSocket: startSocket, + endSocket: endSocket, + color: "var(--ifm-color-primary)", + size: 3, + dash: { + animation: true, + }, + }); + }; + const timer = setInterval(() => { + if (start.current) { + clearInterval(timer); + drawLine(); + } + }, 5); + return () => { + timer && clearInterval(timer); + leaderLine.remove(); + }; + }, []); + + React.useEffect(() => { + // scroll and resize listeners could be assigned here + setTimeout(() => { + // skip current even loop and wait + // the end of parent's render call + if (line.current && end?.current) { + (line.current as any).position(); + } + }, 0); + }); + + return null; +}; diff --git a/apps/docs/src/components/pages/home/drag-and-drop/drag-and-drop-showcase.tsx b/apps/docs/src/components/pages/home/drag-and-drop/drag-and-drop-showcase.tsx new file mode 100644 index 000000000..b79c8de01 --- /dev/null +++ b/apps/docs/src/components/pages/home/drag-and-drop/drag-and-drop-showcase.tsx @@ -0,0 +1,26 @@ +import videoLight from "./showcase-light.mp4"; +import videoDark from "./showcase-dark.mp4"; +import { IconClick } from "@tabler/icons-react"; +import { SectionContainer } from "@site/src/components/pages/home/container/section-container"; +import { useColorMode } from "@docusaurus/theme-common"; + +export const DragAndDropShowcase = () => { + const { colorMode } = useColorMode(); + const video = colorMode === "dark" ? videoDark : videoLight; + return ( +
+ +

Easy setup using drag and drop

+ +
+
+
+
+ ); +}; diff --git a/apps/docs/src/components/pages/home/drag-and-drop/showcase-dark.mp4 b/apps/docs/src/components/pages/home/drag-and-drop/showcase-dark.mp4 new file mode 100644 index 000000000..eba8f7321 Binary files /dev/null and b/apps/docs/src/components/pages/home/drag-and-drop/showcase-dark.mp4 differ diff --git a/apps/docs/src/components/pages/home/drag-and-drop/showcase-light.mp4 b/apps/docs/src/components/pages/home/drag-and-drop/showcase-light.mp4 new file mode 100644 index 000000000..359fccc3e Binary files /dev/null and b/apps/docs/src/components/pages/home/drag-and-drop/showcase-light.mp4 differ diff --git a/apps/docs/src/components/pages/home/features/features.tsx b/apps/docs/src/components/pages/home/features/features.tsx new file mode 100644 index 000000000..aaa77aaf6 --- /dev/null +++ b/apps/docs/src/components/pages/home/features/features.tsx @@ -0,0 +1,78 @@ +import React from "react"; +import { + IconAdjustments, + IconDragDrop, + IconIcons, + IconKey, + IconLanguage, + IconPlug, + TablerIcon, +} from "@tabler/icons-react"; + +interface Feature { + icon: TablerIcon; + title: string; + content: string; +} + +const featureList: Feature[] = [ + { + icon: IconDragDrop, + title: "Easy to use drag and drop system", + content: + "Using the drag and drop system, you can simply move parts of your dashboard using your mouse or your finger on mobile devices. No YAML / JSON configurations are involved.", + }, + { + icon: IconIcons, + title: "Over 10K icons available", + content: + "We integrate with many different icon repositories to provide you with high quality and easy to use images.", + }, + { + icon: IconPlug, + title: "Seamless integrations", + content: + "Integrate with your favourite applications to display their status or control them. Scales well with hundreds of users. Robust background job system enables high performance & scalability.", + }, + { + icon: IconKey, + title: "Authentication & Authorization built in", + content: "Support for credentials authentication, OIDC and LDAP. Complex system to manage permissions for users", + }, + { + icon: IconLanguage, + title: "26 languages available", + content: "Accessible for users in many countries thanks to the community translation program", + }, + { + icon: IconAdjustments, + title: "Detailed settings for customization", + content: "Adjust apps and dashboards until you like them with helpful and easy to understand settings", + }, +]; + +function FeatureComponent(props: Feature) { + return ( +
+
+
+ +
+
+

{props.title}

+

{props.content}

+
+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+ {featureList.map((props, idx) => ( + + ))} +
+ ); +} diff --git a/apps/docs/src/components/pages/home/hero/hero-cards.tsx b/apps/docs/src/components/pages/home/hero/hero-cards.tsx new file mode 100644 index 000000000..a0c8df1d6 --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/hero-cards.tsx @@ -0,0 +1,22 @@ +import { AppWidget } from "./widgets/app-widget"; +import { ClockWidget } from "./widgets/clock-widget"; +import { DownloadsWidget } from "./widgets/downloads-widget"; +import { WeatherWidget } from "./widgets/weather-widget"; +import { StockWidget } from "./widgets/stock-widget"; +import { EntityStateWidget } from "./widgets/entity-state-widget"; + +export const HeroCards = () => { + return ( +
+ + + + + + + + + +
+ ); +}; diff --git a/apps/docs/src/components/pages/home/hero/hero.tsx b/apps/docs/src/components/pages/home/hero/hero.tsx new file mode 100644 index 000000000..b6519862e --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/hero.tsx @@ -0,0 +1,66 @@ +import Link from "@docusaurus/Link"; +import { IconDownload, IconExternalLink } from "@tabler/icons-react"; +import clsx from "clsx"; +import styles from "../../../../pages/index.module.css"; +import { HeroCards } from "./hero-cards"; + +export default function HomeHero() { + return ( +
+
+
+

+ A simple, yet +
+ powerful dashboard +
+ for your server. +

+

+ A sleek, modern dashboard that puts all of your apps and services at your fingertips. Control everything in + one convenient location. Seamlessly integrates with the apps you've added, providing you with valuable + information. +

+ +
+ +
+ Install + +
+ + +
+ Try Demo + +
+ + +
+ {"Pika + Host from $2.3/month +
+ +
+
+
+ +
+
+
+ ); +} diff --git a/apps/docs/src/components/pages/home/hero/widgets/app-widget.tsx b/apps/docs/src/components/pages/home/hero/widgets/app-widget.tsx new file mode 100644 index 000000000..88b80e446 --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/widgets/app-widget.tsx @@ -0,0 +1,20 @@ +import { supportedIntegrations } from "@site/src/constants/supported-integrations"; +import { CommonWidgetProps, WidgetCard } from "./card"; +import { getRndInteger } from "@site/src/tools/math"; +import clsx from "clsx"; + +export const AppWidget = ({ className }: CommonWidgetProps) => { + const randomApp = supportedIntegrations[getRndInteger(0, supportedIntegrations.length - 1)]; + + return ( + + {randomApp.name} + {`${randomApp.name} +
+
+ ); +}; diff --git a/apps/docs/src/components/pages/home/hero/widgets/card.tsx b/apps/docs/src/components/pages/home/hero/widgets/card.tsx new file mode 100644 index 000000000..4ecab5762 --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/widgets/card.tsx @@ -0,0 +1,33 @@ +import clsx from "clsx"; +import { ReactNode } from "react"; + +export interface CommonWidgetProps { + className?: string; +} + +interface WidgetCardProps extends CommonWidgetProps { + width: 1 | 2; + children: ReactNode; + onClick?: () => void; +} +export const WidgetCard = ({ width, children, className, onClick }: WidgetCardProps) => { + const Component = onClick ? "button" : "div"; + + return ( + + {children} + + ); +}; diff --git a/apps/docs/src/components/pages/home/hero/widgets/clock-widget.tsx b/apps/docs/src/components/pages/home/hero/widgets/clock-widget.tsx new file mode 100644 index 000000000..6a08d45a9 --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/widgets/clock-widget.tsx @@ -0,0 +1,12 @@ +import dayjs from "dayjs"; +import { CommonWidgetProps, WidgetCard } from "./card"; +import clsx from "clsx"; + +export const ClockWidget = ({ className }: CommonWidgetProps) => { + return ( + + {dayjs().format("HH:mm")} + {dayjs().format("dd, MMM. DD")} + + ); +}; diff --git a/apps/docs/src/components/pages/home/hero/widgets/downloads-widget.tsx b/apps/docs/src/components/pages/home/hero/widgets/downloads-widget.tsx new file mode 100644 index 000000000..929017ba0 --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/widgets/downloads-widget.tsx @@ -0,0 +1,75 @@ +import { getRndInteger } from "@site/src/tools/math"; +import { useEffect, useState } from "react"; +import { CommonWidgetProps, WidgetCard } from "./card"; +import clsx from "clsx"; +import { generateSlug } from "random-word-slugs"; + +export const DownloadsWidget = ({ className }: CommonWidgetProps) => { + const [downloads, setDownloads] = useState([]); + + useEffect(() => { + const intervalId = setInterval(() => { + setDownloads((prev: Download[]) => { + const filteredPrev = prev.filter((download) => download.progress !== 100); + + filteredPrev.forEach((download, index) => { + download.progress = Math.min(100, download.progress + getRndInteger(0, index < 2 ? 16 : 8)); + }); + + if (filteredPrev.length < 3 && filteredPrev.length === prev.length) { + filteredPrev.push(generateRandomDownload()); + } + + return [...filteredPrev]; + }); + }, 500); + + return () => { + clearInterval(intervalId); + }; + }, []); + + return ( + + + + + + + + + + {downloads.map((file: Download, index: number) => { + return ( + + + + + ); + })} + +
FileProgress
{file.filename} +
+
+
+
+
+ ); +}; + +interface Download { + filename: string; + progress: number; +} + +const formats = ["mkv", "mp4"]; + +const generateRandomDownload = (): Download => { + const randomMovie = generateSlug(2); + const randomFormat = formats[getRndInteger(0, formats.length - 1)]; + + return { + filename: `${randomMovie}.${randomFormat}`, + progress: 0, + }; +}; diff --git a/apps/docs/src/components/pages/home/hero/widgets/entity-state-widget.tsx b/apps/docs/src/components/pages/home/hero/widgets/entity-state-widget.tsx new file mode 100644 index 000000000..ba66f997c --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/widgets/entity-state-widget.tsx @@ -0,0 +1,18 @@ +import { useColorMode } from "@docusaurus/theme-common"; +import { CommonWidgetProps, WidgetCard } from "./card"; +import clsx from "clsx"; + +export const EntityStateWidget = ({ className }: CommonWidgetProps) => { + const colorMode = useColorMode(); + + return ( + colorMode.setColorMode(colorMode.isDarkTheme ? "light" : "dark")} + > + Lights + {colorMode.isDarkTheme ? "OFF" : "ON"} + + ); +}; diff --git a/apps/docs/src/components/pages/home/hero/widgets/stock-widget.tsx b/apps/docs/src/components/pages/home/hero/widgets/stock-widget.tsx new file mode 100644 index 000000000..5b06dfb30 --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/widgets/stock-widget.tsx @@ -0,0 +1,76 @@ +import { Line } from "@nivo/line"; +import { IconTrendingDown, IconTrendingUp } from "@tabler/icons-react"; +import clsx from "clsx"; +import { useEffect, useState } from "react"; +import { CommonWidgetProps, WidgetCard } from "./card"; + +export const StockWidget = ({ className }: CommonWidgetProps) => { + const [stockTrend, setStockTrend] = useState<{ x: number; y: number }[]>(generateStockTrend()); + + useEffect(() => { + const interval = setInterval(() => { + setStockTrend(generateStockTrend()); + }, 15 * 1000); + + return () => { + clearInterval(interval); + }; + }, []); + + const upwardTrend = stockTrend[0].y < stockTrend[stockTrend.length - 1].y; + + return ( + +
+ {upwardTrend && } + {!upwardTrend && } + HOMR +
+ +
{stockTrend[0].y}
+
+ ); +}; + +const generateStockTrend = () => { + const data = []; + let y = 100; // Starting price + let trend = 1; // 1 for upward trend, -1 for downward trend + let trendDuration = Math.floor(Math.random() * 10) + 5; // Random trend duration between 5 and 15 + + for (let x = 0; x < 100; x++) { + if (trendDuration === 0) { + trend = Math.random() > 0.5 ? 1 : -1; // Randomly switch trend + trendDuration = Math.floor(Math.random() * 10) + 5; + } + + let change = (Math.random() - 0.5) * 2; // Smaller fluctuations + y += (change + 0.5) * trend; // Apply trend bias + trendDuration--; + + data.push({ x, y: parseFloat(y.toFixed(2)) }); + } + + return data; +}; diff --git a/apps/docs/src/components/pages/home/hero/widgets/weather-widget.tsx b/apps/docs/src/components/pages/home/hero/widgets/weather-widget.tsx new file mode 100644 index 000000000..da7e58a87 --- /dev/null +++ b/apps/docs/src/components/pages/home/hero/widgets/weather-widget.tsx @@ -0,0 +1,28 @@ +import { IconCloud, IconWind, IconArrowUpRight, IconArrowDownRight } from "@tabler/icons-react"; +import { CommonWidgetProps, WidgetCard } from "./card"; +import clsx from "clsx"; + +export const WeatherWidget = ({ className }: CommonWidgetProps) => { + return ( + +
+ + 10.8°C +
+
+ + 5 km/h +
+
+
+ + 13.5°C +
+
+ + 6.4°C +
+
+
+ ); +}; diff --git a/apps/docs/src/components/pages/home/integrations/available-integrations.module.css b/apps/docs/src/components/pages/home/integrations/available-integrations.module.css new file mode 100644 index 000000000..a9c057d1c --- /dev/null +++ b/apps/docs/src/components/pages/home/integrations/available-integrations.module.css @@ -0,0 +1,20 @@ +@keyframes scrolling { + 0% { + transform: translateY(0); + } + 100% { + transform: translateY(-50.8%); + } +} + +.scrollAnimationContainer { + animation: scrolling; + animation-timing-function: linear; + animation-iteration-count: infinite; +} + +@media (prefers-reduced-motion: reduce) { + .scrollAnimationContainer { + animation: none !important; + } +} \ No newline at end of file diff --git a/apps/docs/src/components/pages/home/integrations/available-integrations.tsx b/apps/docs/src/components/pages/home/integrations/available-integrations.tsx new file mode 100644 index 000000000..d00feeb00 --- /dev/null +++ b/apps/docs/src/components/pages/home/integrations/available-integrations.tsx @@ -0,0 +1,68 @@ +import { splitToNChunks } from "@site/src/tools/array"; +import classes from "./available-integrations.module.css"; +import { SectionContainer } from "@site/src/components/pages/home/container/section-container"; +import { supportedIntegrations } from "@site/src/constants/supported-integrations"; + +const countIconGroups = 3; +const animationDurationInSeconds = 12; + +export const AvailableIntegrations = () => { + const arrayInChunks = splitToNChunks( + supportedIntegrations.map((integration) => integration.iconUrl), + countIconGroups, + ); + + return ( + +
+
+
+

Many integrations built in

+

+ Homarr has support for tons of your favourite applications, tools and websites. It integrates seamlessly + and tests proper connectivity and configuration for you. Using the tasks system, it scales efficiently + with tons of users, making Homarr reliable in big scale deployments too. +

+
+ +
+
+
+ ); +}; diff --git a/apps/docs/src/components/pages/home/review-list/review-list.tsx b/apps/docs/src/components/pages/home/review-list/review-list.tsx new file mode 100644 index 000000000..0017c1ad9 --- /dev/null +++ b/apps/docs/src/components/pages/home/review-list/review-list.tsx @@ -0,0 +1,109 @@ +import React from "react"; + +const reviews = [ + { + username: "Maeglin", + profilePicture: "/img/pictures/reviews/maeglin.webp", + fullText: + "Day 49/100 set up Homarr just for a test spin. It's a nice dashboard and the Arrs integration especialy the calendar is awesome.", + link: "https://twitter.com/Maeglin931/status/1555725442744586240", + }, + { + username: "Noted", + profilePicture: "https://noted.lol/content/images/size/w256h256/2023/08/Icon-1.2-1.png", + fullText: "Homarr - A Simple, Self Hosted and Lightweight Server Homepage", + link: "https://noted.lol/homarr-a-simple-self-hosted-and-lightweight-server-homepage/", + }, + { + username: "IBRACORP", + profilePicture: "/img/pictures/reviews/ibracorp.webp", + fullText: "Homarr Is Here To Stay. Here's Why | Selfhosted Homepage", + link: "https://www.youtube.com/watch?v=Mk9ZZiH5qi0", + }, + { + username: "The Geek Freaks", + profilePicture: + "https://yt3.ggpht.com/6EWnfiBIE7Bus2MAS6zJsBARQTPWE7B3v7PXdwX1OfohaxylMqdQr-vt4j8gYZTJy2MBiOvu=s500-c-k-c0x00ffffff-no-rj", + fullText: "MEHR Durchblick mit eigenem Dashboard! (Unraid Homarr Tutorial) ", + link: "https://www.youtube.com/watch?v=DNGRL5QdBlg", + }, + + { + username: "u/uncmnsense", + profilePicture: "/img/pictures/reviews/r_selfhosted.webp", + fullText: "Anyone using homarr? check it out, its pretty fancy...", + link: "https://www.reddit.com/r/selfhosted/comments/wqxsk3/anyone_using_homarr_check_it_out_its_pretty_fancy", + }, + { + username: "TechHut", + profilePicture: + "https://yt3.ggpht.com/TUoF-6QCUIKy6XgFtMG5FWi5FLVhtaUPtTOLvE7Ca3eJif1_RKBci07fKK-QvKxhC0HALEBH7Q=s500-c-k-c0x00ffffff-no-rj", + fullText: "my FAVORITE Home Server Dashboard - Homarr Setup in Docker", + link: "https://www.youtube.com/watch?v=A6vcTIzp_Ww", + }, + { + username: "u/RoachedCoach", + profilePicture: "/img/pictures/reviews/r_unraid.webp", + fullText: "I enjoy Homarr - mostly because it's very simple, straightforward, and attractive.", + link: "https://www.reddit.com/r/unRAID/comments/wk3x2s/comment/ijn4vpg/", + }, + { + username: "Mariushosting", + link: "https://mariushosting.com/synology-install-homarr-with-portainer/", + fullText: + "The thing I like most about Homarr is its speed and simplicity in adding links of your favorite docker apps. You can use it as a bookmark as well. Great integration with Plex, Sonarr, Radarr etc. Homarr supports multiple configs and persistent storage.", + profilePicture: "https://mariushosting.com/wp-content/uploads/2021/05/cropped-mariushosting512-192x192.png", + }, + { + username: "u/YankeesIT", + profilePicture: "/img/pictures/reviews/r_selfhosted.webp", + fullText: "My Homarr setup...", + link: "https://www.reddit.com/r/selfhosted/comments/x84c9v/my_homarr_setup/", + }, + { + username: "Selfhosted Corner", + profilePicture: "https://pbs.twimg.com/profile_banners/1674813613650120705/1691340056/600x200", + fullText: + "So you have many different #Selfhosted apps and you are having trouble organizing them? Fear not cause homarr is here is to save you the hassle.", + link: "https://twitter.com/SlhstdCorner/status/1698674826351685648", + }, +]; + +export default function HomepageUserReviews() { + return ( +
+

Community

+

+ We have a big and active community, which regularly contributes new features & integrations to Homarr. Our + community translation program and modularity end extendability in the code makes it easy to contribute and + extend Homarr. +

+ +
+ {reviews.map((review) => ( + + ))} +
+
+ ); +} diff --git a/apps/docs/src/components/pages/home/review-list/styles.module.css b/apps/docs/src/components/pages/home/review-list/styles.module.css new file mode 100644 index 000000000..5cff5a7d2 --- /dev/null +++ b/apps/docs/src/components/pages/home/review-list/styles.module.css @@ -0,0 +1,18 @@ +.swiperText { + text-align: center; + font-size: 2.7rem; + margin-bottom: 50px; +} + + + +.communityFeedbackPlaceholderImage { + display: block; + margin: 0 auto; +} + +.communityFeedbackPlaceholderText { + text-align: center; +} + + diff --git a/apps/docs/src/components/pages/installation/docker/dynamic-docker-install.tsx b/apps/docs/src/components/pages/installation/docker/dynamic-docker-install.tsx new file mode 100644 index 000000000..694a009ca --- /dev/null +++ b/apps/docs/src/components/pages/installation/docker/dynamic-docker-install.tsx @@ -0,0 +1,55 @@ +import type React from "react"; +import CodeBlock from "@theme/CodeBlock"; +import Admonition from "@theme/Admonition"; +import { useEffect, useState } from "react"; + +const generateRandomHex = (length = 64): string => { + const array = new Uint8Array(length / 2); + crypto.getRandomValues(array); + return Array.from(array, (byte) => byte.toString(16).padStart(2, "0")).join(""); +}; + +export const DockerInstallSnippet: React.FC = () => { + const [randomHex, setRandomHex] = useState(""); + const generateNewHex = () => { + setRandomHex(generateRandomHex()); + }; + + useEffect(() => { + generateNewHex(); + }, []); + + return ( +
+

+ First, create a docker-compose.yml file with the following content: +

+ + {`#---------------------------------------------------------------------# +# Homarr - A simple, yet powerful dashboard for your server. # +#---------------------------------------------------------------------# +services: + homarr: + container_name: homarr + image: ghcr.io/homarr-labs/homarr:latest + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration + - ./homarr/appdata:/appdata + environment: + - SECRET_ENCRYPTION_KEY=${randomHex} + ports: + - '7575:7575' + `} + + + Key provided above for the SECRET_ENCRYPTION_KEY environment variable is randomly generated using + your browser cryotography API. It will be different every time You can generate one yourself using{" "} + openssl rand -hex 32 + + +
+ ); +}; diff --git a/apps/docs/src/components/ui/badge.tsx b/apps/docs/src/components/ui/badge.tsx new file mode 100644 index 000000000..5776a59c3 --- /dev/null +++ b/apps/docs/src/components/ui/badge.tsx @@ -0,0 +1,13 @@ +import { ReactNode } from "react"; + +interface BadgeProps { + children: ReactNode; +} + +export const Badge = ({ children }: BadgeProps) => { + return ( + + {children} + + ); +}; diff --git a/apps/docs/src/components/ui/header.tsx b/apps/docs/src/components/ui/header.tsx new file mode 100644 index 000000000..5e99e0cff --- /dev/null +++ b/apps/docs/src/components/ui/header.tsx @@ -0,0 +1,29 @@ +import { ReactNode } from "react"; +import { Badge } from "../ui/badge"; + +interface DocsHeaderProps { + title: string; + description: string; + icon: ReactNode; + categories: string[]; +} + +export const DocsHeader = (props: DocsHeaderProps) => { + return ( +
+ {props.icon} + +
+
+

{props.title}

+
+ {props.categories.map((category) => ( + {category} + ))} +
+
+

{props.description}

+
+
+ ); +}; diff --git a/apps/docs/src/components/widgets/adding.tsx b/apps/docs/src/components/widgets/adding.tsx new file mode 100644 index 000000000..e0bd2ef0f --- /dev/null +++ b/apps/docs/src/components/widgets/adding.tsx @@ -0,0 +1,9 @@ +export const AddingWidget = () => { + return ( +

+ You can find how to add the widget on the{" "} + Widgets{" "} + documentation page. +

+ ); +}; diff --git a/apps/docs/src/components/widgets/configuration.tsx b/apps/docs/src/components/widgets/configuration.tsx new file mode 100644 index 000000000..c3bc457c5 --- /dev/null +++ b/apps/docs/src/components/widgets/configuration.tsx @@ -0,0 +1,87 @@ +import { WidgetConfiguration, WidgetConfigurationItem } from "@site/src/types"; + +interface WidgetConfigProps { + configuration: WidgetConfiguration; +} + +export const WidgetConfig = (props: WidgetConfigProps) => { + const innerConfigs = getInnerConfigs(props.configuration); + + return ( +
+ + + {innerConfigs.map((item) => ( + <> +

{item.name}

+ + + + ))} +
+ ); +}; + +const ConfigTable = (props: WidgetConfigProps) => { + return ( + + + + + + + + + + + {props.configuration.items.map((item, index) => ( + + + + + + + ))} + +
NameDescriptionValuesDefault value
{item.name}{item.description} + + {item.defaultValue}
+ ); +}; + +const ConfigValues = ({ values }: Pick) => { + if (typeof values === "string") return {values}; + if (values.type === "boolean") return yes / no; + if (values.type === "string") return String; + if (values.type === "select") { + return ( +
    + {values.options.map((option) => ( +
  • {option}
  • + ))} +
+ ); + } + + const reference = {values.name}; + if (values.type === "object") return reference; + if (values.type === "array") return {reference}[]; +}; + +const getInnerConfigs = (config: WidgetConfiguration) => { + const configItems: Extract[] = []; + config.items.forEach((item) => { + if ( + item.values && + typeof item.values === "object" && + (item.values.type === "object" || item.values.type === "array") + ) { + configItems.push(item.values); + const innerItems = getInnerConfigs(item.values.configuration); + if (innerItems.length > 0) { + configItems.push(...innerItems); + } + } + }); + return configItems; +}; diff --git a/apps/docs/src/components/widgets/header.tsx b/apps/docs/src/components/widgets/header.tsx new file mode 100644 index 000000000..6f1cbebc6 --- /dev/null +++ b/apps/docs/src/components/widgets/header.tsx @@ -0,0 +1,22 @@ +import { DocsHeader } from "../ui/header"; +import { WidgetDefinition } from "@site/src/types"; + +interface WidgetHeaderProps { + widget: WidgetDefinition; + categories: string[]; +} + +export const WidgetHeader = (props: WidgetHeaderProps) => { + return ( + + +
+ } + categories={props.categories} + /> + ); +}; diff --git a/apps/docs/src/components/widgets/integrations.tsx b/apps/docs/src/components/widgets/integrations.tsx new file mode 100644 index 000000000..28500f6c3 --- /dev/null +++ b/apps/docs/src/components/widgets/integrations.tsx @@ -0,0 +1,52 @@ +import { useColorMode } from "@docusaurus/theme-common"; +import { IntegrationDefinition } from "@site/src/types"; +import { IconExternalLink } from "@tabler/icons-react"; +import { getIntegrationIconUrl } from "../integrations/header"; + +interface WidgetIntegrationsProps { + items: { + integration: IntegrationDefinition; + note?: string; + }[]; +} + +export const WidgetIntegrations = ({ items }: WidgetIntegrationsProps) => { + const { isDarkTheme } = useColorMode(); + + return ( +
+
+ {items.map((item) => ( +
+
+ {`${item.integration.name} + +
+ {item.integration.name} + {item.integration.description} + {item.note && {item.note}} +
+
+ + + + Details + +
+ ))} +
+
+ ); +}; diff --git a/apps/docs/src/constants/supported-integrations.tsx b/apps/docs/src/constants/supported-integrations.tsx new file mode 100644 index 000000000..93910a56b --- /dev/null +++ b/apps/docs/src/constants/supported-integrations.tsx @@ -0,0 +1,33 @@ +export const supportedIntegrations = [ + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/homarr.svg", name: "Homarr" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/sabnzbd.svg", name: "SABnzbd" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/deluge.svg", name: "Deluge" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/radarr.svg", name: "Radarr" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/sonarr.svg", name: "Sonarr" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/lidarr.svg", name: "Lidarr" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/pihole.svg", name: "PiHole" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/dashdot.png", name: "Dashdot" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/overseerr.svg", name: "Overseerr" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/plex.svg", name: "Plex" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/jellyfin.svg", name: "Jellyfin" }, + { + iconUrl: "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/homeassistant.svg", + name: "Homeassistant", + }, + { iconUrl: "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/freshrss.svg", name: "FreshRSS" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/readarr.svg", name: "Readarr" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/transmission.svg", name: "Transmission" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/qbittorrent.svg", name: "qBittorrent" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/nzbget.png", name: "NZBGet" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/openmediavault.svg", name: "Openmediavault" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/docker.svg", name: "docker" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/jellyseerr.svg", name: "Jellyseerr" }, + { + iconUrl: "https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/adguardhome.svg", + name: "AdguardHome", + }, + { iconUrl: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/technitium.svg", name: "Technitium" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/tdarr.png", name: "Tdarr" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/prowlarr.svg", name: "Prowlarr" }, + { iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/svg/ical.svg", name: "iCal" }, +]; diff --git a/apps/docs/src/css/custom.css b/apps/docs/src/css/custom.css new file mode 100644 index 000000000..e6ab6406f --- /dev/null +++ b/apps/docs/src/css/custom.css @@ -0,0 +1,200 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@import url(https://api.fontshare.com/v2/css?f[]=work-sans@2,1&display=swap); + +:root { + --ifm-color-primary: #fa5252; + --ifm-color-primary-dark: #f93232; + --ifm-color-primary-darker: #f92222; + --ifm-color-primary-darkest: #d20606; + --ifm-color-primary-light: #fb7272; + --ifm-color-primary-lighter: #fb8282; + --ifm-color-primary-lightest: #fdc3c3; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + --homarr-secondary-bg: #e8e8e8; + + --aa-primary-color-rgb: #fa5252 !important; + --aa-muted-color-rgb: #fa5252 !important; + --aa-background-color-rgb: 200,200,200 !important; + + --ifm-font-family-base: 'Work Sans', sans-serif; + --ifm-color-content-inverse: var(--ifm-color-emphasis-100); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #fa5252; + --ifm-color-primary-dark: #f93232; + --ifm-color-primary-darker: #f92222; + --ifm-color-primary-darkest: #d20606; + --ifm-color-primary-light: #fb7272; + --ifm-color-primary-lighter: #fb8282; + --ifm-color-primary-lightest: #fdc3c3; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + --homarr-secondary-bg: #181818; + --ifm-color-content-inverse: var(--ifm-color-emphasis-100); + + + --aa-primary-color-rgb: #fa5252 !important; + --aa-muted-color-rgb: #fa5252 !important; + --aa-background-color-rgb: 24,24,24 !important; +} + +.aa-DetachedOverlay { + backdrop-filter: blur(10px) brightness(0.5); +} + +.aa-DetachedContainer { + box-shadow: none !important; +} + +.navbar__logo { + margin-right: 1rem; +} + +.swiper-slide { + width: initial !important; + height: auto !important; + padding-bottom: 40px; +} + +.swiper-pagination { + position: absolute; + bottom: 0; +} + +.swiper-pagination-bullet-active { + background-color: var(--ifm-color-primary) !important; +} + +.footer { + background-color: var(--homarr-secondary-bg) !important; +} + +.footer__copyright span.copyright_text { + opacity: .6; +} + +.medium-zoom-overlay { + background-color: var(--ifm-color-primary-lighter) !important; +} + +.medium-zoom-image { + border-radius: 0.5rem; +} + +.menu__list { + transition: all 0.s ease-in-out !important; +} + +.announcementBar_node_modules-\@docusaurus-theme-classic-lib-theme-AnnouncementBar-styles-module { + background-color: transparent !important; + background-image: radial-gradient(circle, rgb(253, 126, 20) 0%, rgb(250, 82, 82) 100%) !important; + font-weight: 600; +} + +.medium-zoom-overlay { + background-color: transparent !important; + backdrop-filter: blur(10px) brightness(0.7); +} + +.navbar__inner .navbar__items a.navbar__item, +.navbar__inner .navbar__items div.navbar__item.dropdown { + white-space: nowrap; +} + +/*.navbar__items.navbar__items--right .navbar__item.navbar__link:first-of-type { + background-color: var(--ifm-color-primary-light) !important; + border-radius: 30px; +} + +.navbar__items.navbar__items--right .navbar__item.navbar__link:first-of-type:hover { + background-color: var(--ifm-color-primary) !important; + color: var(--ifm-navbar-link-color) !important; +}*/ + +html[data-theme="dark"] div#__docusaurus div[role="banner"] { + background-color: #1b1b1d; + color: #c1c1c1; +} + +html[data-theme="dark"] div#__docusaurus div[role="banner"] button svg { + color: white; +} + +.navbar__inner a.navbar__brand { + font-size: 22px; + color: var(--ifm-color-primary); +} + +:is(p, h3, h4, h5, h6):has(+ :is(ul, ol)){ + margin-bottom: 4px !important; +} + +.table-of-contents__left-border { + border-left: none !important; +} + +.thin-scrollbar.theme-doc-toc-desktop { + background-color: var(--ifm-navbar-background-color); + border-radius: 20px; +} + +.table-of-contents__link--active { + font-weight: bold !important; +} + +.pagination-nav__link { + background-color: var(--ifm-navbar-background-color); + border: 4px transparent solid; +} + +.row.theme-doc-footer-tags-row ul li a { + border: none; + background-color: var(--ifm-navbar-background-color); + border-radius: 20px; + padding: 6px 12px; +} + + +.hero-cards { + transform: rotate(20deg) scale(0.8) skew(21deg); + -webkit-transform: rotate(20deg) scale(0.8) skew(21deg); + -moz-transform: rotate(20deg) scale(0.8) skew(21deg); +} + +.animated-width { + transition: width 0.3s ease-in-out; +} + +.app-card { + cursor: not-allowed; +} + +.app-card img { + transition: transform 0.1s ease-in-out; +} + +.app-card:hover img { + transform: scale(1.08) !important; +} + +.hover-animation { + animation: hover-animation 5s ease-in-out forwards; + animation-iteration-count: infinite; +} + +@keyframes hover-animation { + 0% { + transform: translateY(0); + } + 50% { + transform: translateY(10px); + } + 100% { + transform: translateY(0); + } +} diff --git a/apps/docs/src/declarations.d.ts b/apps/docs/src/declarations.d.ts new file mode 100644 index 000000000..b04521d48 --- /dev/null +++ b/apps/docs/src/declarations.d.ts @@ -0,0 +1,25 @@ +declare module "*.mp4" { + const src: string; + export default src; +} + +declare module "@theme/Tabs" { + import type { ComponentProps, ReactNode } from "react"; + interface Props extends ComponentProps<"div"> { + children: ReactNode; + className?: string; + } + export default function Tabs(props: Props): JSX.Element; +} + +declare module "@theme/TabItem" { + import type { ReactNode } from "react"; + interface Props { + children: ReactNode; + value: string; + label?: ReactNode; + className?: string; + key?: string; + } + export default function TabItem(props: Props): JSX.Element; +} diff --git a/apps/docs/src/pages/about-us/index.tsx b/apps/docs/src/pages/about-us/index.tsx new file mode 100644 index 000000000..1a8edf079 --- /dev/null +++ b/apps/docs/src/pages/about-us/index.tsx @@ -0,0 +1,32 @@ +import Layout from "@theme/Layout"; +import React from "react"; +import { CodeContributorList } from "@site/src/components/pages/about/code-contributors/code-contributor-list"; +import { TranslationContributorList } from "@site/src/components/pages/about/translations-contributors/translation-constributor-list"; + +export default function AboutUs() { + return ( + +
+

About us

+

+ Homarr is a community driven open source project that is being maintained by volunteers. Thanks to these + people, Homarr has been a growing project since 2021. Our team is working completely remote from many + different countries on Homarr in their leisure time for no compensation. +

+ +

Code contributions

+ + + +

Translation contributions

+ + +
+
+ ); +} diff --git a/apps/docs/src/pages/carbon-test.tsx b/apps/docs/src/pages/carbon-test.tsx new file mode 100644 index 000000000..b52f156d5 --- /dev/null +++ b/apps/docs/src/pages/carbon-test.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import Layout from "@theme/Layout"; +import { CarbonCoverStrict, CarbonCoverObserver, CarbonCoverCssOnlySecond } from "../components/carbon"; + +export default function CarbonTestPage() { + return ( + +
+

Carbon Ads Test

+

Compare three implementations to only show the cover unit.

+ +
+

1) Strict re-initialization

+ +
+ +
+

2) Observer trimming

+ +
+ +
+

3) CSS-only (hide first, keep cover)

+ +
+
+
+ ); +} diff --git a/apps/docs/src/pages/index.module.css b/apps/docs/src/pages/index.module.css new file mode 100644 index 000000000..baeb80f6d --- /dev/null +++ b/apps/docs/src/pages/index.module.css @@ -0,0 +1,41 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. +*/ + +section { + margin-bottom: 2rem; +} + +.heroWave { + width: 100%; + height: 125px; +} + +.hero h2 { + font-size: 2rem; +} + +.hero p { + font-weight: 500; +} + +.heroImage { + display: block; + margin-left: auto; + border-radius: 6px; + max-width: min(100%, 500px); +} + + +.heroBanner { + padding: 4rem; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} diff --git a/apps/docs/src/pages/index.tsx b/apps/docs/src/pages/index.tsx new file mode 100644 index 000000000..7f5426c10 --- /dev/null +++ b/apps/docs/src/pages/index.tsx @@ -0,0 +1,49 @@ +import React from "react"; + +import Layout from "@theme/Layout"; + +import HomepageFeatures from "../components/pages/home/features/features"; +import HomepageUserReviews from "../components/pages/home/review-list/review-list"; +import HomeHero from "../components/pages/home/hero/hero"; + +import styles from "./index.module.css"; +import BrowserOnly from "@docusaurus/BrowserOnly"; +import { SectionContainer } from "@site/src/components/pages/home/container/section-container"; +import { DragAndDropShowcase } from "@site/src/components/pages/home/drag-and-drop/drag-and-drop-showcase"; +import { AvailableIntegrations } from "@site/src/components/pages/home/integrations/available-integrations"; + +export default function Home() { + return ( + + + + + + + + + + loading...}> + {() => { + const DataflowVisualizationComponent = + require("../components/pages/home/dataflow/dataflow").DataflowVisualizationComponent; + return ; + }} + + + + + + + + ); +} diff --git a/apps/docs/src/theme/NotFound.js b/apps/docs/src/theme/NotFound.js new file mode 100644 index 000000000..712321df2 --- /dev/null +++ b/apps/docs/src/theme/NotFound.js @@ -0,0 +1,50 @@ +import React from "react"; +import Translate, { translate } from "@docusaurus/Translate"; +import { PageMetadata } from "@docusaurus/theme-common"; +import Layout from "@theme/Layout"; + +export default function NotFound() { + return ( + <> + + +
+
+
+ + +

+ + You found a dead link! + +

+

+ + Oops, you got a dead link. This means, that the page you're looking for is either not available or has + been deleted. We're sorry for the inconvenience. If you believe, that this page should be reachable, + check your URL for any typos. + +

+
+
+
+
+ + ); +} diff --git a/apps/docs/src/theme/TOC/index.tsx b/apps/docs/src/theme/TOC/index.tsx new file mode 100644 index 000000000..e23a409c0 --- /dev/null +++ b/apps/docs/src/theme/TOC/index.tsx @@ -0,0 +1,21 @@ +import React, { type ReactNode } from "react"; +import clsx from "clsx"; +import TOCItems from "@theme/TOCItems"; +import type { Props } from "@theme/TOC"; + +import styles from "./styles.module.css"; +import { Carbon } from "@site/src/components/carbon"; + +// Using a custom className +// This prevents TOCInline/TOCCollapsible getting highlighted by mistake +const LINK_CLASS_NAME = "table-of-contents__link toc-highlight"; +const LINK_ACTIVE_CLASS_NAME = "table-of-contents__link--active"; + +export default function TOC({ className, ...props }: Props): ReactNode { + return ( +
+ + +
+ ); +} diff --git a/apps/docs/src/theme/TOC/styles.module.css b/apps/docs/src/theme/TOC/styles.module.css new file mode 100644 index 000000000..4b5d9f462 --- /dev/null +++ b/apps/docs/src/theme/TOC/styles.module.css @@ -0,0 +1,16 @@ +.tableOfContents { + max-height: calc(100vh - (var(--ifm-navbar-height) + 2rem)); + overflow-y: auto; + position: sticky; + top: calc(var(--ifm-navbar-height) + 1rem); +} + +@media (max-width: 996px) { + .tableOfContents { + display: none; + } + + .docItemContainer { + padding: 0 0.3rem; + } +} diff --git a/apps/docs/src/tools/array.ts b/apps/docs/src/tools/array.ts new file mode 100644 index 000000000..823dc7794 --- /dev/null +++ b/apps/docs/src/tools/array.ts @@ -0,0 +1,7 @@ +export const splitToNChunks = (array: T[], chunks: number): T[][] => { + const result: T[][] = []; + for (let i = chunks; i > 0; i--) { + result.push(array.splice(0, Math.ceil(array.length / i))); + } + return result; +}; diff --git a/apps/docs/src/tools/math.ts b/apps/docs/src/tools/math.ts new file mode 100644 index 000000000..966a27d27 --- /dev/null +++ b/apps/docs/src/tools/math.ts @@ -0,0 +1,3 @@ +export function getRndInteger(min: number, max: number) { + return Math.round(Math.random() * (max - min)) + min; +} diff --git a/apps/docs/src/types.ts b/apps/docs/src/types.ts new file mode 100644 index 000000000..04b3848b9 --- /dev/null +++ b/apps/docs/src/types.ts @@ -0,0 +1,39 @@ +import { TablerIcon } from "@tabler/icons-react"; +import { ReactNode } from "react"; + +export interface IntegrationDefinition { + name: string; + description: string; + iconUrl: + | string + | { + light: string; + dark: string; + }; + path: string; +} + +export interface WidgetConfigurationItem { + name: ReactNode; + description: ReactNode; + values: + | string + | { type: "boolean" } + | { type: "string" } + | { type: "select"; options: string[] } + | { type: "object"; name: string; configuration: WidgetConfiguration } + | { type: "array"; name: string; configuration: WidgetConfiguration }; + defaultValue: string; +} + +export interface WidgetConfiguration { + items: WidgetConfigurationItem[]; +} + +export interface WidgetDefinition { + icon: TablerIcon; + name: string; + description: string; + path: string; + configuration?: WidgetConfiguration; +} diff --git a/apps/docs/static/.nojekyll b/apps/docs/static/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/apps/docs/static/api/.gitkeep b/apps/docs/static/api/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/docs/static/api/open-api-schema.json b/apps/docs/static/api/open-api-schema.json new file mode 100644 index 000000000..50384fba1 --- /dev/null +++ b/apps/docs/static/api/open-api-schema.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"Homarr API documentation","version":"1.0.0"},"servers":[{"url":"http://localhost:3000"}],"externalDocs":{"url":"https://homarr.dev"},"paths":{"/api/apps/paginated":{"get":{"operationId":"appRouter-getPaginated","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"query","name":"search","schema":{"type":"string"}},{"in":"query","name":"pageSize","schema":{"default":10,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},{"in":"query","name":"page","schema":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}},"totalCount":{"type":"number"}},"required":["items","totalCount"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/apps":{"get":{"operationId":"appRouter-all","tags":["apps"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"post":{"operationId":"appRouter-create","tags":["apps"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"description":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}]},"iconUrl":{"type":"string","minLength":1},"href":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^(?!javascript)[a-zA-Z]*:\\/\\/"},{"type":"string","const":""}]},{"type":"null"}]},"pingUrl":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^https?:\\/\\/"},{"type":"string","const":""}]},{"type":"null"}]}},"required":["name","description","iconUrl","href","pingUrl"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"appId":{"type":"string"}},"required":["appId"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}]}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/apps/search":{"get":{"operationId":"appRouter-search","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"query","name":"query","schema":{"type":"string"},"required":true},{"in":"query","name":"limit","schema":{"default":10,"type":"number","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/apps/selectable":{"get":{"operationId":"appRouter-selectable","tags":["apps"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","iconUrl","href","pingUrl","description"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/apps/{id}":{"get":{"operationId":"appRouter-byId","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"patch":{"operationId":"appRouter-update","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"description":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}]},"iconUrl":{"type":"string","minLength":1},"href":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^(?!javascript)[a-zA-Z]*:\\/\\/"},{"type":"string","const":""}]},{"type":"null"}]},"pingUrl":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^https?:\\/\\/"},{"type":"string","const":""}]},{"type":"null"}]}},"required":["name","description","iconUrl","href","pingUrl"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"delete":{"operationId":"appRouter-delete","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/info":{"get":{"operationId":"infoRouter-getInfo","tags":["info"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"string"}},"required":["version"],"additionalProperties":false}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/invites":{"get":{"operationId":"inviteRouter-getAll","tags":["invites"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"expirationDate":{"type":"string"},"creator":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"id":{"type":"string"}},"required":["name","id"],"additionalProperties":false}},"required":["id","expirationDate","creator"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"post":{"operationId":"inviteRouter-createInvite","tags":["invites"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expirationDate":{"type":"string"}},"required":["expirationDate"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"token":{"type":"string"}},"required":["id","token"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/invites/{id}":{"delete":{"operationId":"inviteRouter-deleteInvite","tags":["invites"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"not":{}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users":{"post":{"operationId":"userRouter-create","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","minLength":3,"maxLength":255},"password":{"type":"string","minLength":8,"maxLength":255},"confirmPassword":{"type":"string"},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"string","minLength":0,"maxLength":0}]},"groupIds":{"type":"array","items":{"type":"string"}}},"required":["username","password","confirmPassword","groupIds"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"get":{"operationId":"userRouter-getAll","tags":["users"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailVerified":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","email","emailVerified","image"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/profileImage":{"put":{"operationId":"userRouter-setProfileImage","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string"},"image":{"anyOf":[{"type":"string","maxLength":350000,"pattern":"^data:image\\/(png|jpeg|gif|webp);base64,[A-Za-z0-9/+]+=*$"},{"type":"null"}]}},"required":["userId","image"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/selectable":{"get":{"operationId":"userRouter-selectable","tags":["users"],"security":[{"apikey":[]}],"parameters":[{"in":"query","name":"excludeExternalProviders","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","image","email"],"additionalProperties":false}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/search":{"post":{"operationId":"userRouter-search","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"limit":{"default":10,"type":"number","minimum":1,"maximum":100}},"required":["query"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","image","email"],"additionalProperties":false}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/{userId}":{"get":{"operationId":"userRouter-getById","tags":["users"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"userId","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailVerified":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"provider":{"type":"string"},"homeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"mobileHomeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"firstDayOfWeek":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pingIconsEnabled":{"type":"boolean"},"defaultSearchEngineId":{"anyOf":[{"type":"string"},{"type":"null"}]},"openSearchInNewTab":{"type":"boolean"},"ddgBangs":{"type":"boolean"},"completedManageTour":{"type":"boolean"},"completedBoardTour":{"type":"boolean"}},"required":["id","name","email","emailVerified","image","provider","homeBoardId","mobileHomeBoardId","firstDayOfWeek","pingIconsEnabled","defaultSearchEngineId","openSearchInNewTab","ddgBangs","completedManageTour","completedBoardTour"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"delete":{"operationId":"userRouter-delete","tags":["users"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"userId","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/profile":{"put":{"operationId":"userRouter-editProfile","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","minLength":3,"maxLength":255},"email":{"anyOf":[{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"string","const":""}]},{"type":"null"}]}},"required":["id","name"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/{userId}/changePassword":{"patch":{"operationId":"userRouter-changePassword","tags":["users"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"userId","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"previousPassword":{"type":"string","minLength":1},"password":{"type":"string","minLength":8,"maxLength":255},"confirmPassword":{"type":"string"}},"required":["previousPassword","password","confirmPassword"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/changeHome":{"patch":{"operationId":"userRouter-changeHomeBoards","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"homeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"mobileHomeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"userId":{"type":"string"}},"required":["homeBoardId","mobileHomeBoardId","userId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/changeSearchEngine":{"patch":{"operationId":"userRouter-changeDefaultSearchEngine","tags":["users"],"security":[{"apikey":[]}],"deprecated":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"defaultSearchEngineId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"ddgBangsEnabled":{"type":"boolean"},"userId":{"type":"string"}},"required":["defaultSearchEngineId","ddgBangsEnabled","userId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/search-preferences":{"patch":{"operationId":"userRouter-changeSearchPreferences","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"defaultSearchEngineId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"openInNewTab":{"type":"boolean"},"ddgBangsEnabled":{"type":"boolean"},"userId":{"type":"string"}},"required":["defaultSearchEngineId","openInNewTab","ddgBangsEnabled","userId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/changeScheme":{"patch":{"operationId":"userRouter-changeColorScheme","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"colorScheme":{"type":"string","enum":["auto","light","dark"]}},"required":["colorScheme"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/ddg-bangs":{"patch":{"operationId":"userRouter-changeDdgBangs","tags":["users"],"security":[{"apikey":[]}],"deprecated":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ddgBangs":{"type":"boolean"},"id":{"type":"string"}},"required":["ddgBangs","id"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/firstDayOfWeek":{"patch":{"operationId":"userRouter-changeFirstDayOfWeek","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"firstDayOfWeek":{"type":"number","minimum":0,"maximum":6},"id":{"type":"string"}},"required":["firstDayOfWeek","id"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}}},"components":{"schemas":{"error.BAD_REQUEST":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Invalid input data"},"code":{"type":"string","description":"The error code","example":"BAD_REQUEST"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Invalid input data error (400)","description":"The error information","example":{"code":"BAD_REQUEST","message":"Invalid input data","issues":[]}},"error.UNAUTHORIZED":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Authorization not provided"},"code":{"type":"string","description":"The error code","example":"UNAUTHORIZED"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Authorization not provided error (401)","description":"The error information","example":{"code":"UNAUTHORIZED","message":"Authorization not provided","issues":[]}},"error.FORBIDDEN":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Insufficient access"},"code":{"type":"string","description":"The error code","example":"FORBIDDEN"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Insufficient access error (403)","description":"The error information","example":{"code":"FORBIDDEN","message":"Insufficient access","issues":[]}},"error.NOT_FOUND":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Not found"},"code":{"type":"string","description":"The error code","example":"NOT_FOUND"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Not found error (404)","description":"The error information","example":{"code":"NOT_FOUND","message":"Not found","issues":[]}},"error.INTERNAL_SERVER_ERROR":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Internal server error"},"code":{"type":"string","description":"The error code","example":"INTERNAL_SERVER_ERROR"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Internal server error error (500)","description":"The error information","example":{"code":"INTERNAL_SERVER_ERROR","message":"Internal server error","issues":[]}}},"securitySchemes":{"apikey":{"type":"apiKey","name":"ApiKey","description":"API key which can be obtained in the Homarr administration dashboard","in":"header"}}}} \ No newline at end of file diff --git a/apps/docs/static/data/.gitkeep b/apps/docs/static/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/docs/static/data/contributions.json b/apps/docs/static/data/contributions.json new file mode 100644 index 000000000..fbc3a2a80 --- /dev/null +++ b/apps/docs/static/data/contributions.json @@ -0,0 +1 @@ +[{"login":"ajnart","avatar_url":"https://avatars.githubusercontent.com/u/49837342?v=4"},{"login":"manuel-rw","avatar_url":"https://avatars.githubusercontent.com/u/30572287?v=4"},{"login":"Meierschlumpf","avatar_url":"https://avatars.githubusercontent.com/u/63781622?v=4"},{"login":"SeDemal","avatar_url":"https://avatars.githubusercontent.com/u/26098587?v=4"},{"login":"lammersbjorn","avatar_url":"https://avatars.githubusercontent.com/u/71191962?v=4"},{"login":"LarveyOfficial","avatar_url":"https://avatars.githubusercontent.com/u/39219859?v=4"},{"login":"c00ldude1oo","avatar_url":"https://avatars.githubusercontent.com/u/15677803?v=4"},{"login":"InterN0te","avatar_url":"https://avatars.githubusercontent.com/u/10882916?v=4"},{"login":"Aandree5","avatar_url":"https://avatars.githubusercontent.com/u/32734153?v=4"},{"login":"Aimsucks","avatar_url":"https://avatars.githubusercontent.com/u/1828486?v=4"},{"login":"JannesV","avatar_url":"https://avatars.githubusercontent.com/u/5984244?v=4"},{"login":"MauriceNino","avatar_url":"https://avatars.githubusercontent.com/u/18658092?v=4"},{"login":"hillaliy","avatar_url":"https://avatars.githubusercontent.com/u/950010?v=4"},{"login":"Skeeww","avatar_url":"https://avatars.githubusercontent.com/u/9639992?v=4"},{"login":"jackwellerreal","avatar_url":"https://avatars.githubusercontent.com/u/97435840?v=4"},{"login":"RichyHBM","avatar_url":"https://avatars.githubusercontent.com/u/5472275?v=4"},{"login":"Bonfire","avatar_url":"https://avatars.githubusercontent.com/u/5704760?v=4"},{"login":"wieli99","avatar_url":"https://avatars.githubusercontent.com/u/46794825?v=4"},{"login":"ishaanparlikar","avatar_url":"https://avatars.githubusercontent.com/u/43013132?v=4"},{"login":"Zareix","avatar_url":"https://avatars.githubusercontent.com/u/29818713?v=4"},{"login":"tuggan","avatar_url":"https://avatars.githubusercontent.com/u/4325608?v=4"},{"login":"mvanhorn","avatar_url":"https://avatars.githubusercontent.com/u/455140?v=4"},{"login":"SergioChan","avatar_url":"https://avatars.githubusercontent.com/u/10103766?v=4"},{"login":"toineenzo","avatar_url":"https://avatars.githubusercontent.com/u/4921397?v=4"},{"login":"oben01","avatar_url":"https://avatars.githubusercontent.com/u/22369027?v=4"},{"login":"rezstje","avatar_url":"https://avatars.githubusercontent.com/u/45420315?v=4"},{"login":"Spillebulle","avatar_url":"https://avatars.githubusercontent.com/u/46653946?v=4"},{"login":"marektancak0106","avatar_url":"https://avatars.githubusercontent.com/u/25422667?v=4"},{"login":"spkesDE","avatar_url":"https://avatars.githubusercontent.com/u/1682314?v=4"},{"login":"j3lte","avatar_url":"https://avatars.githubusercontent.com/u/2557568?v=4"},{"login":"dslatt","avatar_url":"https://avatars.githubusercontent.com/u/5211001?v=4"},{"login":"Malong11-007","avatar_url":"https://avatars.githubusercontent.com/u/40298510?v=4"},{"login":"castielwaverly","avatar_url":"https://avatars.githubusercontent.com/u/137005689?v=4"},{"login":"xoxyuxu","avatar_url":"https://avatars.githubusercontent.com/u/3543416?v=4"},{"login":"StrandedTurtle","avatar_url":"https://avatars.githubusercontent.com/u/132835255?v=4"},{"login":"MaienM","avatar_url":"https://avatars.githubusercontent.com/u/583129?v=4"},{"login":"kylegrieder","avatar_url":"https://avatars.githubusercontent.com/u/25424229?v=4"},{"login":"HeapReaper","avatar_url":"https://avatars.githubusercontent.com/u/31496522?v=4"},{"login":"Copilot","avatar_url":"https://avatars.githubusercontent.com/in/1143301?v=4"},{"login":"Gilmoursa","avatar_url":"https://avatars.githubusercontent.com/u/10321421?v=4"},{"login":"StefanB7","avatar_url":"https://avatars.githubusercontent.com/u/22056509?v=4"},{"login":"souravghosh01","avatar_url":"https://avatars.githubusercontent.com/u/37548139?v=4"},{"login":"SR3u","avatar_url":"https://avatars.githubusercontent.com/u/2380522?v=4"},{"login":"Rikpat","avatar_url":"https://avatars.githubusercontent.com/u/33869814?v=4"},{"login":"NormanJS","avatar_url":"https://avatars.githubusercontent.com/u/83409549?v=4"},{"login":"No-Maines-Land","avatar_url":"https://avatars.githubusercontent.com/u/20687725?v=4"},{"login":"stark1tty","avatar_url":"https://avatars.githubusercontent.com/u/69326376?v=4"},{"login":"Momcilo42","avatar_url":"https://avatars.githubusercontent.com/u/10118137?v=4"},{"login":"marius-arch","avatar_url":"https://avatars.githubusercontent.com/u/72494359?v=4"},{"login":"Lumilias","avatar_url":"https://avatars.githubusercontent.com/u/10852161?v=4"},{"login":"Havock94","avatar_url":"https://avatars.githubusercontent.com/u/7635248?v=4"},{"login":"Lollyde","avatar_url":"https://avatars.githubusercontent.com/u/11347524?v=4"},{"login":"krishnamuppaneni","avatar_url":"https://avatars.githubusercontent.com/u/4703366?v=4"},{"login":"devtobi","avatar_url":"https://avatars.githubusercontent.com/u/28538704?v=4"},{"login":"TyxTang","avatar_url":"https://avatars.githubusercontent.com/u/90897955?v=4"},{"login":"alotlikebeans","avatar_url":"https://avatars.githubusercontent.com/u/19630511?v=4"},{"login":"WillyJL","avatar_url":"https://avatars.githubusercontent.com/u/49810075?v=4"},{"login":"anonysoul","avatar_url":"https://avatars.githubusercontent.com/u/105715150?v=4"},{"login":"cospeedster","avatar_url":"https://avatars.githubusercontent.com/u/52749645?v=4"},{"login":"diederbert","avatar_url":"https://avatars.githubusercontent.com/u/162878798?v=4"},{"login":"digdilem","avatar_url":"https://avatars.githubusercontent.com/u/4052275?v=4"},{"login":"dinghino","avatar_url":"https://avatars.githubusercontent.com/u/14729459?v=4"},{"login":"gfomichev","avatar_url":"https://avatars.githubusercontent.com/u/1596146?v=4"},{"login":"gnattu","avatar_url":"https://avatars.githubusercontent.com/u/12995396?v=4"},{"login":"tuxpizza","avatar_url":"https://avatars.githubusercontent.com/u/84710786?v=4"},{"login":"xmarkurion","avatar_url":"https://avatars.githubusercontent.com/u/46654687?v=4"},{"login":"huanga","avatar_url":"https://avatars.githubusercontent.com/u/732970?v=4"},{"login":"taos15","avatar_url":"https://avatars.githubusercontent.com/u/122130728?v=4"},{"login":"arghyadipchak","avatar_url":"https://avatars.githubusercontent.com/u/32430374?v=4"},{"login":"AuthorShin","avatar_url":"https://avatars.githubusercontent.com/u/4959043?v=4"},{"login":"benniblot","avatar_url":"https://avatars.githubusercontent.com/u/47495914?v=4"},{"login":"bebsworthy","avatar_url":"https://avatars.githubusercontent.com/u/5266759?v=4"},{"login":"catrielmuller","avatar_url":"https://avatars.githubusercontent.com/u/2272323?v=4"},{"login":"Vysp3r","avatar_url":"https://avatars.githubusercontent.com/u/62019735?v=4"},{"login":"DR-Blogs","avatar_url":"https://avatars.githubusercontent.com/u/96393186?v=4"},{"login":"singular0","avatar_url":"https://avatars.githubusercontent.com/u/1925883?v=4"},{"login":"diogovalentte","avatar_url":"https://avatars.githubusercontent.com/u/49578155?v=4"},{"login":"codezninja","avatar_url":"https://avatars.githubusercontent.com/u/4400773?v=4"},{"login":"fabricionaweb","avatar_url":"https://avatars.githubusercontent.com/u/15933?v=4"},{"login":"nyok1912","avatar_url":"https://avatars.githubusercontent.com/u/32163949?v=4"},{"login":"bo3bdo","avatar_url":"https://avatars.githubusercontent.com/u/5271380?v=4"},{"login":"hskrtich","avatar_url":"https://avatars.githubusercontent.com/u/1214484?v=4"},{"login":"ishults","avatar_url":"https://avatars.githubusercontent.com/u/7275442?v=4"},{"login":"jelliuk","avatar_url":"https://avatars.githubusercontent.com/u/4790959?v=4"},{"login":"Moohan","avatar_url":"https://avatars.githubusercontent.com/u/5982260?v=4"},{"login":"tesar-tech","avatar_url":"https://avatars.githubusercontent.com/u/33880579?v=4"},{"login":"jbruell","avatar_url":"https://avatars.githubusercontent.com/u/31685172?v=4"},{"login":"JasonLeeB06","avatar_url":"https://avatars.githubusercontent.com/u/82266978?v=4"},{"login":"jeffersonraimon","avatar_url":"https://avatars.githubusercontent.com/u/80064475?v=4"},{"login":"jo-chemla","avatar_url":"https://avatars.githubusercontent.com/u/16822841?v=4"},{"login":"joser93","avatar_url":"https://avatars.githubusercontent.com/u/6912089?v=4"},{"login":"justijndepover","avatar_url":"https://avatars.githubusercontent.com/u/9008623?v=4"},{"login":"leandroscardua","avatar_url":"https://avatars.githubusercontent.com/u/24698541?v=4"},{"login":"mairas","avatar_url":"https://avatars.githubusercontent.com/u/407010?v=4"},{"login":"itzTheMeow","avatar_url":"https://avatars.githubusercontent.com/u/50887230?v=4"},{"login":"NicolasNewman","avatar_url":"https://avatars.githubusercontent.com/u/16135852?v=4"},{"login":"NikeLaosClericus","avatar_url":"https://avatars.githubusercontent.com/u/39810627?v=4"},{"login":"noahcroghan","avatar_url":"https://avatars.githubusercontent.com/u/27422774?v=4"},{"login":"ohmzi","avatar_url":"https://avatars.githubusercontent.com/u/6551272?v=4"},{"login":"Rhiz3K","avatar_url":"https://avatars.githubusercontent.com/u/33246262?v=4"},{"login":"saschabuehrle","avatar_url":"https://avatars.githubusercontent.com/u/47737812?v=4"},{"login":"CrazyWolf13","avatar_url":"https://avatars.githubusercontent.com/u/96661824?v=4"},{"login":"VIVAAN-DHAWAN","avatar_url":"https://avatars.githubusercontent.com/u/150339722?v=4"},{"login":"generalmat82","avatar_url":"https://avatars.githubusercontent.com/u/110256073?v=4"},{"login":"lthomsen","avatar_url":"https://avatars.githubusercontent.com/u/28560325?v=4"},{"login":"pitschi","avatar_url":"https://avatars.githubusercontent.com/u/6841565?v=4"},{"login":"sharpsalat","avatar_url":"https://avatars.githubusercontent.com/u/15666932?v=4"},{"login":"tech62","avatar_url":"https://avatars.githubusercontent.com/u/16237642?v=4"},{"login":"AartSchinkel","avatar_url":"https://avatars.githubusercontent.com/u/189675191?v=4"},{"login":"afonsojramos","avatar_url":"https://avatars.githubusercontent.com/u/19473034?v=4"},{"login":"m0s4ik","avatar_url":"https://avatars.githubusercontent.com/u/26578395?v=4"},{"login":"ashtonbatty","avatar_url":"https://avatars.githubusercontent.com/u/230635?v=4"},{"login":"Oupsman","avatar_url":"https://avatars.githubusercontent.com/u/11260343?v=4"},{"login":"cethien","avatar_url":"https://avatars.githubusercontent.com/u/60463918?v=4"},{"login":"DZ945brH","avatar_url":"https://avatars.githubusercontent.com/u/42635243?v=4"},{"login":"dgshue","avatar_url":"https://avatars.githubusercontent.com/u/12952156?v=4"},{"login":"d-lindahl","avatar_url":"https://avatars.githubusercontent.com/u/690410?v=4"},{"login":"KartulUdus","avatar_url":"https://avatars.githubusercontent.com/u/23346150?v=4"},{"login":"ieugen","avatar_url":"https://avatars.githubusercontent.com/u/1050920?v=4"},{"login":"faugusto-oliveira","avatar_url":"https://avatars.githubusercontent.com/u/37384074?v=4"},{"login":"frankvHoof93","avatar_url":"https://avatars.githubusercontent.com/u/7346516?v=4"},{"login":"febrile42","avatar_url":"https://avatars.githubusercontent.com/u/14597122?v=4"},{"login":"Kaotic3","avatar_url":"https://avatars.githubusercontent.com/u/80522225?v=4"},{"login":"KelianB","avatar_url":"https://avatars.githubusercontent.com/u/11216155?v=4"},{"login":"hotrungnhan","avatar_url":"https://avatars.githubusercontent.com/u/40029631?v=4"}] \ No newline at end of file diff --git a/apps/docs/static/data/translation-contributions.json b/apps/docs/static/data/translation-contributions.json new file mode 100644 index 000000000..5818e6339 --- /dev/null +++ b/apps/docs/static/data/translation-contributions.json @@ -0,0 +1 @@ +[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"prubin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17503492/medium/96ac87644691e49c1f983f2f094e541c_default.png"},{"username":"sam-tam-sam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17578052/medium/1628dc2954ce3ae95e0caaa2bd60ab0c.png"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"Ebedami","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12974801/medium/b596dea5c09454c4c828eac558389755.jpg"},{"username":"perrygamerptyt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13117177/medium/1406c949507ecd438480473c8a1f6124.jpg"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"jeongeon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Tobost06","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13467449/medium/9227dc07f6366bc060d28304f5cb8ce7.jpeg"},{"username":"Kf637","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13530622/medium/118b00bb72d01d3229c97409637e25d1_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"olavinto","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14424644/medium/37c01732bd2b7a272b421807a05ccfeb.png"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Wjouter","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14585620/medium/b91a51513332bdc0a0a9ecbed99ecbc3.png"},{"username":"albanobattistella","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14686194/medium/564afcfd76f5cd24751bd669cf4943aa.jpg"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"meviper","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15958903/medium/209f521ce33a05831fa8d7d1b7babc20_default.png"},{"username":"GerOriki","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16268376/medium/da00e54b08cd40348231d92873a0cd0a_default.png"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"renan.costaalencar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16938427/medium/6d25b25320c5bde734118dec4af9cd5b.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/b9e15aa2b24a0dbc1e4f194aa8ed5109.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"},{"username":"stratself","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17290388/medium/57d9d8161b3fd0abf4dc5558b4a1fa05_default.png"},{"username":"wuzeqin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17292606/medium/b9e0308410b31337e2d7aa6ed346d718_default.png"},{"username":"ChristopherBull","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17304338/medium/21a175ce596bfae81430767467908b90.jpeg"},{"username":"darkbcnlord","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17311436/medium/b271bc0b419ec3a26ddb7b63ff8ffc4b.png"},{"username":"zhoran1997","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17344028/medium/c8f450b5a8f1e9494a45dc60af7ce63e.png"},{"username":"gilalves1703","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17447768/medium/3f1de562a5c2391c88bbf8d5cf40a266.png"},{"username":"iServeCloud","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17470960/medium/11649b99d609438d66455a4d2fdc70f7.png"},{"username":"guibolzantvbox","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17474136/medium/59a576e6da538664ceb972253916fa02.jpeg"},{"username":"ivann136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17506062/medium/67d09ada36fac5f444a1f7517e3a97bd_default.png"},{"username":"Maheshivara","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17516082/medium/576e1e6581cf969615b265de6aeff8b7.jpeg"},{"username":"brunogui81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17517542/medium/7c0d174e810435af518fe8e0c05e151f.jpeg"},{"username":"michelwilhelm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17542190/medium/4c6b33fd8993ff565fa75add2ce8355e.jpeg"},{"username":"dias-gxstavo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17547376/medium/8c6b109aae8aeb651192346a39ae9e5b.jpeg"},{"username":"ToxykAuBleu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17614030/medium/8d21e0608560172b121bd46126d827c7.jpeg"},{"username":"e.erdemir","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17617994/medium/7259a29db9941c6171a8cbbd643b92bd.png"},{"username":"sjonkreutz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17618306/medium/7601c45d015189a863656e21348d223b.png"},{"username":"volovich0377","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17620388/medium/c929a8fbd24f96d17620fa497ade7309.png"},{"username":"Hamstio1","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17624898/medium/406e0bf40094c24a01c3064f8f5b2a82.png"},{"username":"i3laa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17627462/medium/613a9d283ed8b69819ee181903851660.jpeg"},{"username":"bastiengrignon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17629884/medium/ddfc3339285bd65195fcd834e512e9b7.jpeg"},{"username":"kauhee","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17644600/medium/def1b9066cf9275b4273a5a5dca7f325.png"},{"username":"hongminzheng","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17683860/medium/a764f4963912777d27a7cd98e136a2b2.png"},{"username":"d-lindahl","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17726729/medium/cbde348582fbabcfadd89a56cd5a0b40.png"},{"username":"Enoal-Fauchille-Bolle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17734649/medium/6e6fb29198782dc7856ea21811db669c.jpeg"}] \ No newline at end of file diff --git a/apps/docs/static/img/favicon.png b/apps/docs/static/img/favicon.png new file mode 100644 index 000000000..4a960438d Binary files /dev/null and b/apps/docs/static/img/favicon.png differ diff --git a/apps/docs/static/img/logo.png b/apps/docs/static/img/logo.png new file mode 100644 index 000000000..cb0dc4489 Binary files /dev/null and b/apps/docs/static/img/logo.png differ diff --git a/apps/docs/static/img/logo.svg b/apps/docs/static/img/logo.svg new file mode 100644 index 000000000..178860125 --- /dev/null +++ b/apps/docs/static/img/logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/docs/static/img/pictures/apps/screenshot-apps-dark.jpg b/apps/docs/static/img/pictures/apps/screenshot-apps-dark.jpg new file mode 100644 index 000000000..35f99aa6c Binary files /dev/null and b/apps/docs/static/img/pictures/apps/screenshot-apps-dark.jpg differ diff --git a/apps/docs/static/img/pictures/apps/screenshot-apps-light.jpg b/apps/docs/static/img/pictures/apps/screenshot-apps-light.jpg new file mode 100644 index 000000000..2cff5e21f Binary files /dev/null and b/apps/docs/static/img/pictures/apps/screenshot-apps-light.jpg differ diff --git a/apps/docs/static/img/pictures/homarr-devices-preview/compressed/homarr-devices-2d-mockup-flat-shadow-dark-compressed.webp b/apps/docs/static/img/pictures/homarr-devices-preview/compressed/homarr-devices-2d-mockup-flat-shadow-dark-compressed.webp new file mode 100644 index 000000000..d23a2cf43 Binary files /dev/null and b/apps/docs/static/img/pictures/homarr-devices-preview/compressed/homarr-devices-2d-mockup-flat-shadow-dark-compressed.webp differ diff --git a/apps/docs/static/img/pictures/homarr-devices-preview/compressed/homarr-devices-2d-mockup-flat-shadow-light-compressed.webp b/apps/docs/static/img/pictures/homarr-devices-preview/compressed/homarr-devices-2d-mockup-flat-shadow-light-compressed.webp new file mode 100644 index 000000000..0e36bae35 Binary files /dev/null and b/apps/docs/static/img/pictures/homarr-devices-preview/compressed/homarr-devices-2d-mockup-flat-shadow-light-compressed.webp differ diff --git a/apps/docs/static/img/pictures/homarr-devices-preview/uncompressed/homarr-devices-2d-mockup-flat-shadow-dark.webp b/apps/docs/static/img/pictures/homarr-devices-preview/uncompressed/homarr-devices-2d-mockup-flat-shadow-dark.webp new file mode 100644 index 000000000..744207b0e Binary files /dev/null and b/apps/docs/static/img/pictures/homarr-devices-preview/uncompressed/homarr-devices-2d-mockup-flat-shadow-dark.webp differ diff --git a/apps/docs/static/img/pictures/homarr-devices-preview/uncompressed/homarr-devices-2d-mockup-flat-shadow-light.webp b/apps/docs/static/img/pictures/homarr-devices-preview/uncompressed/homarr-devices-2d-mockup-flat-shadow-light.webp new file mode 100644 index 000000000..57f8866a5 Binary files /dev/null and b/apps/docs/static/img/pictures/homarr-devices-preview/uncompressed/homarr-devices-2d-mockup-flat-shadow-light.webp differ diff --git a/apps/docs/static/img/pictures/lang/screenshot-customization-dark.jpg b/apps/docs/static/img/pictures/lang/screenshot-customization-dark.jpg new file mode 100644 index 000000000..30d0964ff Binary files /dev/null and b/apps/docs/static/img/pictures/lang/screenshot-customization-dark.jpg differ diff --git a/apps/docs/static/img/pictures/lang/screenshot-customization-light.jpg b/apps/docs/static/img/pictures/lang/screenshot-customization-light.jpg new file mode 100644 index 000000000..c03e87f1a Binary files /dev/null and b/apps/docs/static/img/pictures/lang/screenshot-customization-light.jpg differ diff --git a/apps/docs/static/img/pictures/partner/pika-pods.svg b/apps/docs/static/img/pictures/partner/pika-pods.svg new file mode 100644 index 000000000..453d51729 --- /dev/null +++ b/apps/docs/static/img/pictures/partner/pika-pods.svg @@ -0,0 +1 @@ +logo \ No newline at end of file diff --git a/apps/docs/static/img/pictures/reviews/ibracorp.webp b/apps/docs/static/img/pictures/reviews/ibracorp.webp new file mode 100644 index 000000000..2d5830198 Binary files /dev/null and b/apps/docs/static/img/pictures/reviews/ibracorp.webp differ diff --git a/apps/docs/static/img/pictures/reviews/maeglin.webp b/apps/docs/static/img/pictures/reviews/maeglin.webp new file mode 100644 index 000000000..f213809f9 Binary files /dev/null and b/apps/docs/static/img/pictures/reviews/maeglin.webp differ diff --git a/apps/docs/static/img/pictures/reviews/r_selfhosted.webp b/apps/docs/static/img/pictures/reviews/r_selfhosted.webp new file mode 100644 index 000000000..3aaa9e61c Binary files /dev/null and b/apps/docs/static/img/pictures/reviews/r_selfhosted.webp differ diff --git a/apps/docs/static/img/pictures/reviews/r_unraid.webp b/apps/docs/static/img/pictures/reviews/r_unraid.webp new file mode 100644 index 000000000..9c0cc8ee3 Binary files /dev/null and b/apps/docs/static/img/pictures/reviews/r_unraid.webp differ diff --git a/apps/docs/static/img/pictures/widgets/widget-dark.jpg b/apps/docs/static/img/pictures/widgets/widget-dark.jpg new file mode 100644 index 000000000..7fd2b2066 Binary files /dev/null and b/apps/docs/static/img/pictures/widgets/widget-dark.jpg differ diff --git a/apps/docs/static/img/pictures/widgets/widget-light.jpg b/apps/docs/static/img/pictures/widgets/widget-light.jpg new file mode 100644 index 000000000..69eb8a5ba Binary files /dev/null and b/apps/docs/static/img/pictures/widgets/widget-light.jpg differ diff --git a/apps/docs/static/img/undraw_illustrations/integrate.svg b/apps/docs/static/img/undraw_illustrations/integrate.svg new file mode 100644 index 000000000..1078c1e3a --- /dev/null +++ b/apps/docs/static/img/undraw_illustrations/integrate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/docs/static/img/undraw_illustrations/modern_design.svg b/apps/docs/static/img/undraw_illustrations/modern_design.svg new file mode 100644 index 000000000..68bc407e2 --- /dev/null +++ b/apps/docs/static/img/undraw_illustrations/modern_design.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/docs/static/img/undraw_illustrations/open_source.svg b/apps/docs/static/img/undraw_illustrations/open_source.svg new file mode 100644 index 000000000..871da18a3 --- /dev/null +++ b/apps/docs/static/img/undraw_illustrations/open_source.svg @@ -0,0 +1 @@ +open source \ No newline at end of file diff --git a/apps/docs/static/img/undraw_illustrations/review.svg b/apps/docs/static/img/undraw_illustrations/review.svg new file mode 100644 index 000000000..91d97638d --- /dev/null +++ b/apps/docs/static/img/undraw_illustrations/review.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/docs/static/img/undraw_illustrations/undraw_taken_re_yn20.svg b/apps/docs/static/img/undraw_illustrations/undraw_taken_re_yn20.svg new file mode 100644 index 000000000..776dc871d --- /dev/null +++ b/apps/docs/static/img/undraw_illustrations/undraw_taken_re_yn20.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/docs/static/img/videos/showcase.mp4 b/apps/docs/static/img/videos/showcase.mp4 new file mode 100644 index 000000000..ddb338b5c Binary files /dev/null and b/apps/docs/static/img/videos/showcase.mp4 differ diff --git a/apps/docs/tailwind.config.js b/apps/docs/tailwind.config.js new file mode 100644 index 000000000..7020eb18d --- /dev/null +++ b/apps/docs/tailwind.config.js @@ -0,0 +1,19 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./src/**/*.{js,jsx,ts,tsx}"], + theme: { + extend: { + spacing: { + 128: "32rem", + }, + screens: { + "3xl": "1697px", + }, + }, + }, + darkMode: ["class", '[data-theme="dark"]'], + plugins: [], + corePlugins: { + preflight: false, + }, +}; diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json new file mode 100644 index 000000000..42cc555a8 --- /dev/null +++ b/apps/docs/tsconfig.json @@ -0,0 +1,35 @@ +{ + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": ".", + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true + }, + "include": [ + "**/*.ts", + "**/*.jsx", + "**/*.js", + "**/*.tsx", + "**/*.md", + "**/*.mdx" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 146578bf6..e058f325c 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -70,7 +70,9 @@ "@xterm/addon-canvas": "catalog:", "@xterm/addon-fit": "catalog:", "@xterm/xterm": "catalog:", + "adm-zip": "catalog:", "babel-plugin-react-compiler": "catalog:", + "better-sqlite3": "catalog:", "chroma-js": "catalog:", "clsx": "catalog:", "dayjs": "catalog:", @@ -78,11 +80,9 @@ "drizzle-orm": "catalog:", "flag-icons": "catalog:", "glob": "catalog:", - "adm-zip": "catalog:", - "better-sqlite3": "catalog:", "isomorphic-dompurify": "catalog:", - "jszip": "catalog:", "jotai": "catalog:", + "jszip": "catalog:", "lucide-react": "catalog:", "mantine-datatable": "catalog:", "mantine-react-table": "catalog:", diff --git a/apps/nextjs/src/components/board/items/actions/test/create-item.spec.ts b/apps/nextjs/src/components/board/items/actions/test/create-item.spec.ts index b76abdd2c..e2a0ff93c 100644 --- a/apps/nextjs/src/components/board/items/actions/test/create-item.spec.ts +++ b/apps/nextjs/src/components/board/items/actions/test/create-item.spec.ts @@ -52,7 +52,7 @@ describe("item actions create-item", () => { ], }), ); - expect(emptyPositionSpy).toHaveBeenCalledWith([], layout.columnCount); + expect(emptyPositionSpy).toHaveBeenCalledWith([], layout.columnCount, 9999, { height: 1, width: 1 }); }); test("should correctly pass dynamic section and items to getFirstEmptyPosition", () => { // Arrange @@ -104,6 +104,8 @@ describe("item actions create-item", () => { expect(spy).toHaveBeenCalledWith( [expect.objectContaining(itemAndSectionPosition), expect.objectContaining(itemAndSectionPosition)], layout.columnCount, + 9999, + { height: 1, width: 1 }, ); }); }); diff --git a/package.json b/package.json index 70800114e..32ae235bb 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "db:push": "pnpm -F db push:sqlite", "db:studio": "pnpm -F db studio", "dev": "pnpm -F nextjs dev", + "dev:docs": "pnpm -F @homarr/docs dev", "docker:dev": "docker compose -f ./development/development.docker-compose.yml up", "format": "turbo format --continue -- --check", "format:fix": "turbo format --continue", diff --git a/packages/definitions/package.json b/packages/definitions/package.json index d20a0874f..9059e3c92 100644 --- a/packages/definitions/package.json +++ b/packages/definitions/package.json @@ -12,7 +12,8 @@ } }, "exports": { - ".": "./index.ts" + ".": "./index.ts", + "./docs/*": "./src/docs/*.ts" }, "scripts": { "clean": "rm -rf .turbo node_modules", diff --git a/packages/definitions/src/docs/codegen.ts b/packages/definitions/src/docs/codegen.ts index f39cf3f28..6ea123c7f 100644 --- a/packages/definitions/src/docs/codegen.ts +++ b/packages/definitions/src/docs/codegen.ts @@ -5,6 +5,8 @@ import { XMLParser } from "fast-xml-parser"; import { z } from "zod/v4"; import { createDocumentationLink } from "./index"; +import { integrationDocSlugs } from "./integration-doc-slugs"; +import { widgetDocSlugs } from "./widget-doc-slugs"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -66,8 +68,21 @@ const main = async () => { const sitemapXml = await fetchSitemapAsync(); const sitemapData = parseXml(sitemapXml); const paths = mapSitemapXmlToPaths(sitemapData); - // Adding sitemap as it's not in the sitemap.xml and we need it for this file paths.push("/sitemap.xml"); + + const slugMapPaths = [ + ...Object.values(integrationDocSlugs) + .filter(Boolean) + .map((slug) => `/docs/integrations/${slug}`), + ...Object.values(widgetDocSlugs) + .filter(Boolean) + .map((slug) => `/docs/widgets/${slug}`), + ]; + for (const p of slugMapPaths) { + if (!paths.includes(p)) { + paths.push(p); + } + } const sitemapPathType = createSitemapPathType(paths); await updateSitemapTypeFileAsync(sitemapPathType); }; diff --git a/packages/definitions/src/docs/homarr-docs-sitemap.ts b/packages/definitions/src/docs/homarr-docs-sitemap.ts index 348bbf78d..7b5b00b8d 100644 --- a/packages/definitions/src/docs/homarr-docs-sitemap.ts +++ b/packages/definitions/src/docs/homarr-docs-sitemap.ts @@ -254,4 +254,100 @@ export type HomarrDocumentationPath = | "/docs/widgets/video" | "/docs/widgets/weather" | "" - | "/sitemap.xml"; + | "/sitemap.xml" + | "/docs/integrations/sabnzbd" + | "/docs/integrations/nzbget" + | "/docs/integrations/deluge" + | "/docs/integrations/transmission" + | "/docs/integrations/q-bittorent" + | "/docs/integrations/aria2" + | "/docs/integrations/slskd" + | "/docs/integrations/sonarr" + | "/docs/integrations/radarr" + | "/docs/integrations/lidarr" + | "/docs/integrations/readarr" + | "/docs/integrations/prowlarr" + | "/docs/integrations/jellyfin" + | "/docs/integrations/emby" + | "/docs/integrations/plex" + | "/docs/integrations/jellyseerr" + | "/docs/integrations/seerr" + | "/docs/integrations/overseerr" + | "/docs/integrations/pi-hole" + | "/docs/integrations/adguard-home" + | "/docs/integrations/technitium-dns" + | "/docs/integrations/home-assistant" + | "/docs/integrations/open-media-vault" + | "/docs/integrations/dash-dot" + | "/docs/integrations/glances" + | "/docs/integrations/tdarr" + | "/docs/integrations/proxmox" + | "/docs/integrations/nextcloud" + | "/docs/integrations/unifi-controller" + | "/docs/integrations/opnsense" + | "/docs/integrations/github" + | "/docs/integrations/docker-hub" + | "/docs/integrations/gitlab" + | "/docs/integrations/npm" + | "/docs/integrations/codeberg" + | "/docs/integrations/linux-server-io" + | "/docs/integrations/github-containerregistry" + | "/docs/integrations/quay" + | "/docs/integrations/ntfy" + | "/docs/integrations/ical" + | "/docs/integrations/anchor" + | "/docs/integrations/truenas" + | "/docs/integrations/unraid" + | "/docs/integrations/coolify" + | "/docs/integrations/search-ch" + | "/docs/integrations/immich" + | "/docs/integrations/paperless-ngx" + | "/docs/integrations/tracearr" + | "/docs/integrations/speedtest-tracker" + | "/docs/integrations/uptime-kuma" + | "/docs/integrations/audiobookshelf" + | "/docs/integrations/navidrome" + | "/docs/integrations/umami" + | "/docs/integrations/peanut" + | "/docs/widgets/clock" + | "/docs/widgets/weather" + | "/docs/widgets/app" + | "/docs/widgets/iframe" + | "/docs/widgets/video" + | "/docs/widgets/notebook" + | "/docs/widgets/anchor-note" + | "/docs/widgets/dns-hole-summary" + | "/docs/widgets/dns-hole-controls" + | "/docs/widgets/smart-home-entity-state" + | "/docs/widgets/smart-home-execute-automation" + | "/docs/widgets/stock-price" + | "/docs/widgets/media-server" + | "/docs/widgets/calendar" + | "/docs/widgets/downloads" + | "/docs/widgets/media-request-list" + | "/docs/widgets/media-request-stats" + | "/docs/widgets/media-transcoding" + | "/docs/widgets/minecraft-server-status" + | "/docs/widgets/network-controller-summary" + | "/docs/widgets/network-controller-status" + | "/docs/widgets/rss-feed" + | "/docs/widgets/bookmarks" + | "/docs/widgets/indexer-manager" + | "/docs/widgets/health-monitoring" + | "/docs/widgets/releases" + | "/docs/widgets/media-releases" + | "/docs/widgets/docker-containers" + | "/docs/widgets/firewall" + | "/docs/widgets/notifications" + | "/docs/widgets/system-resources" + | "/docs/widgets/coolify" + | "/docs/widgets/timetable" + | "/docs/widgets/immich-server-stats" + | "/docs/widgets/immich-album-carousel" + | "/docs/widgets/paperless-ngx" + | "/docs/widgets/tracearr" + | "/docs/widgets/speedtest-tracker" + | "/docs/widgets/uptime-kuma" + | "/docs/widgets/audio-stats" + | "/docs/widgets/umami" + | "/docs/widgets/ups"; diff --git a/packages/definitions/src/docs/integration-doc-slugs.ts b/packages/definitions/src/docs/integration-doc-slugs.ts new file mode 100644 index 000000000..17f51a9fa --- /dev/null +++ b/packages/definitions/src/docs/integration-doc-slugs.ts @@ -0,0 +1,60 @@ +import type { IntegrationKind } from "../integration"; + +export const integrationDocSlugs: Record = { + sabNzbd: "sabnzbd", + nzbGet: "nzbget", + deluge: "deluge", + transmission: "transmission", + qBittorrent: "q-bittorent", + aria2: "aria2", + slskd: "slskd", + sonarr: "sonarr", + radarr: "radarr", + lidarr: "lidarr", + readarr: "readarr", + prowlarr: "prowlarr", + jellyfin: "jellyfin", + emby: "emby", + plex: "plex", + jellyseerr: "jellyseerr", + seerr: "seerr", + overseerr: "overseerr", + piHole: "pi-hole", + adGuardHome: "adguard-home", + technitiumDns: "technitium-dns", + homeAssistant: "home-assistant", + openmediavault: "open-media-vault", + dashDot: "dash-dot", + glances: "glances", + tdarr: "tdarr", + proxmox: "proxmox", + nextcloud: "nextcloud", + unifiController: "unifi-controller", + opnsense: "opnsense", + github: "github", + dockerHub: "docker-hub", + gitlab: "gitlab", + npm: "npm", + codeberg: "codeberg", + linuxServerIO: "linux-server-io", + gitHubContainerRegistry: "github-containerregistry", + quay: "quay", + ntfy: "ntfy", + ical: "ical", + anchor: "anchor", + truenas: "truenas", + unraid: "unraid", + coolify: "coolify", + searchCh: "search-ch", + immich: "immich", + paperlessNgx: "paperless-ngx", + tracearr: "tracearr", + speedtestTracker: "speedtest-tracker", + uptimeKuma: "uptime-kuma", + audiobookshelf: "audiobookshelf", + navidrome: "navidrome", + umami: "umami", + peaNut: "peanut", + beszel: null, + mock: null, +}; diff --git a/packages/definitions/src/docs/widget-doc-slugs.ts b/packages/definitions/src/docs/widget-doc-slugs.ts new file mode 100644 index 000000000..b3ca3a717 --- /dev/null +++ b/packages/definitions/src/docs/widget-doc-slugs.ts @@ -0,0 +1,52 @@ +import type { WidgetKind } from "../widget"; + +export const widgetDocSlugs: Record = { + clock: "clock", + weather: "weather", + app: "app", + iframe: "iframe", + video: "video", + notebook: "notebook", + anchorNote: "anchor-note", + dnsHoleSummary: "dns-hole-summary", + dnsHoleControls: "dns-hole-controls", + "smartHome-entityState": "smart-home-entity-state", + "smartHome-executeAutomation": "smart-home-execute-automation", + stockPrice: "stock-price", + mediaServer: "media-server", + calendar: "calendar", + downloads: "downloads", + "mediaRequests-requestList": "media-request-list", + "mediaRequests-requestStats": "media-request-stats", + mediaTranscoding: "media-transcoding", + minecraftServerStatus: "minecraft-server-status", + networkControllerSummary: "network-controller-summary", + networkControllerStatus: "network-controller-status", + rssFeed: "rss-feed", + bookmarks: "bookmarks", + indexerManager: "indexer-manager", + healthMonitoring: "health-monitoring", + releases: "releases", + mediaReleases: "media-releases", + dockerContainers: "docker-containers", + firewall: "firewall", + notifications: "notifications", + systemResources: "system-resources", + coolify: "coolify", + systemDisks: null, + timetable: "timetable", + "immich-serverStats": "immich-server-stats", + "immich-albumCarousel": "immich-album-carousel", + paperlessNgx: "paperless-ngx", + tracearr: "tracearr", + speedtestTracker: "speedtest-tracker", + uptimeKuma: "uptime-kuma", + audioStats: "audio-stats", + umami: "umami", + ups: "ups", + beszelSystemTable: null, + beszelSystemGrid: null, + beszelAlerts: null, + beszelSystemStats: null, + customApi: null, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39cb023af..7ba256b0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,7 +107,7 @@ catalogs: version: 1.60.0 '@scalar/api-reference-react': specifier: ^0.9.42 - version: 0.9.42 + version: 0.9.43 '@semantic-release/changelog': specifier: ^6.0.3 version: 6.0.3 @@ -622,7 +622,7 @@ importers: version: 2.9.16(@types/node@24.13.1) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.2.0(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 5.2.0(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 'catalog:' version: 4.1.8(vitest@4.1.8) @@ -661,10 +661,122 @@ importers: version: 5.9.3 vite-tsconfig-paths: specifier: 'catalog:' - version: 6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + + apps/docs: + dependencies: + '@docusaurus/core': + specifier: ^3.10.1 + version: 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/faster': + specifier: ^3.10.1 + version: 3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8) + '@docusaurus/plugin-content-docs': + specifier: ^3.10.1 + version: 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-sitemap': + specifier: ^3.10.1 + version: 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/preset-classic': + specifier: ^3.10.1 + version: 3.10.1(@algolia/client-search@5.53.0)(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)(typescript@5.9.3) + '@docusaurus/theme-common': + specifier: ^3.10.1 + version: 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-mermaid': + specifier: ^3.10.1 + version: 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@homarr/definitions': + specifier: workspace:^ + version: link:../../packages/definitions + '@mdx-js/react': + specifier: ^3.1.1 + version: 3.1.1(@types/react@19.2.16)(react@19.2.7) + '@nivo/line': + specifier: ^0.99.0 + version: 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@scalar/api-reference-react': + specifier: 'catalog:' + version: 0.9.43(nprogress@0.2.0)(react@19.2.7)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)(zod@4.4.3) + '@signalwire/docusaurus-plugin-llms-txt': + specifier: ^1.2.2 + version: 1.2.2(@docusaurus/core@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)) + '@tabler/icons-react': + specifier: 'catalog:' + version: 3.44.0(react@19.2.7) + autoprefixer: + specifier: ^10.5.0 + version: 10.5.0(postcss@8.5.8) + clsx: + specifier: 'catalog:' + version: 2.1.1 + dayjs: + specifier: 'catalog:' + version: 1.11.21 + docusaurus-plugin-image-zoom: + specifier: ^3.0.1 + version: 3.0.1(@docusaurus/theme-classic@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)) + leader-line-new: + specifier: ^1.1.9 + version: 1.1.9 + postcss: + specifier: ^8.4.32 + version: 8.5.8 + posthog-docusaurus: + specifier: ^2.0.5 + version: 2.0.5 + prism-react-renderer: + specifier: ^2.4.1 + version: 2.4.1(react@19.2.7) + random-word-slugs: + specifier: ^0.1.7 + version: 0.1.7 + react: + specifier: 'catalog:' + version: 19.2.7 + react-dom: + specifier: 'catalog:' + version: 19.2.7(react@19.2.7) + swiper: + specifier: ^12.2.0 + version: 12.2.0 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19(tsx@4.21.0)(yaml@2.9.0) + devDependencies: + '@docusaurus/module-type-aliases': + specifier: ^3.10.1 + version: 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/tsconfig': + specifier: ^3.10.1 + version: 3.10.1 + '@docusaurus/types': + specifier: ^3.10.1 + version: 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@fec/remark-a11y-emoji': + specifier: ^3.1.0 + version: 3.1.0 + '@tsconfig/docusaurus': + specifier: ^2.0.9 + version: 2.0.9 + '@types/react': + specifier: 'catalog:' + version: 19.2.16 + '@types/react-dom': + specifier: 'catalog:' + version: 19.2.3(@types/react@19.2.16) + cheerio: + specifier: ^1.2.0 + version: 1.2.0 + typescript: + specifier: 'catalog:' + version: 5.9.3 + zod: + specifier: 'catalog:' + version: 4.4.3 apps/nextjs: dependencies: @@ -799,7 +911,7 @@ importers: version: 1.26.0(zod@4.4.3) '@scalar/api-reference-react': specifier: 'catalog:' - version: 0.9.42(react@19.2.7)(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3) + version: 0.9.43(nprogress@0.2.0)(react@19.2.7)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)(zod@4.4.3) '@tabler/icons-react': specifier: 'catalog:' version: 3.44.0(react@19.2.7) @@ -871,7 +983,7 @@ importers: version: 3.16.0(@noble/hashes@2.0.1) jotai: specifier: 'catalog:' - version: 2.20.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.16)(react@19.2.7) + version: 2.20.0(@babel/core@7.29.0)(@babel/template@7.29.7)(@types/react@19.2.16)(react@19.2.7) jszip: specifier: 'catalog:' version: 3.10.1 @@ -919,7 +1031,7 @@ importers: version: 2.2.6 trpc-to-mcp: specifier: 'catalog:' - version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) + version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.15(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) use-deep-compare-effect: specifier: 'catalog:' version: 1.8.1(react@19.2.7) @@ -959,7 +1071,7 @@ importers: version: 9.2.1 node-loader: specifier: 'catalog:' - version: 2.1.0(webpack@5.107.1(postcss@8.5.15)) + version: 2.1.0(webpack@5.107.1(lightningcss@1.32.0)(postcss@8.5.15)) typescript: specifier: 'catalog:' version: 5.9.3 @@ -1229,7 +1341,7 @@ importers: version: 2.2.6 trpc-to-mcp: specifier: 'catalog:' - version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) + version: 1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.15(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3) trpc-to-openapi: specifier: 'catalog:' version: 3.3.0(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.17.0(typescript@5.9.3))(zod-openapi@5.3.0(zod@4.4.3))(zod@4.4.3) @@ -2258,7 +2370,7 @@ importers: version: 3.44.0(react@19.2.7) jotai: specifier: 'catalog:' - version: 2.20.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.16)(react@19.2.7) + version: 2.20.0(@babel/core@7.29.0)(@babel/template@7.29.7)(@types/react@19.2.16)(react@19.2.7) next: specifier: 'catalog:' version: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) @@ -2629,6 +2741,100 @@ packages: peerDependencies: vue: ^3.3.4 + '@algolia/abtesting@1.19.0': + resolution: {integrity: sha512-Lhnez3hhXHk25lfxLAMxvkP4fmN3+1RgADhD2ssMDBYuAsDVReeyP+3SGRx+ntq8ijMrLqUyfvO72TB6jsTteQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.19.2': + resolution: {integrity: sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==} + + '@algolia/autocomplete-core@1.19.8': + resolution: {integrity: sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==} + + '@algolia/autocomplete-plugin-algolia-insights@1.19.2': + resolution: {integrity: sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-plugin-algolia-insights@1.19.8': + resolution: {integrity: sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-shared@1.19.2': + resolution: {integrity: sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.19.8': + resolution: {integrity: sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.53.0': + resolution: {integrity: sha512-0ZjA5Hcmaoz5Lj6OG0zhfIyeqzJZnLW2CRJA1W17UwMFGRtZAJ9yJKRvPEDA6gkpsIoQxORTSW6sWFiuYncPNQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.53.0': + resolution: {integrity: sha512-kWNodP75iiEaOtemC9F/hlxNBG5E2QUjN1BusnE6m2b4l7Qh/BUO3fGCVsmKJI65VO4VKGGmT43ICvHtTcJ2JQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.53.0': + resolution: {integrity: sha512-YPN45TXD9Wrse185t/Ta7nktZsqpv97oOjCzp2sblHnCL6rBc9TDeJAg1IGl2UpdwnSD05Zu/5wLB4watOUMyg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.53.0': + resolution: {integrity: sha512-qAcYTDJE6m924FDDUQvdD6vh7DYaqOeSpFS74IP37/JRV0v4cGBauyxTF2WzDnokUylQDbqreoFIJZfg0Fitmw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.53.0': + resolution: {integrity: sha512-fQaY+DkSJOpuUVUe8MQTwrdiKAqkJGhpDarB08duBn/sUv7Bkib6MDRQauCcWTWTe4HIW+EbwQP9R4kci1V/Yw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.53.0': + resolution: {integrity: sha512-o72tsiEZGfeS/dxL9IADfzcZWGEwKDEe5CvtrBuT//3JR+SHuTtHRI2ZTf7D7bcKagcbojvO8hnkHdfoakSlYg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.53.0': + resolution: {integrity: sha512-Ds16IyPm/dNJPCU8OzApo2gwGrgWT5BYHhE3NFwZbpCveqyvPDB9sZDDkJ5DsdOGT2aC+R3i0/M1OVXF2qdgPg==} + engines: {node: '>= 14.0.0'} + + '@algolia/events@4.0.1': + resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} + + '@algolia/ingestion@1.53.0': + resolution: {integrity: sha512-oNbT6z4NwD8Pou9VPINGlN/tlG1afESh2EbxqnP6rwl95xKVD/Zlciis1PpNeO/9U/rrajc1+7DcfKi03tX1KQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.53.0': + resolution: {integrity: sha512-G+KZb/yd+qAOFn/cEvTGeLxQm8aP3a0od50l3z/ylccY+/o4YG3TNcjU1tFQHW4mXC137GPyR7W70R0kRQDLnA==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.53.0': + resolution: {integrity: sha512-6aVfYd55Un6IUgPLbo84WfgFZlS3L0vA1ttzXL5vahHewUJ8jYgd89TzlWRTeej7w70mb9RWsVlFYGmJ/diQww==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.53.0': + resolution: {integrity: sha512-ke27DqgzCOlt+RbeEdCxtXxMQOnAOi8ujr2wid0DmDKzR95Kw/f9sBsuhBxtjevCqJRJszfRTLY0B1pbO6IhkA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.53.0': + resolution: {integrity: sha512-GngiOqt2Gq4oLno6yXQVj9om+qSO9SWAoduoTOEg79dKZ62brB8OOIvSJG/vDNoanYi6a7Al9uDZwXvi+bcVTg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.53.0': + resolution: {integrity: sha512-6mF9LZMUk0QqWvrnxkxBqhswwz6Xfiwy6/gmTzL5HrlhdVG3ITAqGV2k3XmVThP1h0Ulc3VQwiNCD7/Nr4JNlQ==} + engines: {node: '>= 14.0.0'} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@ark/schema@0.46.0': resolution: {integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==} @@ -2671,10 +2877,18 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.3': resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} @@ -2683,28 +2897,99 @@ packages: resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -2725,6 +3010,14 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.29.2': resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} @@ -2739,6 +3032,335 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': + resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': + resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': + resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7': + resolution: {integrity: sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': + resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': + resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.29.7': + resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.29.7': + resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.29.7': + resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.29.7': + resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.29.7': + resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.29.7': + resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.29.7': + resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.29.7': + resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.29.7': + resolution: {integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.29.7': + resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.29.7': + resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.29.7': + resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.29.7': + resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.29.7': + resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.29.7': + resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.29.7': + resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.29.7': + resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.29.7': + resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.29.7': + resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.29.7': + resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.29.7': + resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-constant-elements@7.29.7': + resolution: {integrity: sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.29.7': + resolution: {integrity: sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.29.7': + resolution: {integrity: sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} @@ -2751,6 +3373,125 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.29.7': + resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.29.7': + resolution: {integrity: sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.29.7': + resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.29.7': + resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.29.7': + resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.29.7': + resolution: {integrity: sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.29.7': + resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.29.7': + resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.29.7': + resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.29.7': + resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.29.7': + resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7': + resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.29.7': + resolution: {integrity: sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.29.7': + resolution: {integrity: sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -2763,10 +3504,18 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -2782,8 +3531,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@better-auth/core@1.6.14': - resolution: {integrity: sha512-12cA7tnR4Wyb3nLpPmeq/Id7QNB+4OhjbzuX7sIhqglgXGjyT5iiNpe2lx/8FF532sHC450Yx1850salCYbkzw==} + '@better-auth/core@1.6.15': + resolution: {integrity: sha512-gPgeEn+2t2cohSKj1CJFCJLo4jNqvtvhKP/y6Uwuurg4ReEf2Y9PUCYffvbp7DDc+GevWTuD0Cv9x0+e83+HpA==} peerDependencies: '@better-auth/utils': 0.4.1 '@better-fetch/fetch': 1.1.21 @@ -2799,46 +3548,46 @@ packages: '@opentelemetry/api': optional: true - '@better-auth/drizzle-adapter@1.6.14': - resolution: {integrity: sha512-lYs1jDudriKYMXNcLFLAvEvOEKbeKBFdDciG4H8qZhV+3+yghGC3f/H5qtgTDc8mGBPV+2tEvVgYqReurOSmNw==} + '@better-auth/drizzle-adapter@1.6.15': + resolution: {integrity: sha512-+ho2RozN6cZmCN+6XkZd/ec5iolVlefgInQ7znJ18qRPbgllHxdyu9tGrgKZyEsXSCyqAa6wi5Yb4hd3WZmTNQ==} peerDependencies: - '@better-auth/core': ^1.6.14 + '@better-auth/core': ^1.6.15 '@better-auth/utils': 0.4.1 drizzle-orm: ^0.45.2 peerDependenciesMeta: drizzle-orm: optional: true - '@better-auth/kysely-adapter@1.6.14': - resolution: {integrity: sha512-A2+381gYADuZpgd98XQ39bnxLzbT03wnnDmSQIXp7XcE3hF093mGMk6rxlAhENVHH7JL2B0Tv2la2o6n+6ppyQ==} + '@better-auth/kysely-adapter@1.6.15': + resolution: {integrity: sha512-E29Sugm+DWRK4oQNBPrjPA4kBYiKy2bBtX1arIlkuyAB9A1BEb4Xn+8t7wlNIF5eFcxpkFZ3F80ceSpWDSYU0Q==} peerDependencies: - '@better-auth/core': ^1.6.14 + '@better-auth/core': ^1.6.15 '@better-auth/utils': 0.4.1 kysely: ^0.28.17 || ^0.29.0 peerDependenciesMeta: kysely: optional: true - '@better-auth/memory-adapter@1.6.14': - resolution: {integrity: sha512-frtBTozi8qsBlypxp33dkiIZT2IOMvix3oh2qTTcBkK11ISsRSTUUadl7DbwXri2AEoooShsH6PSAput920J3Q==} + '@better-auth/memory-adapter@1.6.15': + resolution: {integrity: sha512-BRE5Ft0Tn5thOPjCmyXHge7kOI/paLybaKDU+Hzg24DZMU6JvWooYWzvf52r1viDbxq5tz0G97iyaH4bouDyug==} peerDependencies: - '@better-auth/core': ^1.6.14 + '@better-auth/core': ^1.6.15 '@better-auth/utils': 0.4.1 - '@better-auth/mongo-adapter@1.6.14': - resolution: {integrity: sha512-meaZx712k9c0Cl6urwYZRNa3mAy3/leaYiSNt+hVaCOEPlgTDxzmYMNACvTTYXgh4eCpDVf5G7ZMEYBtejKQdw==} + '@better-auth/mongo-adapter@1.6.15': + resolution: {integrity: sha512-r0X9AtFhwDeOU1KMP9kZ5NeV0O3TSFzn8+uidaH+aicy2e1dNUsd9nPYrozEloSxdA2ZOnv5gD4jzH7HPeKkUQ==} peerDependencies: - '@better-auth/core': ^1.6.14 + '@better-auth/core': ^1.6.15 '@better-auth/utils': 0.4.1 mongodb: ^6.0.0 || ^7.0.0 peerDependenciesMeta: mongodb: optional: true - '@better-auth/prisma-adapter@1.6.14': - resolution: {integrity: sha512-9b9wSqhCthMmOYo0QdX+N/cOv+fNck/JE5CZQuuWwEJl5QeoYhCZesXjts5VfLAPMIf6vKw3QNBrn0SVMXXi2Q==} + '@better-auth/prisma-adapter@1.6.15': + resolution: {integrity: sha512-pUOlIUnpMu2l8C2ytgu46+OoOr3LZ+aLpJMFRGIPdnWl1BF2co2YaoZPT3+ZBu1Lzm0FrBN1ZRCAzZbkFoeIAQ==} peerDependencies: - '@better-auth/core': ^1.6.14 + '@better-auth/core': ^1.6.15 '@better-auth/utils': 0.4.1 '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -2848,10 +3597,10 @@ packages: prisma: optional: true - '@better-auth/telemetry@1.6.14': - resolution: {integrity: sha512-ALi3cEx5eyrFY+TeAdhc1uq8FqJyGvzgvIo7GQZOqGqLZxHY9nte44WN++jBFGJJbsW3e4cgLj8dQK291s6wWQ==} + '@better-auth/telemetry@1.6.15': + resolution: {integrity: sha512-eoFlUPVrVXLML9saHD11OSKKSRCAYETgRgBW4vQF3Y6pCgmThKD9oehYk3kkb/FsRgfqmsocmvAFqsiyjPIygg==} peerDependencies: - '@better-auth/core': ^1.6.14 + '@better-auth/core': ^1.6.15 '@better-auth/utils': 0.4.1 '@better-fetch/fetch': 1.1.21 @@ -2861,10 +3610,16 @@ packages: '@better-fetch/fetch@1.1.21': resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==} + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true + '@chevrotain/types@11.1.2': + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} + '@codemirror/autocomplete@6.20.3': resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} @@ -2909,10 +3664,28 @@ packages: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} + '@csstools/cascade-layer-name-parser@2.0.5': + resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + '@csstools/color-helpers@6.0.2': resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-calc@3.2.0': resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} engines: {node: '>=20.19.0'} @@ -2920,6 +3693,13 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-color-parser@4.1.0': resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} engines: {node: '>=20.19.0'} @@ -2927,6 +3707,12 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms@4.0.0': resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} engines: {node: '>=20.19.0'} @@ -2941,10 +3727,279 @@ packages: css-tree: optional: true + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@csstools/css-tokenizer@4.0.0': resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/postcss-alpha-function@1.0.1': + resolution: {integrity: sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-cascade-layers@5.0.2': + resolution: {integrity: sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-function-display-p3-linear@1.0.1': + resolution: {integrity: sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-function@4.0.12': + resolution: {integrity: sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-mix-function@3.0.12': + resolution: {integrity: sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2': + resolution: {integrity: sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-content-alt-text@2.0.8': + resolution: {integrity: sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-contrast-color-function@2.0.12': + resolution: {integrity: sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-exponential-functions@2.0.9': + resolution: {integrity: sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-font-format-keywords@4.0.0': + resolution: {integrity: sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-gamut-mapping@2.0.11': + resolution: {integrity: sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-gradients-interpolation-method@5.0.12': + resolution: {integrity: sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-hwb-function@4.0.12': + resolution: {integrity: sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-ic-unit@4.0.4': + resolution: {integrity: sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-initial@2.0.1': + resolution: {integrity: sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-is-pseudo-class@5.0.3': + resolution: {integrity: sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-light-dark-function@2.0.11': + resolution: {integrity: sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-float-and-clear@3.0.0': + resolution: {integrity: sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-overflow@2.0.0': + resolution: {integrity: sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-overscroll-behavior@2.0.0': + resolution: {integrity: sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-resize@3.0.0': + resolution: {integrity: sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-viewport-units@3.0.4': + resolution: {integrity: sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-media-minmax@2.0.9': + resolution: {integrity: sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5': + resolution: {integrity: sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-nested-calc@4.0.0': + resolution: {integrity: sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-normalize-display-values@4.0.1': + resolution: {integrity: sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-oklab-function@4.0.12': + resolution: {integrity: sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-position-area-property@1.0.0': + resolution: {integrity: sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-progressive-custom-properties@4.2.1': + resolution: {integrity: sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-property-rule-prelude-list@1.0.0': + resolution: {integrity: sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-random-function@2.0.1': + resolution: {integrity: sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-relative-color-syntax@3.0.12': + resolution: {integrity: sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-scope-pseudo-class@4.0.1': + resolution: {integrity: sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-sign-functions@1.1.4': + resolution: {integrity: sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-stepped-value-functions@4.0.9': + resolution: {integrity: sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-syntax-descriptor-syntax-production@1.0.1': + resolution: {integrity: sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-system-ui-font-family@1.0.0': + resolution: {integrity: sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-text-decoration-shorthand@4.0.3': + resolution: {integrity: sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-trigonometric-functions@4.0.9': + resolution: {integrity: sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-unset-value@4.0.0': + resolution: {integrity: sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/selector-resolve-nested@3.1.0': + resolution: {integrity: sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/utilities@2.0.0': + resolution: {integrity: sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + '@ctrl/deluge@8.0.0': resolution: {integrity: sha512-KKDJpB9gLCwjNsJCbUS0bn9SHMzDILyHrqM2i2ieQjTlVaSjTUDB/cn2RSdSXwy4DLug40yalFRnxoAv1+Tj+Q==} engines: {node: '>=18'} @@ -2974,6 +4029,10 @@ packages: '@dabh/diagnostics@2.0.8': resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: @@ -3002,15 +4061,246 @@ packages: peerDependencies: react: '>=16.8.0' + '@docsearch/core@4.6.3': + resolution: {integrity: sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + + '@docsearch/css@4.6.3': + resolution: {integrity: sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==} + + '@docsearch/react@4.6.3': + resolution: {integrity: sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@docusaurus/babel@3.10.1': + resolution: {integrity: sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==} + engines: {node: '>=20.0'} + + '@docusaurus/bundler@3.10.1': + resolution: {integrity: sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==} + engines: {node: '>=20.0'} + peerDependencies: + '@docusaurus/faster': '*' + peerDependenciesMeta: + '@docusaurus/faster': + optional: true + + '@docusaurus/core@3.10.1': + resolution: {integrity: sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==} + engines: {node: '>=20.0'} + hasBin: true + peerDependencies: + '@docusaurus/faster': '*' + '@mdx-js/react': ^3.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@docusaurus/faster': + optional: true + + '@docusaurus/cssnano-preset@3.10.1': + resolution: {integrity: sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==} + engines: {node: '>=20.0'} + + '@docusaurus/faster@3.10.1': + resolution: {integrity: sha512-XTZhE5C1gZ/DaYYMlSk02dwP5vhpQON5QHVz1s3892mSESAywgWanURpXEDAvt4GvGuq7s+XP8rTWHZvfaJmdQ==} + engines: {node: '>=20.0'} + peerDependencies: + '@docusaurus/types': '*' + + '@docusaurus/logger@3.10.1': + resolution: {integrity: sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==} + engines: {node: '>=20.0'} + + '@docusaurus/mdx-loader@3.10.1': + resolution: {integrity: sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/module-type-aliases@3.10.1': + resolution: {integrity: sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==} + peerDependencies: + react: '*' + react-dom: '*' + + '@docusaurus/plugin-content-blog@3.10.1': + resolution: {integrity: sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==} + engines: {node: '>=20.0'} + peerDependencies: + '@docusaurus/plugin-content-docs': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-content-docs@3.10.1': + resolution: {integrity: sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-content-pages@3.10.1': + resolution: {integrity: sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-css-cascade-layers@3.10.1': + resolution: {integrity: sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==} + engines: {node: '>=20.0'} + + '@docusaurus/plugin-debug@3.10.1': + resolution: {integrity: sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-analytics@3.10.1': + resolution: {integrity: sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-gtag@3.10.1': + resolution: {integrity: sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-tag-manager@3.10.1': + resolution: {integrity: sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-sitemap@3.10.1': + resolution: {integrity: sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-svgr@3.10.1': + resolution: {integrity: sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/preset-classic@3.10.1': + resolution: {integrity: sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/react-loadable@6.0.0': + resolution: {integrity: sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==} + peerDependencies: + react: '*' + + '@docusaurus/theme-classic@3.10.1': + resolution: {integrity: sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-common@3.10.1': + resolution: {integrity: sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==} + engines: {node: '>=20.0'} + peerDependencies: + '@docusaurus/plugin-content-docs': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-mermaid@3.10.1': + resolution: {integrity: sha512-2gxpmln8Pc4EN1oWzshQEx2HTs67jk14v7MmgqGs8ZU7Nm8oihg+fTouof2u4vN8DtB3Fln4cDJu4UprSX1S3Q==} + engines: {node: '>=20.0'} + peerDependencies: + '@mermaid-js/layout-elk': ^0.1.9 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@mermaid-js/layout-elk': + optional: true + + '@docusaurus/theme-search-algolia@3.10.1': + resolution: {integrity: sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-translations@3.10.1': + resolution: {integrity: sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==} + engines: {node: '>=20.0'} + + '@docusaurus/tsconfig@3.10.1': + resolution: {integrity: sha512-rYvB7yqkdqWIpAbDzQljGfM4cDBkLTbhmagZBEcsyj6oPUsz47lmW2pYdN1j+7sGFgltbAmQH62xfbrij4Eh6Q==} + + '@docusaurus/types@3.10.1': + resolution: {integrity: sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/utils-common@3.10.1': + resolution: {integrity: sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==} + engines: {node: '>=20.0'} + + '@docusaurus/utils-validation@3.10.1': + resolution: {integrity: sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==} + engines: {node: '>=20.0'} + + '@docusaurus/utils@3.10.1': + resolution: {integrity: sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==} + engines: {node: '>=20.0'} + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} '@drizzle-team/brocli@0.12.0': resolution: {integrity: sha512-mlUE+rZ8CatQekLhnaiN91Iemdd+e2gFKooGlnRB3oPTL3VghLfX24dx7HrzMNeC1JrIB/0kpsfyty3f5HNfxQ==} + '@emnapi/core@1.11.0': + resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} + '@emnapi/runtime@1.9.1': resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -3521,6 +4811,10 @@ packages: '@fastify/proxy-addr@5.1.0': resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} + '@fec/remark-a11y-emoji@3.1.0': + resolution: {integrity: sha512-cYjCutvrValbQ2dykKhEE6OBTsEGpAJzeJnDtGKXhk2JYkMNSlKPnUk/kRFHH+PHmrAF+FlNIU28XKD+nYy7jQ==} + engines: {node: '>=10.0'} + '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -3545,6 +4839,9 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/vue@1.1.11': + resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} + '@floating-ui/vue@1.1.9': resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} @@ -3599,6 +4896,12 @@ packages: '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@headlessui/tailwindcss@0.2.2': resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==} engines: {node: '>=10'} @@ -3624,6 +4927,12 @@ packages: peerDependencies: hono: '>=4.12.23' + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.3': + resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==} + '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} @@ -3971,6 +5280,14 @@ packages: peerDependencies: axios: ^1.12.0 + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -4005,12 +5322,135 @@ packages: peerDependencies: jsep: ^0.4.0||^1.0.0 + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/base64@17.67.0': + resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@17.67.0': + resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@17.67.0': + resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-core@4.57.6': + resolution: {integrity: sha512-uI++Wx6VkBJqVmkb4ZeExwAVpZiA2Do5NrEtXoDk0Pdvce3ytFXJoviT1sLOj16+qDIMnD5nWPfOhVpnDmRJKg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-fsa@4.57.6': + resolution: {integrity: sha512-pKkw/yC5CzSZKhIIUIsH1przOa+K5jGmZIg1sWaSF24JojyrUFbjcQv7QrcGAudriei6HQ6R0BFj+V8NbQinJw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-builtins@4.57.6': + resolution: {integrity: sha512-V4DgEFT3Cg5S9fCMOZSCVdTxdJWWLBO0WnAazV7hnCM96u5zXHyW/ubDAfcSVwqjkMJ50W1Y44IXtxRoIwaCVg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-to-fsa@4.57.6': + resolution: {integrity: sha512-+JptNw3iifihxH2rEXrninDzX4FFVW8JD/wPR8GbJPAeL9CQUSblrlumOPB5gZuS7tYRX+PJPLtT7XzKoRhv/Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-utils@4.57.6': + resolution: {integrity: sha512-foyUrfS7WmYEUzqYXSNxmJBcSj04TABrkpFabwO9SCDCpVCfJ+qG+2sk5FjfiflG2n0SDFZDCJ6vYlJAEpxJFg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node@4.57.6': + resolution: {integrity: sha512-Kbn1jdkvDN4F2+BhoB6mMu7NCbhP0bgA5NcI1aJj/Q5UcU+I1JLLW+dEQean33iV4tXv35AzBVKPICnDltBpxw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-print@4.57.6': + resolution: {integrity: sha512-96eAn4Dudtt67LTeuU47yUD+pg9/G/oKpI10zei9ljk3X3WK4lYKc+n3cpaPCAbKPzoyfxl0mXm8f8Y7BOSFXw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-snapshot@4.57.6': + resolution: {integrity: sha512-V57CMzbOgTzUWGOWQ8GzHQdpJP6JnrYVNCtTBNxVYEnlVRvo4uEJqHhtAT8vhDFrIuJOXLrTL1Fki4h5oI7xxg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@17.67.0': + resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@17.67.0': + resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@17.67.0': + resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@kubernetes/client-node@1.4.0': resolution: {integrity: sha512-Zge3YvF7DJi264dU1b3wb/GmzR99JhUpqTvp+VGHfwZT+g7EOOYNScDJNZwXy9cszyIGPIs0VHr+kk8e95qqrA==} '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@lezer/common@1.5.2': resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} @@ -4136,6 +5576,18 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@mermaid-js/parser@1.1.1': + resolution: {integrity: sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==} + '@modelcontextprotocol/sdk@1.26.0': resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} engines: {node: '>=18'} @@ -4146,10 +5598,31 @@ packages: '@cfworker/json-schema': optional: true + '@module-federation/error-codes@0.22.0': + resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} + + '@module-federation/runtime-core@0.22.0': + resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} + + '@module-federation/runtime-tools@0.22.0': + resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} + + '@module-federation/runtime@0.22.0': + resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} + + '@module-federation/sdk@0.22.0': + resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} + + '@module-federation/webpack-bundler-runtime@0.22.0': + resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} + '@mswjs/interceptors@0.41.9': resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} engines: {node: '>=18'} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + '@next/env@16.2.7': resolution: {integrity: sha512-tMJizPlj6ZYpBMMdK8S0LJufrP4QTdR6pcv9KQ/bVETPAmg0j1mlHE9G2c38UyGHxoBapgwuj7XjbGJ2RcDFOg==} @@ -4205,10 +5678,67 @@ packages: cpu: [x64] os: [win32] + '@nivo/annotations@0.99.0': + resolution: {integrity: sha512-jCuuXPbvpaqaz4xF7k5dv0OT2ubn5Nt0gWryuTe/8oVsC/9bzSuK8bM9vBty60m9tfO+X8vUYliuaCDwGksC2g==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/axes@0.99.0': + resolution: {integrity: sha512-3KschnmEL0acRoa7INSSOSEFwJLm54aZwSev7/r8XxXlkgRBriu6ReZy/FG0wfN+ljZ4GMvx+XyIIf6kxzvrZg==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/colors@0.99.0': + resolution: {integrity: sha512-hyYt4lEFIfXOUmQ6k3HXm3KwhcgoJpocmoGzLUqzk7DzuhQYJo+4d5jIGGU0N/a70+9XbHIdpKNSblHAIASD3w==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/core@0.99.0': + resolution: {integrity: sha512-olCItqhPG3xHL5ei+vg52aB6o+6S+xR2idpkd9RormTTUniZb8U2rOdcQojOojPY5i9kVeQyLFBpV4YfM7OZ9g==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/legends@0.99.0': + resolution: {integrity: sha512-P16FjFqNceuTTZphINAh5p0RF0opu3cCKoWppe2aRD9IuVkvRm/wS5K1YwMCxDzKyKh5v0AuTlu9K6o3/hk8hA==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/line@0.99.0': + resolution: {integrity: sha512-bAqTXSjpnpcGMs341qWFUi7hJTqQiNoSeJHsYPuPS3icuXPcp3WETQH+zRZACeEF79ZigeOWCW+dzODgne1y9w==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/scales@0.99.0': + resolution: {integrity: sha512-g/2K4L6L8si6E2BWAHtFVGahtDKbUcO6xHJtlIZMwdzaJc7yB16EpWLK8AfI/A42KadLhJSJqBK3mty+c7YZ+w==} + + '@nivo/text@0.99.0': + resolution: {integrity: sha512-ho3oZpAZApsJNjsIL5WJSAdg/wjzTBcwo1KiHBlRGUmD+yUWO8qp7V+mnYRhJchwygtRVALlPgZ/rlcW2Xr/MQ==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/theming@0.99.0': + resolution: {integrity: sha512-KvXlf0nqBzh/g2hAIV9bzscYvpq1uuO3TnFN3RDXGI72CrbbZFTGzprPju3sy/myVsauv+Bb+V4f5TZ0jkYKRg==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/tooltip@0.99.0': + resolution: {integrity: sha512-weoEGR3xAetV4k2P6k96cdamGzKQ5F2Pq+uyDaHr1P3HYArM879Pl+x+TkU0aWjP6wgUZPx/GOBiV1Hb1JxIqg==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + + '@nivo/voronoi@0.99.0': + resolution: {integrity: sha512-KfmMdidbYzhiUCki1FG4X4nHEFT4loK8G5bMBnmCl9U+S78W+gvkfrgD2Aoqp/Q9yKQvr3Y8UcZKSFZnn3HgjQ==} + peerDependencies: + react: ^16.14 || ^17.0 || ^18.0 || ^19.0 + '@noble/ciphers@2.2.0': resolution: {integrity: sha512-Z6pjIZ/8IJcCGzb2S/0Px5J81yij85xASuk1teLNeg75bfT07MV3a/O2Mtn1I2se43k3lkVEcFaR10N4cgQcZA==} engines: {node: '>= 20.19.0'} + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + '@noble/hashes@2.0.1': resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} engines: {node: '>= 20.19.0'} @@ -4216,6 +5746,18 @@ packages: '@nodable/entities@2.1.0': resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@oazapfts/runtime@1.2.0': resolution: {integrity: sha512-fi7dp7dNayyh/vzqhf0ZdoPfC7tJvYfjaE8MBL1yR+iIsH7cFoqHt+DV70VU49OMCqLc7wQa+yVJcSmIRnV4wA==} @@ -4678,6 +6220,43 @@ packages: resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} + '@peculiar/asn1-cms@2.7.0': + resolution: {integrity: sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==} + + '@peculiar/asn1-csr@2.7.0': + resolution: {integrity: sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==} + + '@peculiar/asn1-ecc@2.7.0': + resolution: {integrity: sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==} + + '@peculiar/asn1-pfx@2.7.0': + resolution: {integrity: sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==} + + '@peculiar/asn1-pkcs8@2.7.0': + resolution: {integrity: sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==} + + '@peculiar/asn1-pkcs9@2.7.0': + resolution: {integrity: sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==} + + '@peculiar/asn1-rsa@2.7.0': + resolution: {integrity: sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==} + + '@peculiar/asn1-schema@2.7.0': + resolution: {integrity: sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==} + + '@peculiar/asn1-x509-attr@2.7.0': + resolution: {integrity: sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==} + + '@peculiar/asn1-x509@2.7.0': + resolution: {integrity: sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==} + + '@peculiar/utils@2.0.3': + resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} + + '@peculiar/x509@1.14.3': + resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} + engines: {node: '>=20.0.0'} + '@petamoriken/float16@3.9.3': resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} @@ -4745,6 +6324,33 @@ packages: resolution: {integrity: sha512-OWOaE7Ieufo7VMv957iahOzv/w5oXyyXO28Jh2x6rLU96ZLqC508kAKTgdMJRXgVjda2s+/0C6Kno+k16OmJsQ==} engines: {bun: '>=1.0.0', node: '>=20.0.0'} + '@react-spring/animated@10.1.0': + resolution: {integrity: sha512-dvGVSfNYhbkzTAnyB1S1940ZiKp6/Ey+b2vQc70dJ5k6gzH/GdlfeDzCh65V94b6OPqF7Xl4VUICVUQpc07iUg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@react-spring/core@10.1.0': + resolution: {integrity: sha512-XUG3UCCCxay6lYjBU2KOKzEgC1sx/w44ouB5gRh2Ex6rVJOdPcGVg7JJUIOAQo7uhKGfQdCQU4qUZaQnmInZPQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@react-spring/rafz@10.1.0': + resolution: {integrity: sha512-e/LRnNmvmg8Agl4j3MGcjHuSTSBcCrxr3xeoWdodxpLWeTHY1pHl8PJDOCEJ2Pj6BMdEBaWFRAX7uxRo1FLzCg==} + + '@react-spring/shared@10.1.0': + resolution: {integrity: sha512-ogIUujWxdwcsQ2Vp2hZs+KehvH8tKeWGHsFb1eRBYoePzhKS541Qg1JfFlQ7ursBUwwPDBQ5Wpwn+Cwx6WV1PQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@react-spring/types@10.1.0': + resolution: {integrity: sha512-RkJAlkAZ5yZSRBMOSidamioBHLjf8wGKbtr3pZ5iKoHFNQuNM2k6DqJDIEUcNQlWRZXny6Eqys2c9NdugdbdyQ==} + + '@react-spring/web@10.1.0': + resolution: {integrity: sha512-mIj/lJ+1eI4tLSkIloaSNjmuriTDZY9bbQ/GFGcbVGfOKzWb5JOMMKiuHACh8J3m0+se3KqcWdg/JoALVloE7g==} + 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 + '@redis/bloom@1.2.0': resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} peerDependencies: @@ -4939,33 +6545,101 @@ packages: cpu: [x64] os: [win32] + '@rspack/binding-darwin-arm64@1.7.11': + resolution: {integrity: sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.7.11': + resolution: {integrity: sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.7.11': + resolution: {integrity: sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rspack/binding-linux-arm64-musl@1.7.11': + resolution: {integrity: sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rspack/binding-linux-x64-gnu@1.7.11': + resolution: {integrity: sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rspack/binding-linux-x64-musl@1.7.11': + resolution: {integrity: sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rspack/binding-wasm32-wasi@1.7.11': + resolution: {integrity: sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.7.11': + resolution: {integrity: sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.7.11': + resolution: {integrity: sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.7.11': + resolution: {integrity: sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.7.11': + resolution: {integrity: sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==} + + '@rspack/core@1.7.11': + resolution: {integrity: sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + '@rvf/set-get@7.0.1': resolution: {integrity: sha512-GkTSn9K1GrTYoTUqlUs36k6nJnzjQaFBTTEIqUYmzBcsGsoJM8xG7EAx2WLHWAA4QzFjcwWUSHQ3vM3Fbw50Tg==} - '@scalar/agent-chat@0.12.6': - resolution: {integrity: sha512-4JvCq8sFJNigpuc8gayIAV+5hwX1RG/klZ3KagPxn/uJmLfMCSeQyHPqVRutl9uommZOdm3ByVqH7bkQrId/Jg==} + '@scalar/agent-chat@0.12.7': + resolution: {integrity: sha512-o9kdKtvmViRSQGPXNrh4oLD7e4Y/f3uT4NMw3IrWwnIHQEXSUO+ixDSSHfhXHA7GouvJu4i2riZIcIyR0vXEqw==} engines: {node: '>=22'} - '@scalar/api-client@3.9.0': - resolution: {integrity: sha512-vwMKEsVsygz0tQg0cylzXs5XzkLWm2xAUpJSd2Jim1YEjc1a9GdnIduVE6QLh9iQnDrwilPcVRXYXZpkzFZNxg==} + '@scalar/api-client@3.10.0': + resolution: {integrity: sha512-Ta4IMvBa8dKF6uLJsJpdvhV8M2uSGlg7udo/AgVlT3YBXBoZC5dZnNfCJI0mDApFk6F2+IQf/ibCaMEXeKI/sA==} engines: {node: '>=22'} - '@scalar/api-reference-react@0.9.42': - resolution: {integrity: sha512-8QttZlGYkq09N0/2M1IELlPG8JHCtIiIc4TCGWf+wVZWU/Y1Jx85mtnup1VC3UqoUsXQFeOg9/PE4URuuRmEAQ==} + '@scalar/api-reference-react@0.9.43': + resolution: {integrity: sha512-a9K8hOkPS8aL+OkB/+Cb1v+lEo5VOyG4RqCwNnamEFJeIhl2099XRDy1QY5Jeni1q/1kWycduaAdCeoOvY171g==} engines: {node: '>=22'} peerDependencies: react: ^18.0.0 || ^19.0.0 - '@scalar/api-reference@1.58.0': - resolution: {integrity: sha512-XWaKsnIRMjXp0h99LLZA7NIPePqIJPLkFJXkH1mg52jBIVZ05Ma5PbLBo+ZyQFPYsELdLxoFsgD5KfJ8HNtk9Q==} + '@scalar/api-reference@1.59.0': + resolution: {integrity: sha512-foRwtltkWncjUlUYQ83xx6+dk+zovMcKtm10EIyT0TGozOD5rWFQdwxTHmjyLCfIbWZedVpCFOoyZMdlh8NI0Q==} engines: {node: '>=22'} '@scalar/code-highlight@0.3.4': resolution: {integrity: sha512-gGr3D8bfInwZDHsxamYIaG72Wr+kRNX8d4zcOflAfQJ0ZfvqoVbYhhkiSd6K+DLySItK9lWl/cgjJdtKWlT2ig==} engines: {node: '>=22'} - '@scalar/components@0.26.1': - resolution: {integrity: sha512-O9Oc+N3JCF1DIYFdV5QD19alBoIsUCofX4P1oKwT5FgOOIVslhldpxP9EJUVf1YnB0foijhn8Yf2pDsgJwAM5g==} + '@scalar/components@0.27.0': + resolution: {integrity: sha512-ffR/a3aJZyrvxmpYByd4KLNtkb+sM/lYZvTocaLLcLtrqtbCh4TwPK7LIyw5OX9g08PTakY4YSDMYu/QOBWIjw==} engines: {node: '>=22'} '@scalar/helpers@0.8.1': @@ -4980,8 +6654,8 @@ packages: resolution: {integrity: sha512-ZYgdYZ0jSZXQeyhG2lJ20FjzvKsaDRXk4bPguF/Ytl2nGBh9a6RIIr9NvVy4zAD67a/ahm+xipXlfoR1KtB5fg==} engines: {node: '>=22'} - '@scalar/oas-utils@0.18.0': - resolution: {integrity: sha512-UhfB2FbXYSsJ3hylDbfvB75jcGMq8MmRPblhxbnw59RC3c5JyyXL5uAl/ZF4yKO55hXTXPTj/zmf0yNi3T06rw==} + '@scalar/oas-utils@0.18.1': + resolution: {integrity: sha512-EZFXOCyS3fwkyW2cHPwvUIwA4+thiGKGdP72uQXKKPg1INfqrOjVKdSZU4uAtws7HIGucjc5MgpZuBq0rPT8yQ==} engines: {node: '>=22'} '@scalar/openapi-types@0.9.1': @@ -4992,27 +6666,27 @@ packages: resolution: {integrity: sha512-D5b0rGLLZgmkO9mdW2j/ND1KBlH1u3RCpr87HPxv9P9ZSr6PtM5iLqFOJq0ACiaHjY2mikCrxgDmnUEhTzRpHQ==} engines: {node: '>=22'} - '@scalar/schemas@0.3.3': - resolution: {integrity: sha512-qDcgFu6ta5Z90L9D2P6DFKzYesU+FW5+m55SGmdI4iRMRCwj5umHpec2Y2W/SJcCF6bbUZawMxuOH2Ja6rUNpQ==} + '@scalar/schemas@0.4.0': + resolution: {integrity: sha512-xKonRX7zGhNX03/N15gtko7Lxz8Ck655nL7YnBSxlv7BHoKkt7n3R1bXYeHhqvhk+02HFKsKpUCuwxm4UQ6KZw==} engines: {node: '>=22'} - '@scalar/sidebar@0.9.18': - resolution: {integrity: sha512-ltLPDvBjkVrakrnJ9uQGYv3yVhB0azEh6MBSR5MtndVHUt4PuvN7wR5xVIbkb9CrPJhFlKUb05ykv2nltMDciw==} + '@scalar/sidebar@0.9.19': + resolution: {integrity: sha512-8n0zPehB4zZrjnLfiSryA7yJT/epqWjLx3Orc0aKyEOeG5YJIYwaqMLJmvUC8pc+Qa2GuLf9mmBGjIDVFc1Vrg==} engines: {node: '>=22'} - '@scalar/snippetz@0.9.12': - resolution: {integrity: sha512-Awbl/1uwucA8kUpePI3x4rPRY1TZ4Wg54pIA75uirFd678caCnPP4GNF7+WB1wonHTTWgvtDVnX7zKJnYGti0g==} + '@scalar/snippetz@0.9.13': + resolution: {integrity: sha512-F0LXIT/jeidAkTJHp98UO4KRBV9hF1Osuka3+4AqfVaDUcjObQx3iasd56lCvPR+puqbQP+eDvVviFhBfeyPtA==} engines: {node: '>=22'} - '@scalar/themes@0.15.6': - resolution: {integrity: sha512-s55reSoqbkct1opGATiW3upXGeehiMLBhW5Rv8ATZgtAxUJBlIRdmObUtz8mC3WZMzq3FkSxALJKRLSCjWTdVw==} + '@scalar/themes@0.16.0': + resolution: {integrity: sha512-xcd5cdouNKGGI+D3v4SVm5WVLjiLDPT0jBiZrNA6m/h2yDaIeFoXMDrH61aj962Y+P7KR33/2b0xLHgws5Os8Q==} engines: {node: '>=22'} '@scalar/typebox@0.1.3': resolution: {integrity: sha512-lU055AUccECZMIfGA0z/C1StYmboAYIPJLDFBzOO81yXBi35Pxdq+I4fWX6iUZ8qcoHneiLGk9jAUM1rA93iEg==} - '@scalar/types@0.12.3': - resolution: {integrity: sha512-7zaXafbgTFmsJ/9AwYeExUWzXoZNyKOL0SEVAUWRaOndcjxpFCtwzuPrc1elMEWdHopWbY1Qe5pWKbE2aqG2HA==} + '@scalar/types@0.13.0': + resolution: {integrity: sha512-Phbv5YoBBFipOGH2FkS3omVxomKsTH6KvAcL4ybFOH3iVsrpIOW6die13PtH+lDdfWqE9MK31hVh5ZcxXY+ngQ==} engines: {node: '>=22'} '@scalar/use-codemirror@0.14.11': @@ -5031,8 +6705,8 @@ packages: resolution: {integrity: sha512-tpmmG+/xRE2Kn9RpflU3AIyZv08v10+E1ZrJCx7z6+/91zHVxy0M73kC1LT4/8PbYNt85ywyC8+n+D99JdMcGA==} engines: {node: '>=20'} - '@scalar/workspace-store@0.53.0': - resolution: {integrity: sha512-rbSuzAXKTXhjwdFERI4AYKj+dQVQW5jAPNH1GEUz0NgFcn9r5DgXraFv4z9EtmkpKHejj2ORSLgWfb5sUVCOWw==} + '@scalar/workspace-store@0.54.0': + resolution: {integrity: sha512-51jLDHeiaWC/rTySR+M+ok9wdQ6BYF+7wPT3WFK/dIuqTU5KtHA/nKQl4xfflVXLBqcJ6o6TDDVbNcTLFMVZmQ==} engines: {node: '>=22'} '@schummar/icu-type-parser@1.21.5': @@ -5085,14 +6759,45 @@ packages: peerDependencies: semantic-release: '>=20.1.0' + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@signalwire/docusaurus-plugin-llms-txt@1.2.2': + resolution: {integrity: sha512-Qo5ZBDZpyXFlcrWwise77vs6B0R3m3/qjIIm1IHf4VzW6sVYgaR/y46BJwoAxMrV3WJkn0CVGpyYC+pMASFBZw==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@docusaurus/core': ^3.0.0 + + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@slorber/react-helmet-async@1.3.0': + resolution: {integrity: sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@slorber/remark-comment@1.0.0': + resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + '@so-ric/colorspace@1.1.6': resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} @@ -5102,6 +6807,84 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/plugin-svgo@8.1.0': + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/webpack@8.1.0': + resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} + engines: {node: '>=14'} + '@swc/core-darwin-arm64@1.15.3': resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==} engines: {node: '>=10'} @@ -5181,9 +6964,95 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/html-darwin-arm64@1.15.40': + resolution: {integrity: sha512-A9oxSh60pMEsX/4VBpn3e6s8DfGWsHzAeG+Vd9mXgkTqt/ouX12owP6RyqfqK8v0WuEsBKkGY0+MbwLvlOG8NQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/html-darwin-x64@1.15.40': + resolution: {integrity: sha512-GZ5KxJ/1pqnpOAjaa9hnkSk3M1LHjc5ci5GCt5/llAgDKFLDHzydIflHXTOIaS4nRCtfVMmD0joKX+ZWruSkJw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/html-linux-arm-gnueabihf@1.15.40': + resolution: {integrity: sha512-Bbwtl0G6vYcWlDQmjeuyFx8YIvqi1StlQWjRNB1ZtvrRNL3JadFARhijBONiUIyTK9MgUbWtTV3QU69qzjNENQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/html-linux-arm64-gnu@1.15.40': + resolution: {integrity: sha512-buu4fGyCIhkwmCetI4CfWOPn7cphJHwQ9ksK685hlL0R0PUaDCNdIxo+JAz0mK2JgPhoGqnKsVEmV6gLIL5GBw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@swc/html-linux-arm64-musl@1.15.40': + resolution: {integrity: sha512-BwWtpAGEHIP1QwKExWqBIjGpAHMahjT26ORZv3+TbwW4IuEl2QP5FrcYc30O8abCG5J1lWRl1vXKYDpzbIDz1A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@swc/html-linux-ppc64-gnu@1.15.40': + resolution: {integrity: sha512-wLtHgwmZu5K7PvuTROklgWJO6D+KwywpYR1geI8dSWX/AYnx/KCGVK9ncPzWVfnLXWhXbkgua3Ujdrfoxf+qSw==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@swc/html-linux-s390x-gnu@1.15.40': + resolution: {integrity: sha512-WbWzQBCmvECZG6ep9D5SMMZTFCbFmRSCc7lPD3YhhaK16BNqr1AybvybZYOgxX9Ot5tq7gTWCgjFZXLDOn6Y/g==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@swc/html-linux-x64-gnu@1.15.40': + resolution: {integrity: sha512-i+/JqL5j9mTGMcVshWLMzciqyE3Np+gN5+UqMyO1D5zSmniJD5MHRlGXCtLaWx/MIKX0Q4Xkre33o56fmxp+uA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@swc/html-linux-x64-musl@1.15.40': + resolution: {integrity: sha512-mroZnb5omFc4iE01UsJgta+Nm0sIFWpGfTPk+BHfH165MZAM4wNndeczX5RpGZbQSF1nNpCoNgqJyT7l3hITMg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@swc/html-win32-arm64-msvc@1.15.40': + resolution: {integrity: sha512-qg1LXRrsY9FXy0S7vouSF0kkn1vdkTD//FW66iuezH7HMm5/DJGwEj7oc1zTKPWU0HnwOINOUbl6rUHrRuXHAQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/html-win32-ia32-msvc@1.15.40': + resolution: {integrity: sha512-5NwMmgt9A70LQzcYOl4OiIJk5AhsGP69fNRfkmXXop+iIcAGUmYy+d6F2/Gc0u05j9G0R04NPWcHBQrHQhr0Gw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/html-win32-x64-msvc@1.15.40': + resolution: {integrity: sha512-WUNZqCZ+8WY1pr8t3X3fq4gI5+FL/tCCzlrJ2lLn0s+TyA2SLm/RPfXxQIr94EnjJWcIV21G//6/uXeBN8cPzw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/html@1.15.40': + resolution: {integrity: sha512-YVWNrh3wZWH2oXz7uL+s1WZbFIsnAp9cCl/b+C7ufDJqhsOvbr0un9IOYZ/CxRIRdnHGfhVD199n8baD/kRQew==} + engines: {node: '>=14'} + '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + '@t3-oss/env-core@0.13.11': resolution: {integrity: sha512-sM7GYY+KL7H/Hl0BE0inWfk3nRHZOLhmVn7sHGxaZt9FAR6KqREXAE+6TqKfiavfXmpRxO/OZ2QgKRd+oiBYRQ==} peerDependencies: @@ -5565,6 +7434,9 @@ packages: react: '>=18.2.0' typescript: '>=5.7.2' + '@tsconfig/docusaurus@2.0.9': + resolution: {integrity: sha512-0jVxZCgy2v7TnJrW9kVNikNwJHeiWb68Zhiiw2vHw4tzBFSP5vS2zn3O5EY2oPEVz5dXZRkK7MnWG3Ay5q0mIg==} + '@turbo/darwin-64@2.9.16': resolution: {integrity: sha512-jLjApWTSNd7JZ5JaLYfelW1ytnGQOvB7ivl+2RD1xQvJTbi8I9gBjzcga7tDZVPyaxpl10YTfJt3BrYXR18KDw==} cpu: [x64] @@ -5599,6 +7471,9 @@ packages: cpu: [arm64] os: [win32] + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/adm-zip@0.5.8': resolution: {integrity: sha512-RVVH7QvZYbN+ihqZ4kX/dMiowf6o+Jk1fNwiSdx0NahBJLU787zkULhGhJM8mf/obmLGmgdMM0bXsQTmyfbR7Q==} @@ -5626,12 +7501,18 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} '@types/chroma-js@3.1.2': resolution: {integrity: sha512-YBTQqArPN8A0niHXCwrO1z5x++a+6l0mLBykncUpr23oIPW7L4h39s6gokdK/bDrPmSh8+TjMmrhBPnyiaWPmQ==} + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -5647,30 +7528,108 @@ packages: '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + '@types/d3-color@3.1.3': resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + '@types/d3-ease@3.0.2': resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@1.4.5': + resolution: {integrity: sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + '@types/d3-interpolate@3.0.4': resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} '@types/d3-path@3.1.1': resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + '@types/d3-scale@4.0.9': resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + '@types/d3-shape@3.1.7': resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + '@types/d3-time-format@2.3.4': + resolution: {integrity: sha512-xdDXbpVO74EvadI3UDxjxTdR6QIxm1FKzEA/+F8tL4GWWUg/hgvBqf6chql64U5A9ZUGWo7pEu4eNlyLwbKdhg==} + + '@types/d3-time-format@3.0.4': + resolution: {integrity: sha512-or9DiDnYI1h38J9hxKEsw513+KVuFbEVhl7qdxcaudoiqWWepapUen+2vAriFGexr6W5+P4l9+HJrB39GG+oRg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@1.1.4': + resolution: {integrity: sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==} + '@types/d3-time@3.0.4': resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -5695,15 +7654,45 @@ packages: '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/gtag.js@0.0.20': + resolution: {integrity: sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==} + '@types/har-format@1.2.16': resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/history@4.7.11': + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-proxy@1.17.17': + resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -5716,6 +7705,9 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -5728,6 +7720,9 @@ packages: '@types/node-unifi@2.5.1': resolution: {integrity: sha512-NgZ7Q7k6CehvneroTcqeeJT3lcpQEAyntwF8XA6QFwHsNIo0ZC7Ba5d1kCmBkRZU7+oX6YDlCLflYbbzEJPvbg==} + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + '@types/node@18.19.50': resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==} @@ -5765,24 +7760,45 @@ packages: peerDependencies: '@types/react': ^19.2.0 + '@types/react-router-config@5.0.11': + resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} + + '@types/react-router-dom@5.3.3': + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + + '@types/react-router@5.1.20': + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + '@types/react@18.3.31': resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} '@types/react@19.2.16': resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} '@types/set-cookie-parser@2.4.10': resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + '@types/ssh2-streams@0.1.12': resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} @@ -5828,6 +7844,12 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@umami/node@0.4.0': resolution: {integrity: sha512-pyphprbiF7KiDSc+SWZ4/rVM8B5vU27zIiFfEPj2lEqczpI4xAKSp+dM3tlzyRAWJL32fcbCfAaLGhJZQV13Rg==} @@ -5840,6 +7862,9 @@ packages: peerDependencies: vue: '>=3.5.18' + '@upsetjs/venn.js@2.0.0': + resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + '@vercel/oidc@3.1.0': resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} engines: {node: '>= 20'} @@ -6077,6 +8102,10 @@ packages: abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -6092,11 +8121,19 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + adm-zip@0.5.17: resolution: {integrity: sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==} engines: {node: '>=12.0'} @@ -6142,18 +8179,43 @@ packages: ajv: optional: true + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + algoliasearch-helper@3.29.1: + resolution: {integrity: sha512-6ck2YFudF2Pje7szQoPBiRFTGfd+1I+0I/WfLPGn0bj1kvrFoOQmNyedNiDxTk3/r4IfSLDYk+RA4G7u8H6+yA==} + peerDependencies: + algoliasearch: '>= 3.1 < 6' + + algoliasearch@5.53.0: + resolution: {integrity: sha512-OGW1q6b91CRSSeiOnM8LxuR5NYJ2esvw66jUZ4IIvdv+ItNkx3pwLuyR+jaCdbGee4ov5WgUnyPryyh11xvByQ==} + engines: {node: '>= 14.0.0'} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-escapes@7.0.0: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -6174,9 +8236,17 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@3.17.0: + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} @@ -6185,6 +8255,12 @@ packages: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -6198,15 +8274,30 @@ packages: arktype@2.1.20: resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + asn1js@3.0.10: + resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} + engines: {node: '>=12.0.0'} + ast-v8-to-istanbul@1.0.0: resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + async-lock@1.4.1: resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} @@ -6224,6 +8315,13 @@ packages: resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} engines: {node: '>=4'} + 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 + avvio@9.2.0: resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} @@ -6240,6 +8338,36 @@ packages: b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + babel-loader@9.2.1: + resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + + babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.14.2: + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-react-compiler@1.0.0: resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} @@ -6291,6 +8419,12 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -6301,8 +8435,8 @@ packages: before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} - better-auth@1.6.14: - resolution: {integrity: sha512-c0/DvTQGDpgfj1knekCpQrg6PSWGDtfAtP7Ou6FkAhoE3RNnnIxLB5qKj6tRg53a1xsq93G6T68cNxrUZ7ZVmw==} + better-auth@1.6.15: + resolution: {integrity: sha512-0nuQuEru3ZrLF+9xFUuN3llAmR+6gHLtLunoXaZxB9lXGjSmfBcc6SZUgYq4DfzugPnLvdnzYazsyprZFSFC4Q==} peerDependencies: '@lynx-js/react': '*' '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -6384,19 +8518,41 @@ packages: bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@1.20.5: + resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.2: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} + bonjour-service@1.4.0: + resolution: {integrity: sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + boxen@6.2.1: + resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + brace-expansion@5.0.6: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} @@ -6427,18 +8583,42 @@ packages: resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} engines: {node: '>=10.0.0'} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + byline@5.0.0: resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} engines: {node: '>=0.10.0'} + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + bytestreamjs@2.0.1: + resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} + engines: {node: '>=6.0.0'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -6447,10 +8627,24 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-lite@1.0.30001793: resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} @@ -6496,6 +8690,21 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} + engines: {node: '>=20.18.1'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} @@ -6510,6 +8719,14 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -6518,6 +8735,10 @@ packages: resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==} engines: {node: '>=14.16'} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + cli-highlight@2.1.11: resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -6545,6 +8766,10 @@ packages: resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} engines: {node: '>=20'} + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -6561,6 +8786,9 @@ packages: resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} engines: {node: '>=8.0.0'} + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -6590,6 +8818,16 @@ packages: resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} engines: {node: '>=18'} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combine-promises@1.2.0: + resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==} + engines: {node: '>=10'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -6597,6 +8835,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -6604,6 +8846,25 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -6611,6 +8872,14 @@ packages: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} engines: {node: '>= 14'} + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + concurrently@9.2.1: resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} engines: {node: '>=18'} @@ -6619,6 +8888,26 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} @@ -6666,6 +8955,9 @@ packages: cookie-es@3.0.1: resolution: {integrity: sha512-1HqK6V6Prrm7cHzmjtCzfa370ljqPQoNeWIh5NXYqWwUI2l3DZlzjHHh25ZvJIPfwkiYnCvHykE2MIJkEVD1Rg==} + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -6686,6 +8978,22 @@ packages: resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} engines: {node: '>=18'} + copy-text-to-clipboard@3.2.2: + resolution: {integrity: sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==} + engines: {node: '>=12'} + + copy-webpack-plugin@11.0.0: + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + + core-js@3.49.0: + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -6693,6 +9001,21 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -6741,15 +9064,128 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} + css-blank-pseudo@7.0.1: + resolution: {integrity: sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-declaration-sorter@7.4.0: + resolution: {integrity: sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + + css-has-pseudo@7.0.3: + resolution: {integrity: sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-loader@6.11.0: + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-minimizer-webpack-plugin@5.0.1: + resolution: {integrity: sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + + css-prefers-color-scheme@10.0.0: + resolution: {integrity: sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssdb@8.9.0: + resolution: {integrity: sha512-J8jOU/hLjaXcO1LldOLraJSQpfLXRKof0I7mtbRyOy2AAXgqst0x9rlgi2qXeD6d0ou3ZLqcPAMqYVbpCbrxEw==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + cssnano-preset-advanced@6.1.2: + resolution: {integrity: sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-preset-default@6.1.2: + resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-utils@4.0.2: + resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano@6.1.2: + resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -6761,42 +9197,146 @@ packages: typescript: optional: true + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.34.0: + resolution: {integrity: sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + d3-color@3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + d3-ease@3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@1.4.5: + resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} + d3-format@3.1.0: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + d3-interpolate@3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + d3-path@3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + d3-scale@4.0.2: resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} engines: {node: '>=12'} + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} engines: {node: '>=12'} + d3-time-format@3.0.0: + resolution: {integrity: sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==} + d3-time-format@4.1.0: resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} engines: {node: '>=12'} + d3-time@1.1.0: + resolution: {integrity: sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==} + d3-time@3.1.0: resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} engines: {node: '>=12'} @@ -6805,6 +9345,23 @@ packages: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.14: + resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} + data-urls@7.0.0: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -6812,6 +9369,17 @@ packages: dayjs@1.11.21: resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -6846,9 +9414,40 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delaunator@5.1.0: + resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -6857,6 +9456,10 @@ packages: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -6868,6 +9471,10 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -6880,16 +9487,38 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} + hasBin: true + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dns-caching@0.2.9: resolution: {integrity: sha512-FSvmI/dC/HXYIyX2m7MvQt36Yut49GCw3hWaDqaTgLLmKyLs5lmv/jhmNKqWjSF2vRGTgFYL0G3mwcjLlKXj0w==} + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + docker-compose@1.4.2: resolution: {integrity: sha512-rPHigTKGaEHpkUmfd69QgaOp+Os5vGJwG/Ry8lcr8W/382AmI+z/D7qoa9BybKIkqNppaIbs8RYeHSevdQjWww==} engines: {node: '>= 6.0.0'} @@ -6902,19 +9531,60 @@ packages: resolution: {integrity: sha512-C52mvJ+7lcyhWNfrzVfFsbTrBfy/ezE9FGEYLpu17FUeBcCkxERk9nN7uDl/478ynDiQ4U+5DbQC2vENHkVEtQ==} engines: {node: '>= 14.17'} + docusaurus-plugin-image-zoom@3.0.1: + resolution: {integrity: sha512-mQrqA99VpoMQJNbi02qkWAMVNC4+kwc6zLLMNzraHAJlwn+HrlUmZSEDcTwgn+H4herYNxHKxveE2WsYy73eGw==} + peerDependencies: + '@docusaurus/theme-classic': '>=3.0.0' + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + dompurify@3.4.7: + resolution: {integrity: sha512-2jBxDJY4RR06tQNy4w5FlFH7kfxsQZlufd0sbv+chfHCxeJwrFw2baUDsSwvBISD4K4RDbd0PTfy3uNXsR6siA==} + dompurify@3.4.8: resolution: {integrity: sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==} + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dotenv-cli@11.0.0: resolution: {integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==} hasBin: true @@ -7040,6 +9710,9 @@ packages: duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -7065,6 +9738,9 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} + emoticon@4.1.0: + resolution: {integrity: sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==} + enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} @@ -7072,6 +9748,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -7079,6 +9758,13 @@ packages: resolution: {integrity: sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==} engines: {node: '>=10.13.0'} + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -7135,6 +9821,12 @@ packages: es-toolkit@1.46.1: resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -7154,6 +9846,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -7161,6 +9857,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} @@ -7169,6 +9869,11 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -7181,19 +9886,49 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -7204,6 +9939,9 @@ packages: eventemitter3@2.0.3: resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} @@ -7245,10 +9983,18 @@ packages: peerDependencies: express: '>= 4.11' + express@4.22.2: + resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} + engines: {node: '>= 0.10.0'} + express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -7271,6 +10017,13 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stringify@6.3.0: resolution: {integrity: sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==} @@ -7302,6 +10055,13 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -7314,6 +10074,10 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -7325,6 +10089,12 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + file-selector@2.1.2: resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==} engines: {node: '>= 12'} @@ -7336,10 +10106,18 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} + finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + find-my-way@9.5.0: resolution: {integrity: sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==} engines: {node: '>=20'} @@ -7352,6 +10130,10 @@ packages: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-versions@6.0.0: resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} engines: {node: '>=18'} @@ -7359,6 +10141,10 @@ packages: flag-icons@7.5.0: resolution: {integrity: sha512-kd+MNXviFIg5hijH766tt+3x76ele1AXlo4zDdCxIvqWZhKt4T83bOtxUOOMlTx/EcFdUMH5yvQgYlFh1EqqFg==} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} @@ -7381,14 +10167,29 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -7426,6 +10227,9 @@ packages: engines: {node: '>= 18.0.0'} hasBin: true + gemoji@6.1.0: + resolution: {integrity: sha512-MOlX3doQ1fsfzxQX8Y+u6bC5Ssc1pBUBIPVyrS69EzKt+5LIZAOm0G5XGVNhwXFgkBF3r+Yk88ONyrFHo8iNFA==} + generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} @@ -7457,6 +10261,9 @@ packages: resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} engines: {node: '>=14.16'} + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + get-port@7.2.0: resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} engines: {node: '>=16'} @@ -7486,6 +10293,23 @@ packages: github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -7498,9 +10322,21 @@ packages: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -7508,6 +10344,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -7518,13 +10358,27 @@ packages: resolution: {integrity: sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + guess-json-indent@3.0.1: resolution: {integrity: sha512-LWZ3Vr8BG7DHE3TzPYFqkhjNRw4vYgFSsv2nfMuHklAlOfiy54/EwiDQuQfFVLxENCVv20wpbjfTayooQHrEhQ==} engines: {node: '>=18.18.0'} + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -7538,6 +10392,9 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -7546,10 +10403,18 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} @@ -7586,15 +10451,27 @@ packages: hast-util-sanitize@5.0.2: resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + hast-util-to-mdast@10.1.2: + resolution: {integrity: sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==} + hast-util-to-parse5@8.0.1: resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} @@ -7604,6 +10481,10 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + headers-polyfill@5.0.1: resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} @@ -7614,8 +10495,14 @@ packages: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} - hono@4.12.23: - resolution: {integrity: sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==} + history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hono@4.12.24: + resolution: {integrity: sha512-I36D1s+HgQc55KbhEr4iybfxv/9o1zdpw+XEM6dJa91LqQD0HCoSGdxpRJCZE+aavs87j4V3Ls2OJzq8C/U4iw==} engines: {node: '>=16.9.0'} hook-std@4.0.0: @@ -7633,6 +10520,9 @@ packages: resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} engines: {node: ^20.17.0 || >=22.9.0} + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + hpagent@1.2.0: resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} engines: {node: '>=14'} @@ -7647,15 +10537,53 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + html-webpack-plugin@5.6.7: + resolution: {integrity: sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + html-whitespace-sensitive-tag-names@3.0.1: resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-cookie-agent@6.0.8: resolution: {integrity: sha512-qnYh3yLSr2jBsTYkw11elq+T361uKAJaZ2dR4cfYZChw1dt9uL5t3zSUwehoqqVb4oldk1BpkXKm2oat8zV+oA==} engines: {node: '>=18.0.0'} @@ -7666,6 +10594,13 @@ packages: undici: optional: true + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -7674,10 +10609,30 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + http-parser-js@0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + http-proxy-agent@9.0.0: resolution: {integrity: sha512-FcF8VhXYLQcxWCnt/cCpT2apKsRDUGeVEeMqGu4HSTu29U8Yw0TLOjdYIlDsYk3IkUh+taX4IDWpPcCqKDhCjA==} engines: {node: '>= 20'} + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + https-proxy-agent@9.0.0: resolution: {integrity: sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g==} engines: {node: '>= 20'} @@ -7694,6 +10649,10 @@ packages: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + ical.js@2.2.1: resolution: {integrity: sha512-yK/UlPbEs316igb/tjRgbFA8ZV75rCsBJp/hWOatpyaPNlgw0dGDmU+FoicOcwX4xXkeXOkYiOmCqNPFpNPkQg==} @@ -7701,10 +10660,20 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + icu-minify@4.13.0: resolution: {integrity: sha512-SIFMeUHZJjzS5RvIGvybKvWoHjDm9cGVEs2EpJ8PmywOdJLWyblPm7TdPLLoUtkJtwQD7iGhl2WMptZ+N0on+w==} @@ -7715,6 +10684,15 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -7735,9 +10713,20 @@ packages: resolution: {integrity: sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==} engines: {node: '>=18.20'} + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -7750,6 +10739,10 @@ packages: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} + infima@0.2.0-alpha.45: + resolution: {integrity: sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==} + engines: {node: '>=12'} + inflation@2.1.0: resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} engines: {node: '>= 0.8.0'} @@ -7760,9 +10753,16 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -7770,6 +10770,9 @@ packages: intl-messageformat@11.1.1: resolution: {integrity: sha512-vnrF2f4vfsdaFY6tuLZfzGcx1GZFMFAq6c7QdK3HSXNcGXEIQncNgbeAcnpjAOszQzq3Jbol2SwgshIGY08WyA==} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ioredis@5.11.0: resolution: {integrity: sha512-EZBErytyVovD8f6pDfG3Kb37N6Y3lmDA9NNj+4+IP13CzzHGeX+OyeRM2Um13khRzoBSzzL+5lVnCX8V2RLeMg==} engines: {node: '>=12.22.0'} @@ -7806,12 +10809,38 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -7834,13 +10863,34 @@ packages: resolution: {integrity: sha512-HQ5v4rEJ7REUV54bCd2l5FaD299SGDEn2UPoVXaTHAyGviLq2menVUD2udi3trQ32uvB6LdAh/0ck2EuizrtpA==} engines: {node: '>=18'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-network-error@1.3.2: + resolution: {integrity: sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==} + engines: {node: '>=16'} + is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-npm@6.1.0: + resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} @@ -7849,10 +10899,22 @@ packages: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -7862,6 +10924,10 @@ packages: is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + is-regexp@3.1.0: resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} engines: {node: '>=12'} @@ -7878,6 +10944,9 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -7886,6 +10955,21 @@ packages: resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} engines: {node: '>=18'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -7896,6 +10980,10 @@ packages: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + isomorphic-dompurify@3.16.0: resolution: {integrity: sha512-KzTJsMuVPqPwBOD0F6jKXoV/+v8CSx0rxVp+/67KV6Xbw++0zD/avT3bZsgwR0M5QRMiOE+QqQtoZLEJYy1C4Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} @@ -7932,14 +11020,25 @@ packages: resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} engines: {node: '>= 0.6.0'} + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jose@6.0.8: resolution: {integrity: sha512-EyUPtOKyTYq+iMOszO42eobQllaIjJnwkZ2U93aJzNyPibCy7CEvT9UQnaCVB51IAd49gbNdCew1c0LcLTCB2g==} @@ -7973,6 +11072,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -7998,6 +11101,14 @@ packages: engines: {node: '>=6'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -8007,6 +11118,9 @@ packages: json-schema-ref-resolver@3.0.0: resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -8035,14 +11149,32 @@ packages: jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true + keygrip@1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} @@ -8054,6 +11186,19 @@ packages: resolution: {integrity: sha512-s6WVJyEZrbm6jhBpiKHsGHyePMrVQKJ85wZCFCr9W4QHv6WTjWIrdvTmO9hDEA3bNK0xkrE2DqrHsXMLWuZpQg==} engines: {node: '>=22.0.0'} + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + launch-editor@2.14.1: + resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -8062,12 +11207,97 @@ packages: resolution: {integrity: sha512-Wpdvo+/0DREIynYf2he2efHtjptr5zD7dpesSkZWJqfQdMEgSTytEIsSZVuoDSiiE1+SpXf3emZ7ewxGBTo7Pw==} engines: {node: '>=20'} + leader-line-new@1.1.9: + resolution: {integrity: sha512-x56aRYaqJTA4aAS2fgbSpvWKY3IxRXDSFeGkNBmCQ3LX44B3F1HEjcBTkCiK5I3W0nPWeUTWe7dTt59VtdfFWw==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -8090,6 +11320,10 @@ packages: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} @@ -8102,6 +11336,9 @@ packages: lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} @@ -8115,6 +11352,12 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} @@ -8135,6 +11378,13 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lowlight@3.3.0: resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} @@ -8196,6 +11446,10 @@ packages: resolution: {integrity: sha512-3lr8UeB+R+BN9c7eOBkeH1GlHf7+0Kzt0pcEgsT9xoXIA5gfXAzjd1niYiYDsvb62v5rLPqCqDiyYxtmmhGJ3g==} engines: {node: '>= 22.5.0'} + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -8210,6 +11464,11 @@ packages: engines: {node: '>= 18'} hasBin: true + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -8224,12 +11483,21 @@ packages: next: optional: true + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@1.1.1: + resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} @@ -8254,6 +11522,9 @@ packages: mdast-util-mdx-jsx@3.2.0: resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-mdxjs-esm@2.0.1: resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} @@ -8269,6 +11540,12 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} @@ -8280,10 +11557,21 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} + medium-zoom@1.1.0: + resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} + + memfs@4.57.6: + resolution: {integrity: sha512-WQK+DGjKCnPdpSyJUXphz+COF2uEhhsxQ3VIWBSbzpbbXuch3h4FePMqXrXGdLjsTgo4JFzBFsP6AWd9pVazGw==} + peerDependencies: + tslib: '2' + meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -8291,12 +11579,29 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@11.15.0: + resolution: {integrity: sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + microdiff@1.5.0: resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==} micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -8318,12 +11623,33 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} @@ -8333,6 +11659,9 @@ packages: micromark-factory-whitespace@2.0.1: resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} @@ -8354,6 +11683,9 @@ packages: micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} @@ -8369,9 +11701,15 @@ packages: micromark-util-subtokenize@2.1.0: resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@2.0.2: resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} @@ -8382,6 +11720,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -8390,6 +11732,10 @@ packages: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} + mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -8398,6 +11744,11 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + mime@4.0.4: resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} engines: {node: '>=16'} @@ -8415,13 +11766,29 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + mini-css-extract-plugin@2.10.2: + resolution: {integrity: sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -8453,6 +11820,9 @@ packages: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -8466,6 +11836,10 @@ packages: typescript: optional: true + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -8517,6 +11891,14 @@ packages: napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -8527,10 +11909,8 @@ packages: nerf-dart@1.0.0: resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} - neverpanic@0.0.7: - resolution: {integrity: sha512-GFRTSX2JAEATOCQYlyFkR+9FJPl0pD24toE1foqYAsL6aPLlRKn6L0UFOtJhZCxEbDv+SUsiW4AcPs9cIFwkFw==} - peerDependencies: - typescript: '5' + neverpanic@0.0.8: + resolution: {integrity: sha512-vVdkelrLxaow/fdWDumzNBO+jwm6X8bxeLJc34THtpj70u0C5QBkcV6CRCu2X726km7XD45N0A3QtYCla4RvKw==} next-auth@5.0.0-beta.31: resolution: {integrity: sha512-1OBgCKPzo+S7UWWMp3xgvGvIJ0OpV7B3vR4ZDRqD9a4Ch+OT6dakLXG9ivhtmIWVa71nTSXattOHyCg8sNi8/Q==} @@ -8582,6 +11962,9 @@ packages: sass: optional: true + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@3.67.0: resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} engines: {node: '>=10'} @@ -8638,6 +12021,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + normalize-url@9.0.0: resolution: {integrity: sha512-z9nC87iaZXXySbWWtTHfCFJyFvKaUAW6lODhikG7ILSbVgmwuFjUqkgnheHvAUcGedO29e2QGBRXMUD64aurqQ==} engines: {node: '>=20'} @@ -8725,6 +12112,18 @@ packages: - validate-npm-package-name - which + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + null-loader@4.0.1: + resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + oauth4webapi@3.3.0: resolution: {integrity: sha512-ZlozhPlFfobzh3hB72gnBFLjXpugl/dljz1fJSRdqaV2r3D5dmi5lg2QWI0LmUYuazmE+b5exsloEv6toUtw9g==} @@ -8732,10 +12131,25 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -8754,6 +12168,10 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -8768,9 +12186,21 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + openapi3-ts@4.4.0: resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==} + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + openid-client@6.3.3: resolution: {integrity: sha512-lTK8AV8SjqCM4qznLX0asVESAwzV39XTVdfMAM185ekuaZCnkWdPzcxMTXNlsm9tsUAMa1Q30MBmKAykdT1LWw==} @@ -8806,6 +12236,10 @@ packages: vite-plus: optional: true + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + p-each-series@3.0.0: resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==} engines: {node: '>=12'} @@ -8814,18 +12248,38 @@ packages: resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} engines: {node: '>=18'} + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + p-limit@1.3.0: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} engines: {node: '>=4'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + p-map@7.0.3: resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + p-reduce@2.1.0: resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} engines: {node: '>=8'} @@ -8834,6 +12288,14 @@ packages: resolution: {integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==} engines: {node: '>=12'} + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} @@ -8841,9 +12303,19 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + parchment@3.0.0: resolution: {integrity: sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==} @@ -8870,9 +12342,18 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + parse5@5.1.1: resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} @@ -8889,14 +12370,27 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-expression-matcher@1.5.0: resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} engines: {node: '>=14.0.0'} + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -8905,6 +12399,17 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -8913,6 +12418,15 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} + path-to-regexp@0.1.13: + resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} + + path-to-regexp@1.9.0: + resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + + path-to-regexp@3.3.0: + resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -8978,6 +12492,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -8992,6 +12510,10 @@ packages: resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} hasBin: true + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + pkce-challenge@5.0.1: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} @@ -9004,6 +12526,14 @@ packages: resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} engines: {node: '>=4'} + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + pkijs@3.4.0: + resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} + engines: {node: '>=16.0.0'} + playwright-core@1.60.0: resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} engines: {node: '>=18'} @@ -9017,29 +12547,421 @@ packages: po-parser@2.1.1: resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==} + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + postcss-attribute-case-insensitive@7.0.1: + resolution: {integrity: sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-calc@9.0.1: + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + + postcss-clamp@4.1.0: + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: ^8.4.6 + + postcss-color-functional-notation@7.0.12: + resolution: {integrity: sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-color-hex-alpha@10.0.0: + resolution: {integrity: sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-color-rebeccapurple@10.0.0: + resolution: {integrity: sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-colormin@6.1.0: + resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-convert-values@6.1.0: + resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-custom-media@11.0.6: + resolution: {integrity: sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-custom-properties@14.0.6: + resolution: {integrity: sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-custom-selectors@8.0.5: + resolution: {integrity: sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-dir-pseudo-class@9.0.1: + resolution: {integrity: sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-discard-comments@6.0.2: + resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-duplicates@6.0.3: + resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-empty@6.0.3: + resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-overridden@6.0.2: + resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-unused@6.0.5: + resolution: {integrity: sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-double-position-gradients@6.0.4: + resolution: {integrity: sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-focus-visible@10.0.1: + resolution: {integrity: sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-focus-within@9.0.1: + resolution: {integrity: sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-font-variant@5.0.0: + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + + postcss-gap-properties@6.0.0: + resolution: {integrity: sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-image-set-function@7.0.0: + resolution: {integrity: sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + postcss-js@4.0.1: resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 + postcss-lab-function@7.0.12: + resolution: {integrity: sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-loader@7.3.4: + resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + + postcss-logical@8.1.0: + resolution: {integrity: sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-merge-idents@6.0.3: + resolution: {integrity: sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-longhand@6.0.5: + resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-rules@6.1.1: + resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-font-values@6.1.0: + resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-gradients@6.0.3: + resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-params@6.1.0: + resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-selectors@6.0.4: + resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + postcss-mixins@12.0.0: resolution: {integrity: sha512-br7vXwoA5niiQAW3BLgd66xoGie/JJ1O4k7uLDbb+fbdYFXouxAjppIkBZDpPtSIzx63WeVXRGEYStSYa5kQmw==} engines: {node: ^20.0 || ^22.0 || >=24.0} peerDependencies: postcss: ^8.2.14 + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + postcss-nested@7.0.2: resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} engines: {node: '>=18.0'} peerDependencies: postcss: ^8.2.14 + postcss-nesting@13.0.2: + resolution: {integrity: sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-normalize-charset@6.0.2: + resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-display-values@6.0.2: + resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-positions@6.0.2: + resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-repeat-style@6.0.2: + resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-string@6.0.2: + resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-timing-functions@6.0.2: + resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-unicode@6.1.0: + resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-url@6.0.2: + resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-whitespace@6.0.2: + resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-opacity-percentage@3.0.0: + resolution: {integrity: sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-ordered-values@6.0.2: + resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-overflow-shorthand@6.0.0: + resolution: {integrity: sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-page-break@3.0.4: + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + + postcss-place@10.0.0: + resolution: {integrity: sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-preset-env@10.6.1: + resolution: {integrity: sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + postcss-preset-mantine@1.18.0: resolution: {integrity: sha512-sP6/s1oC7cOtBdl4mw/IRKmKvYTuzpRrH/vT6v9enMU/EQEQ31eQnHcWtFghOXLH87AAthjL/Q75rLmin1oZoA==} peerDependencies: postcss: '>=8.0.0' + postcss-pseudo-class-any-link@10.0.1: + resolution: {integrity: sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-reduce-idents@6.0.3: + resolution: {integrity: sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-initial@6.1.0: + resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-transforms@6.0.2: + resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-replace-overflow-wrap@4.0.0: + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + peerDependencies: + postcss: ^8.0.3 + + postcss-selector-not@8.0.1: + resolution: {integrity: sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + postcss-selector-parser@7.1.0: resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} @@ -9050,6 +12972,33 @@ packages: peerDependencies: postcss: ^8.2.1 + postcss-sort-media-queries@5.2.0: + resolution: {integrity: sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.4.23 + + postcss-svgo@6.0.3: + resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.4.31 + + postcss-unique-selectors@6.0.4: + resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss-zindex@6.0.2: + resolution: {integrity: sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -9058,6 +13007,10 @@ packages: resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -9074,6 +13027,10 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} + posthog-docusaurus@2.0.5: + resolution: {integrity: sha512-Ray65LYEJrMMqDtsBUBXunEVP/g4wtATvq/xz9rchUoLy/9mSkkFgUko/8DVtGxgiP3vivpFMgfb9HpCuDrBHg==} + engines: {node: '>=10.15.1'} + preact-render-to-string@6.5.11: resolution: {integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==} peerDependencies: @@ -9088,6 +13045,9 @@ packages: deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + pretty-ms@9.2.0: resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} @@ -9096,6 +13056,15 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + pretty-time@1.1.0: + resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} + engines: {node: '>=4'} + + prism-react-renderer@2.4.1: + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + peerDependencies: + react: '>=16.0.0' + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -9113,6 +13082,10 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -9193,6 +13166,17 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pupa@3.3.0: + resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} + engines: {node: '>=12.20'} + + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} @@ -9201,9 +13185,16 @@ packages: resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + quill-delta@5.1.0: resolution: {integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==} engines: {node: '>= 12.0.0'} @@ -9220,6 +13211,16 @@ packages: radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + random-word-slugs@0.1.7: + resolution: {integrity: sha512-8cyzxOIDeLFvwSPTgCItMXHGT5ZPkjhuFKUTww06Xg1dNMXuGxIKlARvS7upk6JXIm41ZKXmtlKR1iCRWklKmg==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -9231,6 +13232,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} @@ -9255,9 +13260,18 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + react-is@19.2.7: resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} + react-json-view-lite@2.5.0: + resolution: {integrity: sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==} + engines: {node: '>=18'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-jsx-parser@2.4.1: resolution: {integrity: sha512-gE25DiHseuKmSbb5O1K1IkyQ/bwth3zl4z3EdW8XMhwrb2agUpuh8GvqHFvGwh/wdZjDDuadGrSR2lEgjcOvqQ==} engines: {bun: ^1.1.27} @@ -9265,6 +13279,13 @@ packages: react: '>=18' react-dom: '>=18' + react-loadable-ssr-addon-v5-slorber@1.0.3: + resolution: {integrity: sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + react-loadable: '*' + webpack: '>=4.41.1 || 5.x' + react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: @@ -9320,6 +13341,22 @@ packages: '@types/react': optional: true + react-router-config@5.1.1: + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: '>=5' + + react-router-dom@5.3.4: + resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} + peerDependencies: + react: '>=15' + + react-router@5.3.4: + resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} + peerDependencies: + react: '>=15' + react-simple-code-editor@0.14.1: resolution: {integrity: sha512-BR5DtNRy+AswWJECyA17qhUDvrrCZ6zXOCfkQY5zSmb96BVUbpVAv03WpcjcwtCwiLbIANx3gebHOcXYn1EHow==} peerDependencies: @@ -9342,10 +13379,19 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' + react-virtualized-auto-sizer@1.0.26: + resolution: {integrity: sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==} + peerDependencies: + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0 + react@19.2.7: resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-package-up@11.0.0: resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} engines: {node: '>=18'} @@ -9376,6 +13422,10 @@ packages: readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -9392,6 +13442,20 @@ packages: react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-is: ^19.2.7 + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -9411,31 +13475,82 @@ packages: redux@5.0.1: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.1: + resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + hasBin: true + rehype-external-links@3.0.0: resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} rehype-format@5.0.1: resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + rehype-minify-whitespace@6.0.2: + resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==} + rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-remark@10.0.1: + resolution: {integrity: sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==} + rehype-sanitize@6.0.0: resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} rehype-stringify@10.0.1: resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + + remark-emoji@4.0.1: + resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -9455,6 +13570,9 @@ packages: resolution: {integrity: sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg==} engines: {node: '>= 0.8.0'} + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -9463,6 +13581,12 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -9470,6 +13594,9 @@ packages: resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} engines: {node: '>=18'} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -9478,9 +13605,25 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-package-path@4.0.3: + resolution: {integrity: sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==} + engines: {node: '>= 12'} + + resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + ret@0.5.0: resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} @@ -9489,6 +13632,10 @@ packages: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + rettime@0.11.11: resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} @@ -9502,6 +13649,9 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + rollup@4.60.0: resolution: {integrity: sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -9513,10 +13663,28 @@ packages: rou3@0.7.12: resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} + rtlcss@4.3.0: + resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==} + engines: {node: '>=12.0.0'} + hasBin: true + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -9544,6 +13712,10 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -9551,18 +13723,43 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-dts@1.1.5: + resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + schema-utils@4.3.3: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@5.5.0: + resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} + engines: {node: '>=18'} + semantic-release@25.0.3: resolution: {integrity: sha512-WRgl5GcypwramYX4HV+eQGzUbD7UUbljVmS+5G1uMwX/wLgYuJAxGeerXJDMO2xshng4+FXqCgyB5QfClV6WjA==} engines: {node: ^22.14.0 || >= 24.10.0} hasBin: true + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + semver-parser@4.2.1: resolution: {integrity: sha512-JZ2DLMzJ+jiNAl5+uc+gnXvo4K/pPtkpo0SuxFBB8dU1FRIviTwqv01sbqPlslMVGaJdsSpRVfb9vGUeAgHN0Q==} @@ -9579,10 +13776,28 @@ packages: engines: {node: '>=10'} hasBin: true + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-handler@6.1.7: + resolution: {integrity: sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==} + + serve-index@1.9.2: + resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} @@ -9593,12 +13808,23 @@ packages: set-cookie-parser@3.1.0: resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -9615,6 +13841,10 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} + shell-quote@1.8.4: + resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} + engines: {node: '>= 0.4'} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -9651,18 +13881,44 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@7.1.3: + resolution: {integrity: sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + socks-proxy-agent@8.0.5: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} @@ -9674,6 +13930,10 @@ packages: sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + sort-css-media-queries@2.2.0: + resolution: {integrity: sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==} + engines: {node: '>= 6.3.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -9685,6 +13945,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -9703,6 +13967,13 @@ packages: spdx-license-ids@3.0.20: resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + split-ca@1.0.1: resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} @@ -9713,6 +13984,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} @@ -9723,6 +13997,10 @@ packages: sql.js@1.14.1: resolution: {integrity: sha512-gcj8zBWU5cFsi9WUP+4bFNXAyF1iRpA3LLyS/DP5xlrNzGmPIizUeBggKa8DbDwdqaKwUcTEnChtd2grWo/x/A==} + srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + ssh-remote-port-forward@1.0.4: resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} @@ -9739,6 +14017,10 @@ packages: standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -9747,6 +14029,9 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.0.0: resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} @@ -9795,6 +14080,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + stringify-object@6.0.0: resolution: {integrity: sha512-6f94vIED6vmJJfh3lyVsVWxCYSfI5uM+16ntED/Ql37XIyV6kj0mRAAiTeMMc/QLYIaizC3bUprQ8pQnDDrKfA==} engines: {node: '>=20'} @@ -9807,6 +14096,10 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -9827,6 +14120,10 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + strnum@2.3.0: resolution: {integrity: sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==} @@ -9852,6 +14149,20 @@ packages: babel-plugin-macros: optional: true + stylehacks@6.1.1: + resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + sugarss@5.0.0: resolution: {integrity: sha512-3//knMoF9btXcxHTbMRckIYjkEzSZ6pZjiaZ3wM6OIpUtQ06Uwqc0XgAr6jf+U74cLLTV/BEgmHWoeXPC+NhdQ==} engines: {node: '>=18.0'} @@ -9882,9 +14193,31 @@ packages: resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} engines: {node: '>=14.18'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@3.3.3: + resolution: {integrity: sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==} + engines: {node: '>=14.0.0'} + hasBin: true + svgson@5.3.1: resolution: {integrity: sha512-qdPgvUNWb40gWktBJnbJRelWcPzkLed/ShhnRsjbayXz8OtdPOzbil9jtiZdrYvSDumAz/VNQr6JaNfPx/gvPA==} + swc-loader@0.2.7: + resolution: {integrity: sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==} + peerDependencies: + '@swc/core': ^1.2.147 + webpack: '>=2' + + swiper@12.2.0: + resolution: {integrity: sha512-K8uXsBZU6ME97Ia3xbBge8IRCnR1lOmIILzvY/jGVic7dSTQ530s3uO8RvXbPUtkkXLWIwmZLRPbtDxRWVAFdg==} + engines: {node: '>= 4.7.0'} + swrv@1.2.0: resolution: {integrity: sha512-lH/g4UcNyj+7lzK4eRGT4C68Q4EhQ6JtM9otPRIASfhhzfLWtbZPHcMuhuba7S9YVYuxkMUGImwMyGpfbkH07A==} peerDependencies: @@ -9906,8 +14239,10 @@ packages: tailwind-merge@3.5.0: resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} - tailwindcss@4.3.0: - resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} @@ -9998,6 +14333,12 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thingies@2.6.0: + resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + thread-stream@4.0.0: resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} engines: {node: '>=20'} @@ -10005,6 +14346,9 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + time-span@5.1.0: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} @@ -10016,6 +14360,9 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -10027,6 +14374,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} @@ -10088,6 +14439,12 @@ packages: resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} engines: {node: '>= 0.4'} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -10095,6 +14452,9 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-trailing-lines@2.1.0: + resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==} + triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} @@ -10121,6 +14481,13 @@ packages: resolution: {integrity: sha512-QVsbr1WhGLq2F0oDyYbqtOXcf3gcnL8C9H5EX8bBwAr8ZWvWGJzukpPrDrWgJMrNtgDbo74BIjI4kJu3q2xQWw==} engines: {node: '>=18.18.0'} + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsconfck@3.1.3: resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} engines: {node: ^18 || >=20} @@ -10135,6 +14502,9 @@ packages: resolution: {integrity: sha512-/uC/RItcdYVxUj8b2gT4CorAkUmDFUuzhgS4XVT+OVzGRE80hH5ldubcWH13dHa2T9rNaXu6UIEWHlQ1UL7H1Q==} engines: {node: '>=18'} + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -10152,6 +14522,10 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} + engines: {node: '>= 6.0.0'} + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -10190,6 +14564,9 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -10223,6 +14600,10 @@ packages: resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} engines: {node: '>=18.17'} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + engines: {node: '>=20.18.1'} + undici@7.27.1: resolution: {integrity: sha512-UDdpiex+mzigiyrXrGbiUaF4HzTNhKbh2vRNFaTMzcqmLIPrZxaCtwo/1TMSuWoM1Xz3WiTo9KdgI3kRqYzJGg==} engines: {node: '>=20.18.1'} @@ -10234,10 +14615,26 @@ packages: unhead@2.1.15: resolution: {integrity: sha512-MCt5T90mCWyr3Z6pUCdM9lVRXoMoVBlL7z7U4CYVIiaDiuzad/UCfLuMqz5MeNmpZUgoBCQnrucJimU7EZR+XA==} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -10256,18 +14653,30 @@ packages: unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -10297,10 +14706,27 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@5.0.0: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + url-loader@4.1.1: + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + url-toolkit@2.2.5: resolution: {integrity: sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==} @@ -10314,6 +14740,12 @@ packages: '@types/react': optional: true + use-debounce@10.1.1: + resolution: {integrity: sha512-kvds8BHR2k28cFsxW8k3nc/tRga2rs1RHYCqmmGqb90MEeE++oALwzh2COiuBLO1/QXiOuShXoSN2ZpWnMmvuQ==} + engines: {node: '>= 16.0.0'} + peerDependencies: + react: '*' + use-deep-compare-effect@1.8.1: resolution: {integrity: sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==} engines: {node: '>=10', npm: '>=6'} @@ -10348,9 +14780,36 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-peer-dependencies@2.2.0: + resolution: {integrity: sha512-8X1OWlERjiUY6P6tdeU9E0EwO8RA3bahoOVG7ulOZT5MqgNDUO/BQoVjYiHPcNe+v8glsboZRIw9iToMAA2zAA==} + engines: {node: '>= 12'} + + value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -10468,8 +14927,8 @@ packages: jsdom: optional: true - vue-component-type-helpers@3.3.3: - resolution: {integrity: sha512-x4nsFpy5Pe8fqPzp/5vkTPeTTDBpAx4WVtV47Ejt0+2FQrq4pRRsJs7JmYRqMFzTu/LW+pCWEjQ3YVCkPV7f9g==} + vue-component-type-helpers@3.3.4: + resolution: {integrity: sha512-joip1uZTaQR0nD23N400gIdJ7xY+WiiiMA/BCKz842gvGBknqDQAzklUvDEhqFvvrhQY8S2ZANBMu4X70VMFGw==} vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} @@ -10504,6 +14963,9 @@ packages: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -10514,6 +14976,41 @@ packages: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} + webpack-bundle-analyzer@4.10.2: + resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} + engines: {node: '>= 10.13.0'} + hasBin: true + + webpack-dev-middleware@7.4.5: + resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.2.4: + resolution: {integrity: sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + webpack-sources@3.5.0: resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} engines: {node: '>=10.13.0'} @@ -10528,6 +15025,35 @@ packages: webpack-cli: optional: true + webpackbar@7.0.0: + resolution: {integrity: sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@rspack/core': '*' + webpack: 3 || 4 || 5 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + websocket-driver@0.7.5: + resolution: {integrity: sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} @@ -10554,6 +15080,13 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + winston-transport@4.9.0: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} @@ -10584,6 +15117,21 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.5.11: + resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.20.1: resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} engines: {node: '>=10.0.0'} @@ -10608,9 +15156,17 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xcase@2.0.1: resolution: {integrity: sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==} + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + xml-js@1.6.11: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true @@ -10683,6 +15239,10 @@ packages: resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} @@ -10768,6 +15328,143 @@ snapshots: transitivePeerDependencies: - zod + '@algolia/abtesting@1.19.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/autocomplete-core@1.19.2(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.19.2(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.53.0)(algoliasearch@5.53.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-core@1.19.8(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.19.8(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.19.8(@algolia/client-search@5.53.0)(algoliasearch@5.53.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.19.2(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.53.0)(algoliasearch@5.53.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-plugin-algolia-insights@1.19.8(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.19.8(@algolia/client-search@5.53.0)(algoliasearch@5.53.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-shared@1.19.2(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)': + dependencies: + '@algolia/client-search': 5.53.0 + algoliasearch: 5.53.0 + + '@algolia/autocomplete-shared@1.19.8(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)': + dependencies: + '@algolia/client-search': 5.53.0 + algoliasearch: 5.53.0 + + '@algolia/client-abtesting@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/client-analytics@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/client-common@5.53.0': {} + + '@algolia/client-insights@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/client-personalization@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/client-query-suggestions@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/client-search@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/events@4.0.1': {} + + '@algolia/ingestion@1.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/monitoring@1.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/recommend@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + '@algolia/requester-browser-xhr@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + + '@algolia/requester-fetch@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + + '@algolia/requester-node-http@5.53.0': + dependencies: + '@algolia/client-common': 5.53.0 + + '@alloc/quick-lru@5.2.0': {} + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + '@ark/schema@0.46.0': dependencies: '@ark/util': 0.46.0 @@ -10818,8 +15515,16 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.29.3': {} + '@babel/compat-data@7.29.7': {} + '@babel/core@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -10848,6 +15553,18 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.0.2 + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/helper-compilation-targets@7.28.6': dependencies: '@babel/compat-data': 7.29.3 @@ -10856,12 +15573,67 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.12 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.28.6': dependencies: '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -10874,8 +15646,48 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-string-parser@7.29.7': {} @@ -10886,6 +15698,16 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helper-wrap-function@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 @@ -10899,6 +15721,367 @@ snapshots: dependencies: '@babel/types': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 + + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-constant-elements@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -10909,6 +16092,220 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.0) + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/preset-env@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.7 + esutils: 2.0.3 + + '@babel/preset-react@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.29.2': {} '@babel/runtime@7.29.7': {} @@ -10916,9 +16313,15 @@ snapshots: '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@babel/types': 7.29.0 + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -10931,6 +16334,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -10945,7 +16360,7 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0)': + '@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0)': dependencies: '@better-auth/utils': 0.4.1 '@better-fetch/fetch': 1.1.21 @@ -10959,38 +16374,38 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 - '@better-auth/drizzle-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))': + '@better-auth/drizzle-adapter@1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/core': 1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 optionalDependencies: drizzle-orm: 0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1) - '@better-auth/kysely-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.29.2)': + '@better-auth/kysely-adapter@1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.29.2)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/core': 1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 optionalDependencies: kysely: 0.29.2 - '@better-auth/memory-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + '@better-auth/memory-adapter@1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/core': 1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 - '@better-auth/mongo-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + '@better-auth/mongo-adapter@1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/core': 1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 - '@better-auth/prisma-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + '@better-auth/prisma-adapter@1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/core': 1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 - '@better-auth/telemetry@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)': + '@better-auth/telemetry@1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/core': 1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 '@better-fetch/fetch': 1.1.21 @@ -11000,10 +16415,14 @@ snapshots: '@better-fetch/fetch@1.1.21': {} + '@braintree/sanitize-url@7.1.2': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 + '@chevrotain/types@11.1.2': {} + '@codemirror/autocomplete@6.20.3': dependencies: '@codemirror/language': 6.12.3 @@ -11103,13 +16522,32 @@ snapshots: '@colors/colors@1.6.0': {} + '@csstools/cascade-layer-name-parser@2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/color-helpers@5.1.0': {} + '@csstools/color-helpers@6.0.2': {} + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.2 @@ -11117,6 +16555,10 @@ snapshots: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-tokenizer': 4.0.0 @@ -11125,8 +16567,294 @@ snapshots: optionalDependencies: css-tree: 3.2.1 + '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-tokenizer@4.0.0': {} + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/postcss-alpha-function@1.0.1(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-cascade-layers@5.0.2(postcss@8.5.8)': + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-color-function-display-p3-linear@1.0.1(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-color-function@4.0.12(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-color-mix-function@3.0.12(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-content-alt-text@2.0.8(postcss@8.5.8)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-contrast-color-function@2.0.12(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-exponential-functions@2.0.9(postcss@8.5.8)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-font-format-keywords@4.0.0(postcss@8.5.8)': + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-gamut-mapping@2.0.11(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-gradients-interpolation-method@5.0.12(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-hwb-function@4.0.12(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-ic-unit@4.0.4(postcss@8.5.8)': + dependencies: + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-initial@2.0.1(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + + '@csstools/postcss-is-pseudo-class@5.0.3(postcss@8.5.8)': + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-light-dark-function@2.0.11(postcss@8.5.8)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + + '@csstools/postcss-logical-overflow@2.0.0(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + + '@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + + '@csstools/postcss-logical-resize@3.0.0(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-logical-viewport-units@3.0.4(postcss@8.5.8)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-media-minmax@2.0.9(postcss@8.5.8)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.8 + + '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5(postcss@8.5.8)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.8 + + '@csstools/postcss-nested-calc@4.0.0(postcss@8.5.8)': + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-normalize-display-values@4.0.1(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-oklab-function@4.0.12(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-position-area-property@1.0.0(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + + '@csstools/postcss-progressive-custom-properties@4.2.1(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-property-rule-prelude-list@1.0.0(postcss@8.5.8)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-random-function@2.0.1(postcss@8.5.8)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-relative-color-syntax@3.0.12(postcss@8.5.8)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + '@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-sign-functions@1.1.4(postcss@8.5.8)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-stepped-value-functions@4.0.9(postcss@8.5.8)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-syntax-descriptor-syntax-production@1.0.1(postcss@8.5.8)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-system-ui-font-family@1.0.0(postcss@8.5.8)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-text-decoration-shorthand@4.0.3(postcss@8.5.8)': + dependencies: + '@csstools/color-helpers': 5.1.0 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-trigonometric-functions@4.0.9(postcss@8.5.8)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + + '@csstools/postcss-unset-value@4.0.0(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/utilities@2.0.0(postcss@8.5.8)': + dependencies: + postcss: 8.5.8 + '@ctrl/deluge@8.0.0': dependencies: '@ctrl/magnet-link': 4.3.0 @@ -11176,6 +16904,8 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 + '@discoveryjs/json-ext@0.5.7': {} + '@dnd-kit/accessibility@3.1.1(react@19.2.7)': dependencies: react: 19.2.7 @@ -11208,15 +16938,1022 @@ snapshots: react: 19.2.7 tslib: 2.8.1 + '@docsearch/core@4.6.3(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + optionalDependencies: + '@types/react': 19.2.16 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@docsearch/css@4.6.3': {} + + '@docsearch/react@4.6.3(@algolia/client-search@5.53.0)(@types/react@19.2.16)(algoliasearch@5.53.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)(search-insights@2.17.3) + '@docsearch/core': 4.6.3(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docsearch/css': 4.6.3 + optionalDependencies: + '@types/react': 19.2.16 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@docusaurus/babel@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.0) + '@babel/preset-env': 7.29.7(@babel/core@7.29.0) + '@babel/preset-react': 7.29.7(@babel/core@7.29.0) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.0) + '@babel/runtime': 7.29.7 + '@babel/traverse': 7.29.0 + '@docusaurus/logger': 3.10.1 + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + babel-plugin-dynamic-import-node: 2.3.3 + fs-extra: 11.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/bundler@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@babel/core': 7.29.0 + '@docusaurus/babel': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/cssnano-preset': 3.10.1 + '@docusaurus/logger': 3.10.1 + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + babel-loader: 9.2.1(@babel/core@7.29.0)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + clean-css: 5.3.3 + copy-webpack-plugin: 11.0.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + css-loader: 6.11.0(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(lightningcss@1.32.0)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + cssnano: 6.1.2(postcss@8.5.8) + file-loader: 6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + html-minifier-terser: 7.2.0 + mini-css-extract-plugin: 2.10.2(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + null-loader: 4.0.1(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + postcss: 8.5.8 + postcss-loader: 7.3.4(postcss@8.5.8)(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + postcss-preset-env: 10.6.1(postcss@8.5.8) + terser-webpack-plugin: 5.6.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + tslib: 2.8.1 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + webpackbar: 7.0.0(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + optionalDependencies: + '@docusaurus/faster': 3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8) + transitivePeerDependencies: + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - csso + - esbuild + - lightningcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - webpack-cli + + '@docusaurus/core@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/babel': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/bundler': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/logger': 3.10.1 + '@docusaurus/mdx-loader': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@mdx-js/react': 3.1.1(@types/react@19.2.16)(react@19.2.7) + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.6.0 + cli-table3: 0.6.5 + combine-promises: 1.2.0 + commander: 5.1.0 + core-js: 3.49.0 + detect-port: 1.6.1 + escape-html: 1.0.3 + eta: 2.2.0 + eval: 0.1.8 + execa: 5.1.1 + fs-extra: 11.2.0 + html-tags: 3.3.1 + html-webpack-plugin: 5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + leven: 3.1.0 + lodash: 4.18.1 + open: 8.4.2 + p-map: 4.0.0 + prompts: 2.4.2 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)' + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.7)' + react-loadable-ssr-addon-v5-slorber: 1.0.3(@docusaurus/react-loadable@6.0.0(react@19.2.7))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + react-router: 5.3.4(react@19.2.7) + react-router-config: 5.1.1(react-router@5.3.4(react@19.2.7))(react@19.2.7) + react-router-dom: 5.3.4(react@19.2.7) + semver: 7.7.4 + serve-handler: 6.1.7 + tinypool: 1.1.1 + tslib: 2.8.1 + update-notifier: 6.0.2 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + webpack-bundle-analyzer: 4.10.2 + webpack-dev-server: 5.2.4(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + webpack-merge: 6.0.1 + optionalDependencies: + '@docusaurus/faster': 3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8) + transitivePeerDependencies: + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/cssnano-preset@3.10.1': + dependencies: + cssnano-preset-advanced: 6.1.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-sort-media-queries: 5.2.0(postcss@8.5.8) + tslib: 2.8.1 + + '@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8)': + dependencies: + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rspack/core': 1.7.11(@swc/helpers@0.5.15) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) + '@swc/html': 1.15.40 + browserslist: 4.28.2 + lightningcss: 1.32.0 + semver: 7.7.4 + swc-loader: 0.2.7(@swc/core@1.15.3(@swc/helpers@0.5.15))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + tslib: 2.8.1 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(@swc/html@1.15.40)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/css' + - '@swc/helpers' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - postcss + - uglify-js + - webpack-cli + + '@docusaurus/logger@3.10.1': + dependencies: + chalk: 4.1.2 + tslib: 2.8.1 + + '@docusaurus/mdx-loader@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/logger': 3.10.1 + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@mdx-js/mdx': 3.1.1 + '@slorber/remark-comment': 1.0.0 + escape-html: 1.0.3 + estree-util-value-to-estree: 3.5.0 + file-loader: 6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + fs-extra: 11.2.0 + image-size: 2.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + rehype-raw: 7.0.0 + remark-directive: 3.0.1 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + stringify-object: 3.3.0 + tslib: 2.8.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + vfile: 6.0.3 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/module-type-aliases@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/history': 4.7.11 + '@types/react': 19.2.16 + '@types/react-router-config': 5.0.11 + '@types/react-router-dom': 5.3.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)' + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.7)' + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/plugin-content-blog@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/logger': 3.10.1 + '@docusaurus/mdx-loader': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/plugin-content-docs': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + cheerio: 1.0.0-rc.12 + combine-promises: 1.2.0 + feed: 4.2.2 + fs-extra: 11.2.0 + lodash: 4.18.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + schema-dts: 1.1.5 + srcset: 4.0.0 + tslib: 2.8.1 + unist-util-visit: 5.0.0 + utility-types: 3.11.0 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/logger': 3.10.1 + '@docusaurus/mdx-loader': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/module-type-aliases': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/react-router-config': 5.0.11 + combine-promises: 1.2.0 + fs-extra: 11.2.0 + js-yaml: 4.1.1 + lodash: 4.18.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + schema-dts: 1.1.5 + tslib: 2.8.1 + utility-types: 3.11.0 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-content-pages@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/mdx-loader': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + fs-extra: 11.2.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-css-cascade-layers@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-debug@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + fs-extra: 11.2.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-json-view-lite: 2.5.0(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-analytics@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-gtag@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/gtag.js': 0.0.20 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-tag-manager@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-sitemap@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/logger': 3.10.1 + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + fs-extra: 11.2.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + sitemap: 7.1.3 + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-svgr@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/webpack': 8.1.0(typescript@5.9.3) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/preset-classic@3.10.1(@algolia/client-search@5.53.0)(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-content-blog': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-content-pages': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-css-cascade-layers': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-debug': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-google-analytics': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-google-gtag': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-google-tag-manager': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-sitemap': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-svgr': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/theme-classic': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-search-algolia': 3.10.1(@algolia/client-search@5.53.0)(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)(typescript@5.9.3) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - '@types/react' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/react-loadable@6.0.0(react@19.2.7)': + dependencies: + '@types/react': 19.2.16 + react: 19.2.7 + + '@docusaurus/theme-classic@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/logger': 3.10.1 + '@docusaurus/mdx-loader': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/module-type-aliases': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/plugin-content-blog': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/plugin-content-pages': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-translations': 3.10.1 + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@mdx-js/react': 3.1.1(@types/react@19.2.16)(react@19.2.7) + clsx: 2.1.1 + copy-text-to-clipboard: 3.2.2 + infima: 0.2.0-alpha.45 + lodash: 4.18.1 + nprogress: 0.2.0 + postcss: 8.5.8 + prism-react-renderer: 2.4.1(react@19.2.7) + prismjs: 1.30.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-router-dom: 5.3.4(react@19.2.7) + rtlcss: 4.3.0 + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - '@types/react' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/theme-common@3.10.1(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/mdx-loader': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/module-type-aliases': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/plugin-content-docs': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/history': 4.7.11 + '@types/react': 19.2.16 + '@types/react-router-config': 5.0.11 + clsx: 2.1.1 + parse-numeric-range: 1.3.0 + prism-react-renderer: 2.4.1(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/theme-mermaid@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/module-type-aliases': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + mermaid: 11.15.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@docusaurus/plugin-content-docs' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/theme-search-algolia@3.10.1(@algolia/client-search@5.53.0)(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)(typescript@5.9.3)': + dependencies: + '@algolia/autocomplete-core': 1.19.8(@algolia/client-search@5.53.0)(algoliasearch@5.53.0)(search-insights@2.17.3) + '@docsearch/react': 4.6.3(@algolia/client-search@5.53.0)(@types/react@19.2.16)(algoliasearch@5.53.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3) + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/logger': 3.10.1 + '@docusaurus/plugin-content-docs': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-translations': 3.10.1 + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + algoliasearch: 5.53.0 + algoliasearch-helper: 3.29.1(algoliasearch@5.53.0) + clsx: 2.1.1 + eta: 2.2.0 + fs-extra: 11.2.0 + lodash: 4.18.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/faster' + - '@mdx-js/react' + - '@minify-html/node' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - '@types/react' + - bufferutil + - clean-css + - cssnano + - csso + - debug + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/theme-translations@3.10.1': + dependencies: + fs-extra: 11.2.0 + tslib: 2.8.1 + + '@docusaurus/tsconfig@3.10.1': {} + + '@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@mdx-js/mdx': 3.1.1 + '@types/history': 4.7.11 + '@types/mdast': 4.0.4 + '@types/react': 19.2.16 + commander: 5.1.0 + joi: 17.13.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)' + utility-types: 3.11.0 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils-common@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils-validation@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/logger': 3.10.1 + '@docusaurus/utils': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + fs-extra: 11.2.0 + joi: 17.13.3 + js-yaml: 4.1.1 + lodash: 4.18.1 + tslib: 2.8.1 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/logger': 3.10.1 + '@docusaurus/types': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + escape-string-regexp: 4.0.0 + execa: 5.1.1 + file-loader: 6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + fs-extra: 11.2.0 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + jiti: 1.21.7 + js-yaml: 4.1.1 + lodash: 4.18.1 + micromatch: 4.0.8 + p-queue: 6.6.2 + prompts: 2.4.2 + resolve-pathname: 3.0.0 + tslib: 2.8.1 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + utility-types: 3.11.0 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + '@drizzle-team/brocli@0.10.2': {} '@drizzle-team/brocli@0.12.0': {} + '@emnapi/core@1.11.0': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@epic-web/invariant@1.0.0': {} '@esbuild-kit/core-utils@3.3.2': @@ -11496,6 +18233,13 @@ snapshots: '@fastify/forwarded': 3.0.1 ipaddr.js: 2.3.0 + '@fec/remark-a11y-emoji@3.1.0': + dependencies: + emoji-regex: 9.2.2 + gemoji: 6.1.0 + mdast-util-find-and-replace: 1.1.1 + unist-util-visit: 2.0.3 + '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -11523,6 +18267,15 @@ snapshots: '@floating-ui/utils@0.2.11': {} + '@floating-ui/vue@1.1.11(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.5.35(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@floating-ui/vue@1.1.9(vue@3.5.35(typescript@5.9.3))': dependencies: '@floating-ui/dom': 1.7.6 @@ -11604,9 +18357,15 @@ snapshots: '@hapi/bourne@3.0.0': {} - '@headlessui/tailwindcss@0.2.2(tailwindcss@4.3.0)': + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': dependencies: - tailwindcss: 4.3.0 + '@hapi/hoek': 9.3.0 + + '@headlessui/tailwindcss@0.2.2(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))': + dependencies: + tailwindcss: 3.4.19(tsx@4.21.0)(yaml@2.9.0) '@headlessui/vue@1.7.23(vue@3.5.35(typescript@5.9.3))': dependencies: @@ -11628,9 +18387,17 @@ snapshots: - undici - utf-8-validate - '@hono/node-server@1.19.14(hono@4.12.23)': + '@hono/node-server@1.19.14(hono@4.12.24)': dependencies: - hono: 4.12.23 + hono: 4.12.24 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.3': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 '@img/colour@1.0.0': optional: true @@ -11915,6 +18682,19 @@ snapshots: dependencies: axios: 1.15.0 + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.10 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.13.1 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -11949,6 +18729,133 @@ snapshots: dependencies: jsep: 1.4.0 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-core@4.57.6(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.6(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-fsa@4.57.6(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.6(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-builtins@4.57.6(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-to-fsa@4.57.6(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-fsa': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.6(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-utils@4.57.6(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.57.6(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node@4.57.6(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.6(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-print@4.57.6(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-utils': 4.57.6(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-snapshot@4.57.6(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.6.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.6.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@17.67.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 + '@kubernetes/client-node@1.4.0': dependencies: '@types/js-yaml': 4.0.9 @@ -11980,6 +18887,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@leichtgewicht/ip-codec@2.0.5': {} + '@lezer/common@1.5.2': {} '@lezer/css@1.3.3': @@ -12129,9 +19038,49 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.14 + acorn: 8.16.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.16.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@types/mdx': 2.0.14 + '@types/react': 19.2.16 + react: 19.2.7 + + '@mermaid-js/parser@1.1.1': + dependencies: + '@chevrotain/types': 11.1.2 + '@modelcontextprotocol/sdk@1.26.0(zod@4.4.3)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.23) + '@hono/node-server': 1.19.14(hono@4.12.24) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -12141,7 +19090,7 @@ snapshots: eventsource-parser: 3.1.0 express: 5.2.1 express-rate-limit: 8.5.2(express@5.2.1) - hono: 4.12.23 + hono: 4.12.24 jose: 6.2.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -12151,6 +19100,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@module-federation/error-codes@0.22.0': {} + + '@module-federation/runtime-core@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/runtime-tools@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/webpack-bundler-runtime': 0.22.0 + + '@module-federation/runtime@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/runtime-core': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/sdk@0.22.0': {} + + '@module-federation/webpack-bundler-runtime@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/sdk': 0.22.0 + '@mswjs/interceptors@0.41.9': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -12161,6 +19135,13 @@ snapshots: strict-event-emitter: 0.5.1 optional: true + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.2 + optional: true + '@next/env@16.2.7': {} '@next/swc-darwin-arm64@16.2.7': @@ -12187,12 +19168,165 @@ snapshots: '@next/swc-win32-x64-msvc@16.2.7': optional: true + '@nivo/annotations@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/colors': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/core': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/theming': 0.99.0(react@19.2.7) + '@react-spring/web': 10.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + lodash: 4.18.1 + react: 19.2.7 + transitivePeerDependencies: + - react-dom + + '@nivo/axes@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/core': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/scales': 0.99.0 + '@nivo/text': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/theming': 0.99.0(react@19.2.7) + '@react-spring/web': 10.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/d3-format': 1.4.5 + '@types/d3-time-format': 2.3.4 + d3-format: 1.4.5 + d3-time-format: 3.0.0 + react: 19.2.7 + transitivePeerDependencies: + - react-dom + + '@nivo/colors@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/core': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/theming': 0.99.0(react@19.2.7) + '@types/d3-color': 3.1.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + d3-color: 3.1.0 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + lodash: 4.18.1 + react: 19.2.7 + transitivePeerDependencies: + - react-dom + + '@nivo/core@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/theming': 0.99.0(react@19.2.7) + '@nivo/tooltip': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@react-spring/web': 10.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/d3-shape': 3.1.7 + d3-color: 3.1.0 + d3-format: 1.4.5 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-shape: 3.2.0 + d3-time-format: 3.0.0 + lodash: 4.18.1 + react: 19.2.7 + react-virtualized-auto-sizer: 1.0.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + use-debounce: 10.1.1(react@19.2.7) + transitivePeerDependencies: + - react-dom + + '@nivo/legends@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/colors': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/core': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/text': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/theming': 0.99.0(react@19.2.7) + '@types/d3-scale': 4.0.9 + d3-scale: 4.0.2 + react: 19.2.7 + transitivePeerDependencies: + - react-dom + + '@nivo/line@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/annotations': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/axes': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/colors': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/core': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/legends': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/scales': 0.99.0 + '@nivo/theming': 0.99.0(react@19.2.7) + '@nivo/tooltip': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/voronoi': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@react-spring/web': 10.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/d3-shape': 3.1.7 + d3-shape: 3.2.0 + react: 19.2.7 + transitivePeerDependencies: + - react-dom + + '@nivo/scales@0.99.0': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-time': 1.1.4 + '@types/d3-time-format': 3.0.4 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-time: 1.1.0 + d3-time-format: 3.0.0 + lodash: 4.18.1 + + '@nivo/text@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/core': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/theming': 0.99.0(react@19.2.7) + '@react-spring/web': 10.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + transitivePeerDependencies: + - react-dom + + '@nivo/theming@0.99.0(react@19.2.7)': + dependencies: + lodash: 4.18.1 + react: 19.2.7 + + '@nivo/tooltip@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/core': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/theming': 0.99.0(react@19.2.7) + '@react-spring/web': 10.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + transitivePeerDependencies: + - react-dom + + '@nivo/voronoi@0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@nivo/core': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@nivo/theming': 0.99.0(react@19.2.7) + '@nivo/tooltip': 0.99.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/d3-delaunay': 6.0.4 + '@types/d3-scale': 4.0.9 + d3-delaunay: 6.0.4 + d3-scale: 4.0.2 + react: 19.2.7 + transitivePeerDependencies: + - react-dom + '@noble/ciphers@2.2.0': {} + '@noble/hashes@1.4.0': {} + '@noble/hashes@2.0.1': {} '@nodable/entities@2.1.0': {} + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + '@oazapfts/runtime@1.2.0': {} '@octokit/app@16.1.2': @@ -12539,6 +19673,100 @@ snapshots: '@parcel/watcher-win32-ia32': 2.4.1 '@parcel/watcher-win32-x64': 2.4.1 + '@peculiar/asn1-cms@2.7.0': + dependencies: + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-x509-attr': 2.7.0 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-csr@2.7.0': + dependencies: + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.7.0': + dependencies: + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-pfx@2.7.0': + dependencies: + '@peculiar/asn1-cms': 2.7.0 + '@peculiar/asn1-pkcs8': 2.7.0 + '@peculiar/asn1-rsa': 2.7.0 + '@peculiar/asn1-schema': 2.7.0 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs8@2.7.0': + dependencies: + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs9@2.7.0': + dependencies: + '@peculiar/asn1-cms': 2.7.0 + '@peculiar/asn1-pfx': 2.7.0 + '@peculiar/asn1-pkcs8': 2.7.0 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-x509-attr': 2.7.0 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.7.0': + dependencies: + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.7.0': + dependencies: + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-x509-attr@2.7.0': + dependencies: + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.7.0': + dependencies: + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/utils@2.0.3': + dependencies: + tslib: 2.8.1 + + '@peculiar/x509@1.14.3': + dependencies: + '@peculiar/asn1-cms': 2.7.0 + '@peculiar/asn1-csr': 2.7.0 + '@peculiar/asn1-ecc': 2.7.0 + '@peculiar/asn1-pkcs9': 2.7.0 + '@peculiar/asn1-rsa': 2.7.0 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + pvtsutils: 1.3.6 + reflect-metadata: 0.2.2 + tslib: 2.8.1 + tsyringe: 4.10.0 + '@petamoriken/float16@3.9.3': optional: true @@ -12592,6 +19820,39 @@ snapshots: '@pwshub/bellajs@13.0.2': {} + '@react-spring/animated@10.1.0(react@19.2.7)': + dependencies: + '@react-spring/shared': 10.1.0(react@19.2.7) + '@react-spring/types': 10.1.0 + react: 19.2.7 + + '@react-spring/core@10.1.0(react@19.2.7)': + dependencies: + '@react-spring/animated': 10.1.0(react@19.2.7) + '@react-spring/shared': 10.1.0(react@19.2.7) + '@react-spring/types': 10.1.0 + react: 19.2.7 + + '@react-spring/rafz@10.1.0': {} + + '@react-spring/shared@10.1.0(react@19.2.7)': + dependencies: + '@react-spring/rafz': 10.1.0 + '@react-spring/types': 10.1.0 + react: 19.2.7 + + '@react-spring/types@10.1.0': {} + + '@react-spring/web@10.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@react-spring/animated': 10.1.0(react@19.2.7) + '@react-spring/core': 10.1.0(react@19.2.7) + '@react-spring/shared': 10.1.0(react@19.2.7) + '@react-spring/types': 10.1.0 + csstype: 3.2.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + '@redis/bloom@1.2.0(@redis/client@1.6.1)': dependencies: '@redis/client': 1.6.1 @@ -12716,27 +19977,82 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.0': optional: true + '@rspack/binding-darwin-arm64@1.7.11': + optional: true + + '@rspack/binding-darwin-x64@1.7.11': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.7.11': + optional: true + + '@rspack/binding-linux-arm64-musl@1.7.11': + optional: true + + '@rspack/binding-linux-x64-gnu@1.7.11': + optional: true + + '@rspack/binding-linux-x64-musl@1.7.11': + optional: true + + '@rspack/binding-wasm32-wasi@1.7.11': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.7.11': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.7.11': + optional: true + + '@rspack/binding-win32-x64-msvc@1.7.11': + optional: true + + '@rspack/binding@1.7.11': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.7.11 + '@rspack/binding-darwin-x64': 1.7.11 + '@rspack/binding-linux-arm64-gnu': 1.7.11 + '@rspack/binding-linux-arm64-musl': 1.7.11 + '@rspack/binding-linux-x64-gnu': 1.7.11 + '@rspack/binding-linux-x64-musl': 1.7.11 + '@rspack/binding-wasm32-wasi': 1.7.11 + '@rspack/binding-win32-arm64-msvc': 1.7.11 + '@rspack/binding-win32-ia32-msvc': 1.7.11 + '@rspack/binding-win32-x64-msvc': 1.7.11 + + '@rspack/core@1.7.11(@swc/helpers@0.5.15)': + dependencies: + '@module-federation/runtime-tools': 0.22.0 + '@rspack/binding': 1.7.11 + '@rspack/lite-tapable': 1.1.0 + optionalDependencies: + '@swc/helpers': 0.5.15 + + '@rspack/lite-tapable@1.1.0': {} + '@rvf/set-get@7.0.1': {} - '@scalar/agent-chat@0.12.6(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3)': + '@scalar/agent-chat@0.12.7(nprogress@0.2.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)(zod@4.4.3)': dependencies: '@ai-sdk/vue': 3.0.33(vue@3.5.35(typescript@5.9.3))(zod@4.4.3) - '@scalar/api-client': 3.9.0(tailwindcss@4.3.0)(typescript@5.9.3) - '@scalar/components': 0.26.1(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/api-client': 3.10.0(nprogress@0.2.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3) + '@scalar/components': 0.27.0(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3) '@scalar/helpers': 0.8.1 '@scalar/icons': 0.7.3(typescript@5.9.3) '@scalar/json-magic': 0.12.15 '@scalar/openapi-types': 0.9.1 - '@scalar/schemas': 0.3.3 - '@scalar/themes': 0.15.6 - '@scalar/types': 0.12.3 + '@scalar/schemas': 0.4.0 + '@scalar/themes': 0.16.0 + '@scalar/types': 0.13.0 '@scalar/use-toasts': 0.10.2(typescript@5.9.3) '@scalar/validation': 0.6.0 - '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + '@scalar/workspace-store': 0.54.0(typescript@5.9.3) '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) ai: 6.0.33(zod@4.4.3) js-base64: 3.7.8 - neverpanic: 0.0.7(typescript@5.9.3) + neverpanic: 0.0.8 truncate-json: 3.0.1 vue: 3.5.35(typescript@5.9.3) transitivePeerDependencies: @@ -12756,28 +20072,28 @@ snapshots: - universal-cookie - zod - '@scalar/api-client@3.9.0(tailwindcss@4.3.0)(typescript@5.9.3)': + '@scalar/api-client@3.10.0(nprogress@0.2.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)': dependencies: - '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.0) + '@headlessui/tailwindcss': 0.2.2(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0)) '@headlessui/vue': 1.7.23(vue@3.5.35(typescript@5.9.3)) - '@scalar/components': 0.26.1(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/components': 0.27.0(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3) '@scalar/helpers': 0.8.1 '@scalar/icons': 0.7.3(typescript@5.9.3) '@scalar/json-magic': 0.12.15 - '@scalar/oas-utils': 0.18.0(typescript@5.9.3) + '@scalar/oas-utils': 0.18.1(typescript@5.9.3) '@scalar/openapi-types': 0.9.1 - '@scalar/sidebar': 0.9.18(tailwindcss@4.3.0)(typescript@5.9.3) - '@scalar/snippetz': 0.9.12 - '@scalar/themes': 0.15.6 + '@scalar/sidebar': 0.9.19(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3) + '@scalar/snippetz': 0.9.13 + '@scalar/themes': 0.16.0 '@scalar/typebox': 0.1.3 - '@scalar/types': 0.12.3 + '@scalar/types': 0.13.0 '@scalar/use-codemirror': 0.14.11(typescript@5.9.3) '@scalar/use-hooks': 0.4.6(typescript@5.9.3) '@scalar/use-toasts': 0.10.2(typescript@5.9.3) - '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + '@scalar/workspace-store': 0.54.0(typescript@5.9.3) '@types/har-format': 1.2.16 '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) - '@vueuse/integrations': 13.9.0(focus-trap@7.8.0)(fuse.js@7.4.2)(vue@3.5.35(typescript@5.9.3)) + '@vueuse/integrations': 13.9.0(focus-trap@7.8.0)(fuse.js@7.4.2)(nprogress@0.2.0)(vue@3.5.35(typescript@5.9.3)) cookie: 1.1.1 focus-trap: 7.8.0 fuse.js: 7.4.2 @@ -12806,10 +20122,10 @@ snapshots: - typescript - universal-cookie - '@scalar/api-reference-react@0.9.42(react@19.2.7)(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3)': + '@scalar/api-reference-react@0.9.43(nprogress@0.2.0)(react@19.2.7)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)(zod@4.4.3)': dependencies: - '@scalar/api-reference': 1.58.0(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3) - '@scalar/types': 0.12.3 + '@scalar/api-reference': 1.59.0(nprogress@0.2.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)(zod@4.4.3) + '@scalar/types': 0.13.0 react: 19.2.7 transitivePeerDependencies: - '@vue/composition-api' @@ -12828,25 +20144,25 @@ snapshots: - universal-cookie - zod - '@scalar/api-reference@1.58.0(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3)': + '@scalar/api-reference@1.59.0(nprogress@0.2.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)(zod@4.4.3)': dependencies: '@headlessui/vue': 1.7.23(vue@3.5.35(typescript@5.9.3)) - '@scalar/agent-chat': 0.12.6(tailwindcss@4.3.0)(typescript@5.9.3)(zod@4.4.3) - '@scalar/api-client': 3.9.0(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/agent-chat': 0.12.7(nprogress@0.2.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)(zod@4.4.3) + '@scalar/api-client': 3.10.0(nprogress@0.2.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3) '@scalar/code-highlight': 0.3.4 - '@scalar/components': 0.26.1(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/components': 0.27.0(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3) '@scalar/helpers': 0.8.1 '@scalar/icons': 0.7.3(typescript@5.9.3) - '@scalar/oas-utils': 0.18.0(typescript@5.9.3) - '@scalar/schemas': 0.3.3 - '@scalar/sidebar': 0.9.18(tailwindcss@4.3.0)(typescript@5.9.3) - '@scalar/snippetz': 0.9.12 - '@scalar/themes': 0.15.6 - '@scalar/types': 0.12.3 + '@scalar/oas-utils': 0.18.1(typescript@5.9.3) + '@scalar/schemas': 0.4.0 + '@scalar/sidebar': 0.9.19(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3) + '@scalar/snippetz': 0.9.13 + '@scalar/themes': 0.16.0 + '@scalar/types': 0.13.0 '@scalar/use-hooks': 0.4.6(typescript@5.9.3) '@scalar/use-toasts': 0.10.2(typescript@5.9.3) '@scalar/validation': 0.6.0 - '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + '@scalar/workspace-store': 0.54.0(typescript@5.9.3) '@unhead/vue': 2.1.15(vue@3.5.35(typescript@5.9.3)) '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) fuse.js: 7.4.2 @@ -12891,23 +20207,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@scalar/components@0.26.1(tailwindcss@4.3.0)(typescript@5.9.3)': + '@scalar/components@0.27.0(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)': dependencies: '@floating-ui/utils': 0.2.10 '@floating-ui/vue': 1.1.9(vue@3.5.35(typescript@5.9.3)) - '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.0) + '@headlessui/tailwindcss': 0.2.2(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0)) '@headlessui/vue': 1.7.23(vue@3.5.35(typescript@5.9.3)) '@scalar/code-highlight': 0.3.4 '@scalar/helpers': 0.8.1 '@scalar/icons': 0.7.3(typescript@5.9.3) - '@scalar/themes': 0.15.6 + '@scalar/themes': 0.16.0 '@scalar/use-hooks': 0.4.6(typescript@5.9.3) '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) cva: 1.0.0-beta.4(typescript@5.9.3) - nanoid: 5.1.11 radix-vue: 1.9.17(vue@3.5.35(typescript@5.9.3)) vue: 3.5.35(typescript@5.9.3) - vue-component-type-helpers: 3.3.3 + vue-component-type-helpers: 3.3.4 transitivePeerDependencies: - '@vue/composition-api' - supports-color @@ -12931,12 +20246,12 @@ snapshots: pathe: 2.0.3 yaml: 2.9.0 - '@scalar/oas-utils@0.18.0(typescript@5.9.3)': + '@scalar/oas-utils@0.18.1(typescript@5.9.3)': dependencies: '@scalar/helpers': 0.8.1 - '@scalar/themes': 0.15.6 - '@scalar/types': 0.12.3 - '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + '@scalar/themes': 0.16.0 + '@scalar/types': 0.13.0 + '@scalar/workspace-store': 0.54.0(typescript@5.9.3) flatted: 3.4.2 vue: 3.5.35(typescript@5.9.3) yaml: 2.9.0 @@ -12949,19 +20264,19 @@ snapshots: dependencies: '@scalar/openapi-types': 0.9.1 - '@scalar/schemas@0.3.3': + '@scalar/schemas@0.4.0': dependencies: '@scalar/helpers': 0.8.1 '@scalar/validation': 0.6.0 - '@scalar/sidebar@0.9.18(tailwindcss@4.3.0)(typescript@5.9.3)': + '@scalar/sidebar@0.9.19(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3)': dependencies: - '@scalar/components': 0.26.1(tailwindcss@4.3.0)(typescript@5.9.3) + '@scalar/components': 0.27.0(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0))(typescript@5.9.3) '@scalar/helpers': 0.8.1 '@scalar/icons': 0.7.3(typescript@5.9.3) - '@scalar/themes': 0.15.6 + '@scalar/themes': 0.16.0 '@scalar/use-hooks': 0.4.6(typescript@5.9.3) - '@scalar/workspace-store': 0.53.0(typescript@5.9.3) + '@scalar/workspace-store': 0.54.0(typescript@5.9.3) vue: 3.5.35(typescript@5.9.3) transitivePeerDependencies: - '@vue/composition-api' @@ -12969,20 +20284,20 @@ snapshots: - tailwindcss - typescript - '@scalar/snippetz@0.9.12': + '@scalar/snippetz@0.9.13': dependencies: '@scalar/helpers': 0.8.1 - '@scalar/types': 0.12.3 + '@scalar/types': 0.13.0 js-base64: 3.7.8 stringify-object: 6.0.0 - '@scalar/themes@0.15.6': + '@scalar/themes@0.16.0': dependencies: nanoid: 5.1.11 '@scalar/typebox@0.1.3': {} - '@scalar/types@0.12.3': + '@scalar/types@0.13.0': dependencies: '@scalar/helpers': 0.8.1 nanoid: 5.1.11 @@ -13029,15 +20344,15 @@ snapshots: '@scalar/validation@0.6.0': {} - '@scalar/workspace-store@0.53.0(typescript@5.9.3)': + '@scalar/workspace-store@0.54.0(typescript@5.9.3)': dependencies: '@scalar/helpers': 0.8.1 '@scalar/json-magic': 0.12.15 '@scalar/openapi-upgrader': 0.2.9 - '@scalar/schemas': 0.3.3 - '@scalar/snippetz': 0.9.12 + '@scalar/schemas': 0.4.0 + '@scalar/snippetz': 0.9.13 '@scalar/typebox': 0.1.3 - '@scalar/types': 0.12.3 + '@scalar/types': 0.13.0 '@scalar/validation': 0.6.0 js-base64: 3.7.8 type-fest: 5.6.0 @@ -13108,7 +20423,7 @@ snapshots: p-filter: 4.1.0 semantic-release: 25.0.3(typescript@5.9.3) tinyglobby: 0.2.15 - undici: 7.27.1 + undici: 7.25.0 url-join: 5.0.0 transitivePeerDependencies: - supports-color @@ -13146,10 +20461,56 @@ snapshots: transitivePeerDependencies: - supports-color + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@signalwire/docusaurus-plugin-llms-txt@1.2.2(@docusaurus/core@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))': + dependencies: + '@docusaurus/core': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + fs-extra: 11.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-string: 3.0.1 + p-map: 7.0.3 + rehype-parse: 9.0.1 + rehype-remark: 10.0.1 + remark-gfm: 4.0.1 + remark-stringify: 11.0.0 + string-width: 5.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@sinclair/typebox@0.27.10': {} + '@sindresorhus/is@4.6.0': {} + '@sindresorhus/is@5.6.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@slorber/react-helmet-async@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + '@slorber/remark-comment@1.0.0': + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + '@so-ric/colorspace@1.1.6': dependencies: color: 5.0.2 @@ -13159,6 +20520,99 @@ snapshots: '@standard-schema/utils@0.3.0': {} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@svgr/babel-preset@8.1.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.0) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.0) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.0) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.29.0) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.29.0) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.29.0) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.0) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.0) + + '@svgr/core@8.1.0(typescript@5.9.3)': + dependencies: + '@babel/core': 7.29.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.0) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.9.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.29.7 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))': + dependencies: + '@babel/core': 7.29.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.0) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@svgr/core': 8.1.0(typescript@5.9.3) + cosmiconfig: 8.3.6(typescript@5.9.3) + deepmerge: 4.3.1 + svgo: 3.3.3 + transitivePeerDependencies: + - typescript + + '@svgr/webpack@8.1.0(typescript@5.9.3)': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-constant-elements': 7.29.7(@babel/core@7.29.0) + '@babel/preset-env': 7.29.7(@babel/core@7.29.0) + '@babel/preset-react': 7.29.7(@babel/core@7.29.0) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.0) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + - typescript + '@swc/core-darwin-arm64@1.15.3': optional: true @@ -13189,7 +20643,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.15.3': optional: true - '@swc/core@1.15.3': + '@swc/core@1.15.3(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 @@ -13204,6 +20658,7 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.15.3 '@swc/core-win32-ia32-msvc': 1.15.3 '@swc/core-win32-x64-msvc': 1.15.3 + '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} @@ -13211,10 +20666,67 @@ snapshots: dependencies: tslib: 2.8.1 + '@swc/html-darwin-arm64@1.15.40': + optional: true + + '@swc/html-darwin-x64@1.15.40': + optional: true + + '@swc/html-linux-arm-gnueabihf@1.15.40': + optional: true + + '@swc/html-linux-arm64-gnu@1.15.40': + optional: true + + '@swc/html-linux-arm64-musl@1.15.40': + optional: true + + '@swc/html-linux-ppc64-gnu@1.15.40': + optional: true + + '@swc/html-linux-s390x-gnu@1.15.40': + optional: true + + '@swc/html-linux-x64-gnu@1.15.40': + optional: true + + '@swc/html-linux-x64-musl@1.15.40': + optional: true + + '@swc/html-win32-arm64-msvc@1.15.40': + optional: true + + '@swc/html-win32-ia32-msvc@1.15.40': + optional: true + + '@swc/html-win32-x64-msvc@1.15.40': + optional: true + + '@swc/html@1.15.40': + dependencies: + '@swc/counter': 0.1.3 + optionalDependencies: + '@swc/html-darwin-arm64': 1.15.40 + '@swc/html-darwin-x64': 1.15.40 + '@swc/html-linux-arm-gnueabihf': 1.15.40 + '@swc/html-linux-arm64-gnu': 1.15.40 + '@swc/html-linux-arm64-musl': 1.15.40 + '@swc/html-linux-ppc64-gnu': 1.15.40 + '@swc/html-linux-s390x-gnu': 1.15.40 + '@swc/html-linux-x64-gnu': 1.15.40 + '@swc/html-linux-x64-musl': 1.15.40 + '@swc/html-win32-arm64-msvc': 1.15.40 + '@swc/html-win32-ia32-msvc': 1.15.40 + '@swc/html-win32-x64-msvc': 1.15.40 + '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + '@t3-oss/env-core@0.13.11(arktype@2.1.20)(typescript@5.9.3)(zod@4.4.3)': optionalDependencies: arktype: 2.1.20 @@ -13576,6 +21088,8 @@ snapshots: react: 19.2.7 typescript: 5.9.3 + '@tsconfig/docusaurus@2.0.9': {} + '@turbo/darwin-64@2.9.16': optional: true @@ -13601,6 +21115,11 @@ snapshots: '@turbo/windows-arm64@2.9.16': optional: true + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + '@types/adm-zip@0.5.8': dependencies: '@types/node': 24.13.1 @@ -13621,7 +21140,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.7 '@babel/types': 7.29.0 '@types/babel__traverse@7.20.6': @@ -13639,7 +21158,11 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.12.4 + '@types/node': 24.13.1 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 24.13.1 '@types/chai@5.2.2': dependencies: @@ -13647,6 +21170,11 @@ snapshots: '@types/chroma-js@3.1.2': {} + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 4.19.5 + '@types/node': 24.13.1 + '@types/connect@3.4.38': dependencies: '@types/node': 24.12.4 @@ -13664,28 +21192,129 @@ snapshots: '@types/d3-array@3.2.1': {} + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-chord@3.0.6': {} + '@types/d3-color@3.1.3': {} + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.1 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-dsv@3.0.7': {} + '@types/d3-ease@3.0.2': {} + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@1.4.5': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 '@types/d3-path@3.1.1': {} + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.3': {} + + '@types/d3-scale-chromatic@3.1.0': {} + '@types/d3-scale@4.0.9': dependencies: '@types/d3-time': 3.0.4 + '@types/d3-selection@3.0.11': {} + '@types/d3-shape@3.1.7': dependencies: '@types/d3-path': 3.1.1 + '@types/d3-time-format@2.3.4': {} + + '@types/d3-time-format@3.0.4': {} + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@1.1.4': {} + '@types/d3-time@3.0.4': {} '@types/d3-timer@3.0.2': {} + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -13711,7 +21340,7 @@ snapshots: '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -13723,14 +21352,45 @@ snapshots: '@types/qs': 6.9.16 '@types/serve-static': 1.15.7 + '@types/express@4.17.25': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.16 + '@types/serve-static': 1.15.7 + + '@types/geojson@7946.0.16': {} + + '@types/gtag.js@0.0.20': {} + '@types/har-format@1.2.16': {} '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 + '@types/history@4.7.11': {} + + '@types/html-minifier-terser@6.1.0': {} + + '@types/http-cache-semantics@4.2.0': {} + '@types/http-errors@2.0.4': {} + '@types/http-proxy@1.17.17': + dependencies: + '@types/node': 24.13.1 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/js-yaml@4.0.9': {} '@types/json-schema@7.0.15': {} @@ -13741,6 +21401,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/mdx@2.0.14': {} + '@types/mime@1.3.5': {} '@types/ms@2.1.0': {} @@ -13754,6 +21416,8 @@ snapshots: dependencies: eventemitter2: 6.4.9 + '@types/node@17.0.45': {} + '@types/node@18.19.50': dependencies: undici-types: 5.26.5 @@ -13792,6 +21456,23 @@ snapshots: dependencies: '@types/react': 19.2.16 + '@types/react-router-config@5.0.11': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.16 + '@types/react-router': 5.1.20 + + '@types/react-router-dom@5.3.3': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.16 + '@types/react-router': 5.1.20 + + '@types/react-router@5.1.20': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.16 + '@types/react@18.3.31': dependencies: '@types/prop-types': 15.7.15 @@ -13802,17 +21483,27 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/retry@0.12.2': {} + + '@types/sax@1.2.7': + dependencies: + '@types/node': 24.13.1 + '@types/semver@7.5.8': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.12.4 + '@types/node': 24.13.1 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.25 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/send': 0.17.4 '@types/set-cookie-parser@2.4.10': @@ -13820,13 +21511,17 @@ snapshots: '@types/node': 24.13.1 optional: true + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 24.13.1 + '@types/ssh2-streams@0.1.12': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/ssh2@0.5.52': dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 '@types/ssh2-streams': 0.1.12 '@types/ssh2@1.15.1': @@ -13865,6 +21560,12 @@ snapshots: dependencies: '@types/node': 24.12.4 + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + '@umami/node@0.4.0': {} '@ungap/structured-clone@1.3.0': {} @@ -13875,6 +21576,11 @@ snapshots: unhead: 2.1.15 vue: 3.5.35(typescript@5.9.3) + '@upsetjs/venn.js@2.0.0': + optionalDependencies: + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + '@vercel/oidc@3.1.0': {} '@videojs/http-streaming@3.17.4(video.js@8.23.7)': @@ -13905,7 +21611,7 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-react@5.2.0(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vitejs/plugin-react@5.2.0(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -13913,7 +21619,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -13929,7 +21635,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/expect@4.1.8': dependencies: @@ -13940,14 +21646,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.8(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.14.6(@types/node@24.13.1)(typescript@5.9.3) - vite: 7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.8': dependencies: @@ -13976,7 +21682,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/utils@4.1.8': dependencies: @@ -14055,7 +21761,7 @@ snapshots: '@vueuse/shared': 13.9.0(vue@3.5.35(typescript@5.9.3)) vue: 3.5.35(typescript@5.9.3) - '@vueuse/integrations@13.9.0(focus-trap@7.8.0)(fuse.js@7.4.2)(vue@3.5.35(typescript@5.9.3))': + '@vueuse/integrations@13.9.0(focus-trap@7.8.0)(fuse.js@7.4.2)(nprogress@0.2.0)(vue@3.5.35(typescript@5.9.3))': dependencies: '@vueuse/core': 13.9.0(vue@3.5.35(typescript@5.9.3)) '@vueuse/shared': 13.9.0(vue@3.5.35(typescript@5.9.3)) @@ -14063,6 +21769,7 @@ snapshots: optionalDependencies: focus-trap: 7.8.0 fuse.js: 7.4.2 + nprogress: 0.2.0 '@vueuse/metadata@10.11.1': {} @@ -14175,6 +21882,11 @@ snapshots: abstract-logging@2.0.1: {} + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + accepts@2.0.0: dependencies: mime-types: 3.0.2 @@ -14188,8 +21900,14 @@ snapshots: dependencies: acorn: 8.16.0 + acorn-walk@8.3.5: + dependencies: + acorn: 8.16.0 + acorn@8.16.0: {} + address@1.2.2: {} + adm-zip@0.5.17: {} aes-decrypter@4.0.2: @@ -14229,11 +21947,22 @@ snapshots: optionalDependencies: ajv: 8.18.0 + ajv-keywords@3.5.2(ajv@6.15.0): + dependencies: + ajv: 6.15.0 + ajv-keywords@5.1.0(ajv@8.18.0): dependencies: ajv: 8.18.0 fast-deep-equal: 3.1.3 + ajv@6.15.0: + 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 + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -14241,10 +21970,38 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + algoliasearch-helper@3.29.1(algoliasearch@5.53.0): + dependencies: + '@algolia/events': 4.0.1 + algoliasearch: 5.53.0 + + algoliasearch@5.53.0: + dependencies: + '@algolia/abtesting': 1.19.0 + '@algolia/client-abtesting': 5.53.0 + '@algolia/client-analytics': 5.53.0 + '@algolia/client-common': 5.53.0 + '@algolia/client-insights': 5.53.0 + '@algolia/client-personalization': 5.53.0 + '@algolia/client-query-suggestions': 5.53.0 + '@algolia/client-search': 5.53.0 + '@algolia/ingestion': 1.53.0 + '@algolia/monitoring': 1.53.0 + '@algolia/recommend': 5.53.0 + '@algolia/requester-browser-xhr': 5.53.0 + '@algolia/requester-fetch': 5.53.0 + '@algolia/requester-node-http': 5.53.0 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-escapes@7.0.0: dependencies: environment: 1.1.0 + ansi-html-community@0.0.8: {} + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -14259,8 +22016,15 @@ snapshots: ansi-styles@6.2.3: {} + ansis@3.17.0: {} + any-promise@1.3.0: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + archiver-utils@5.0.2: dependencies: glob: 10.5.0 @@ -14281,6 +22045,12 @@ snapshots: tar-stream: 3.1.7 zip-stream: 6.0.1 + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} argv-formatter@1.0.0: {} @@ -14295,18 +22065,30 @@ snapshots: '@ark/util': 0.46.0 optional: true + array-flatten@1.1.1: {} + array-ify@1.0.0: {} + array-union@2.1.0: {} + asn1@0.2.6: dependencies: safer-buffer: 2.1.2 + asn1js@3.0.10: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + ast-v8-to-istanbul@1.0.0: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 10.0.0 + astring@1.9.0: {} + async-lock@1.4.1: {} async@3.2.6: {} @@ -14317,6 +22099,15 @@ snapshots: attr-accept@2.2.5: {} + autoprefixer@10.5.0(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001793 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + avvio@9.2.0: dependencies: '@fastify/error': 4.2.0 @@ -14342,6 +22133,49 @@ snapshots: b4a@1.6.6: {} + babel-loader@9.2.1(@babel/core@7.29.0)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + '@babel/core': 7.29.0 + find-cache-dir: 4.0.0 + schema-utils: 4.3.3 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + + babel-plugin-dynamic-import-node@2.3.3: + dependencies: + object.assign: 4.1.7 + + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + babel-plugin-react-compiler@1.0.0: dependencies: '@babel/types': 7.29.0 @@ -14383,6 +22217,10 @@ snapshots: baseline-browser-mapping@2.10.31: {} + batch@0.6.1: {} + + bcp-47-match@2.0.3: {} + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 @@ -14394,15 +22232,15 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)): + better-auth@1.6.15(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)): dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) - '@better-auth/drizzle-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1)) - '@better-auth/kysely-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.29.2) - '@better-auth/memory-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) - '@better-auth/mongo-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) - '@better-auth/prisma-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) - '@better-auth/telemetry': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21) + '@better-auth/core': 1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0) + '@better-auth/drizzle-adapter': 1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1)) + '@better-auth/kysely-adapter': 1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.29.2) + '@better-auth/memory-adapter': 1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/mongo-adapter': 1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/prisma-adapter': 1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/telemetry': 1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.29.2)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21) '@better-auth/utils': 0.4.1 '@better-fetch/fetch': 1.1.21 '@noble/ciphers': 2.2.0 @@ -14422,7 +22260,7 @@ snapshots: pg: 8.21.0 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vue: 3.5.35(typescript@5.9.3) transitivePeerDependencies: - '@cloudflare/workers-types' @@ -14452,6 +22290,8 @@ snapshots: bignumber.js@9.3.1: {} + binary-extensions@2.3.0: {} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -14462,12 +22302,29 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + body-parser@1.20.5: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.15.2 + raw-body: 2.5.3 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + body-parser@2.2.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 qs: 6.15.2 @@ -14476,8 +22333,37 @@ snapshots: transitivePeerDependencies: - supports-color + bonjour-service@1.4.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + boolbase@1.0.0: {} + bottleneck@2.19.5: {} + boxen@6.2.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + boxen@7.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.2 @@ -14511,15 +22397,42 @@ snapshots: buildcheck@0.0.6: optional: true + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + byline@5.0.0: {} + bytes@3.0.0: {} + bytes@3.1.2: {} + bytestreamjs@2.0.1: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.2.0 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.1.1 + responselike: 3.0.0 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -14527,8 +22440,24 @@ snapshots: callsites@3.1.0: {} + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + camelcase-css@2.0.1: {} + camelcase@6.3.0: {} + + camelcase@7.0.1: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001793 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + caniuse-lite@1.0.30001793: {} ccount@2.0.1: {} @@ -14562,6 +22491,51 @@ snapshots: chardet@2.1.1: {} + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + htmlparser2: 8.0.2 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + + cheerio@1.2.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.25.0 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + 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 + chokidar@5.0.0: dependencies: readdirp: 5.0.0 @@ -14572,12 +22546,20 @@ snapshots: chrome-trace-event@1.0.4: {} + ci-info@3.9.0: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + clean-stack@2.2.0: {} clean-stack@5.2.0: dependencies: escape-string-regexp: 5.0.0 + cli-boxes@3.0.0: {} + cli-highlight@2.1.11: dependencies: chalk: 4.1.2 @@ -14615,6 +22597,12 @@ snapshots: strip-ansi: 7.1.2 wrap-ansi: 9.0.2 + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + clsx@2.1.1: {} cluster-key-slot@1.1.1: {} @@ -14629,6 +22617,8 @@ snapshots: raw-body: 2.5.2 type-is: 1.6.18 + collapse-white-space@2.1.0: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -14656,16 +22646,34 @@ snapshots: color-convert: 3.1.2 color-string: 2.1.2 + colord@2.9.3: {} + + colorette@2.0.20: {} + + combine-promises@1.2.0: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} + commander@11.1.0: {} commander@2.20.3: {} + commander@4.1.1: {} + + commander@5.1.0: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + common-path-prefix@3.0.0: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -14679,6 +22687,22 @@ snapshots: normalize-path: 3.0.0 readable-stream: 4.5.2 + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + concurrently@9.2.1: dependencies: chalk: 4.1.2 @@ -14693,6 +22717,24 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 + configstore@6.0.0: + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + + connect-history-api-fallback@2.0.0: {} + + consola@3.4.2: {} + + content-disposition@0.5.2: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -14729,6 +22771,8 @@ snapshots: cookie-es@3.0.1: {} + cookie-signature@1.0.7: {} + cookie-signature@1.2.2: {} cookie@0.7.2: {} @@ -14744,6 +22788,24 @@ snapshots: dependencies: is-what: 5.5.0 + copy-text-to-clipboard@3.2.2: {} + + copy-webpack-plugin@11.0.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + fast-glob: 3.3.3 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + + core-js-compat@3.49.0: + dependencies: + browserslist: 4.28.2 + + core-js@3.49.0: {} + core-util-is@1.0.3: {} cors@2.8.6: @@ -14751,6 +22813,23 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + + cosmiconfig@8.3.6(typescript@5.9.3): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.1 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.3 + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 @@ -14798,13 +22877,151 @@ snapshots: dependencies: type-fest: 1.4.0 + css-blank-pseudo@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + css-declaration-sorter@7.4.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + css-has-pseudo@7.0.3(postcss@8.5.8): + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + css-loader@6.11.0(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.8) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.8) + postcss-modules-scope: 3.2.1(postcss@8.5.8) + postcss-modules-values: 4.0.0(postcss@8.5.8) + postcss-value-parser: 4.2.0 + semver: 7.7.4 + optionalDependencies: + '@rspack/core': 1.7.11(@swc/helpers@0.5.15) + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(lightningcss@1.32.0)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + cssnano: 6.1.2(postcss@8.5.8) + jest-worker: 29.7.0 + postcss: 8.5.8 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + optionalDependencies: + clean-css: 5.3.3 + lightningcss: 1.32.0 + + css-prefers-color-scheme@10.0.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.3.0: {} + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + css-tree@3.2.1: dependencies: mdn-data: 2.27.1 source-map-js: 1.2.1 + css-what@6.2.2: {} + + cssdb@8.9.0: {} + cssesc@3.0.0: {} + cssnano-preset-advanced@6.1.2(postcss@8.5.8): + dependencies: + autoprefixer: 10.5.0(postcss@8.5.8) + browserslist: 4.28.2 + cssnano-preset-default: 6.1.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-discard-unused: 6.0.5(postcss@8.5.8) + postcss-merge-idents: 6.0.3(postcss@8.5.8) + postcss-reduce-idents: 6.0.3(postcss@8.5.8) + postcss-zindex: 6.0.2(postcss@8.5.8) + + cssnano-preset-default@6.1.2(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + css-declaration-sorter: 7.4.0(postcss@8.5.8) + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-calc: 9.0.1(postcss@8.5.8) + postcss-colormin: 6.1.0(postcss@8.5.8) + postcss-convert-values: 6.1.0(postcss@8.5.8) + postcss-discard-comments: 6.0.2(postcss@8.5.8) + postcss-discard-duplicates: 6.0.3(postcss@8.5.8) + postcss-discard-empty: 6.0.3(postcss@8.5.8) + postcss-discard-overridden: 6.0.2(postcss@8.5.8) + postcss-merge-longhand: 6.0.5(postcss@8.5.8) + postcss-merge-rules: 6.1.1(postcss@8.5.8) + postcss-minify-font-values: 6.1.0(postcss@8.5.8) + postcss-minify-gradients: 6.0.3(postcss@8.5.8) + postcss-minify-params: 6.1.0(postcss@8.5.8) + postcss-minify-selectors: 6.0.4(postcss@8.5.8) + postcss-normalize-charset: 6.0.2(postcss@8.5.8) + postcss-normalize-display-values: 6.0.2(postcss@8.5.8) + postcss-normalize-positions: 6.0.2(postcss@8.5.8) + postcss-normalize-repeat-style: 6.0.2(postcss@8.5.8) + postcss-normalize-string: 6.0.2(postcss@8.5.8) + postcss-normalize-timing-functions: 6.0.2(postcss@8.5.8) + postcss-normalize-unicode: 6.1.0(postcss@8.5.8) + postcss-normalize-url: 6.0.2(postcss@8.5.8) + postcss-normalize-whitespace: 6.0.2(postcss@8.5.8) + postcss-ordered-values: 6.0.2(postcss@8.5.8) + postcss-reduce-initial: 6.1.0(postcss@8.5.8) + postcss-reduce-transforms: 6.0.2(postcss@8.5.8) + postcss-svgo: 6.0.3(postcss@8.5.8) + postcss-unique-selectors: 6.0.4(postcss@8.5.8) + + cssnano-utils@4.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + cssnano@6.1.2(postcss@8.5.8): + dependencies: + cssnano-preset-default: 6.1.2(postcss@8.5.8) + lilconfig: 3.1.3 + postcss: 8.5.8 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + csstype@3.2.3: {} cva@1.0.0-beta.4(typescript@5.9.3): @@ -14813,22 +23030,109 @@ snapshots: optionalDependencies: typescript: 5.9.3 + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.0): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.34.0 + + cytoscape-fcose@2.2.0(cytoscape@3.34.0): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.34.0 + + cytoscape@3.34.0: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + d3-array@3.2.4: dependencies: internmap: 2.0.3 + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + d3-color@3.1.0: {} + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.1.0 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + d3-ease@3.0.1: {} + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@1.4.5: {} + d3-format@3.1.0: {} + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 + d3-path@1.0.9: {} + d3-path@3.1.0: {} + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 @@ -14837,20 +23141,87 @@ snapshots: d3-time: 3.1.0 d3-time-format: 4.1.0 + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 + d3-time-format@3.0.0: + dependencies: + d3-time: 1.1.0 + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 + d3-time@1.1.0: {} + d3-time@3.1.0: dependencies: d3-array: 3.2.4 d3-timer@3.0.1: {} + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.14: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + data-urls@7.0.0(@noble/hashes@2.0.1): dependencies: whatwg-mimetype: 5.0.0 @@ -14860,6 +23231,12 @@ snapshots: dayjs@1.11.21: {} + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@4.4.3: dependencies: ms: 2.1.3 @@ -14885,36 +23262,88 @@ snapshots: deepmerge@4.3.1: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + defu@6.1.7: {} + delaunator@5.1.0: + dependencies: + robust-predicates: 3.0.3 + delayed-stream@1.0.0: {} denque@2.1.0: {} + depd@1.1.2: {} + depd@2.0.0: {} dequal@2.0.3: {} destr@2.0.5: {} + destroy@1.2.0: {} + detect-libc@1.0.3: {} detect-libc@2.1.2: {} detect-node-es@1.1.0: {} + detect-node@2.1.0: {} + + detect-port@1.6.1: + dependencies: + address: 1.2.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + devlop@1.1.0: dependencies: dequal: 2.0.3 + didyoumean@1.2.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 + direction@2.0.1: {} + + dlv@1.1.3: {} + dns-caching@0.2.9: dependencies: lru-cache: 11.3.5 + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + docker-compose@1.4.2: dependencies: yaml: 2.9.0 @@ -14939,21 +23368,78 @@ snapshots: transitivePeerDependencies: - supports-color + docusaurus-plugin-image-zoom@3.0.1(@docusaurus/theme-classic@3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)): + dependencies: + '@docusaurus/theme-classic': 3.10.1(@docusaurus/faster@3.10.1(@docusaurus/types@3.10.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@swc/helpers@0.5.15)(postcss@8.5.8))(@rspack/core@1.7.11(@swc/helpers@0.5.15))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/react@19.2.16)(lightningcss@1.32.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + medium-zoom: 1.1.0 + validate-peer-dependencies: 2.2.0 + + dom-converter@0.2.0: + dependencies: + utila: 0.4.0 + dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.29.7 csstype: 3.2.3 + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dom-walk@0.1.2: {} + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + dompurify@3.4.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dompurify@3.4.8: optionalDependencies: '@types/trusted-types': 2.0.7 + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + dotenv-cli@11.0.0: dependencies: cross-spawn: 7.0.6 @@ -15004,6 +23490,8 @@ snapshots: dependencies: readable-stream: 2.3.8 + duplexer@0.1.2: {} + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -15020,10 +23508,17 @@ snapshots: emojis-list@3.0.0: {} + emoticon@4.1.0: {} + enabled@2.0.0: {} encodeurl@2.0.0: {} + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -15033,6 +23528,10 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 + entities@2.2.0: {} + + entities@4.5.0: {} + entities@6.0.1: {} entities@7.0.1: {} @@ -15076,6 +23575,20 @@ snapshots: es-toolkit@1.46.1: {} + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.16.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -15165,10 +23678,14 @@ snapshots: escalade@3.2.0: {} + escape-goat@4.0.0: {} + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} + escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} eslint-scope@5.1.1: @@ -15176,6 +23693,8 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 + esprima@4.0.1: {} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -15184,22 +23703,64 @@ snapshots: estraverse@5.3.0: {} + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + estree-util-is-identifier-name@3.0.0: {} + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-value-to-estree@3.5.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 + esutils@2.0.3: {} + + eta@2.2.0: {} + etag@1.8.1: {} + eval@0.1.8: + dependencies: + '@types/node': 24.12.4 + require-like: 0.1.2 + event-target-shim@5.0.1: {} eventemitter2@6.4.9: {} eventemitter3@2.0.3: {} + eventemitter3@4.0.7: {} + eventemitter3@5.0.4: {} events@3.3.0: {} @@ -15258,6 +23819,42 @@ snapshots: express: 5.2.1 ip-address: 10.2.0 + express@4.22.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.5 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.2 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.13 + proxy-addr: 2.0.7 + qs: 6.15.2 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.2 + serve-static: 1.16.3 + setprototypeof: 1.2.0 + statuses: 2.0.2 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + express@5.2.1: dependencies: accepts: 2.0.0 @@ -15273,14 +23870,14 @@ snapshots: etag: 1.8.1 finalhandler: 2.1.1 fresh: 2.0.0 - http-errors: 2.0.0 + http-errors: 2.0.1 merge-descriptors: 2.0.0 mime-types: 3.0.2 on-finished: 2.4.1 once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.15.2 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -15291,6 +23888,10 @@ snapshots: transitivePeerDependencies: - supports-color + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + extend@3.0.2: {} fast-content-type-parse@3.0.0: {} @@ -15305,6 +23906,16 @@ snapshots: fast-fifo@1.3.2: {} + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + fast-json-stringify@6.3.0: dependencies: '@fastify/merge-json-schemas': 0.2.1 @@ -15368,12 +23979,24 @@ snapshots: dependencies: reusify: 1.1.0 + fault@2.0.1: + dependencies: + format: 0.2.2 + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.5 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 fecha@4.2.3: {} + feed@4.2.2: + dependencies: + xml-js: 1.6.11 + fflate@0.8.2: {} figures@2.0.0: @@ -15384,6 +24007,12 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 + file-loader@6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + file-selector@2.1.2: dependencies: tslib: 2.8.1 @@ -15394,6 +24023,18 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@1.3.2: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -15405,6 +24046,11 @@ snapshots: transitivePeerDependencies: - supports-color + find-cache-dir@4.0.0: + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + find-my-way@9.5.0: dependencies: fast-deep-equal: 3.1.3 @@ -15417,6 +24063,11 @@ snapshots: dependencies: locate-path: 2.0.0 + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + find-versions@6.0.0: dependencies: semver-regex: 4.0.5 @@ -15424,6 +24075,8 @@ snapshots: flag-icons@7.5.0: {} + flat@5.0.2: {} + flatted@3.4.2: {} fn.name@1.1.0: {} @@ -15439,6 +24092,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data-encoder@2.1.4: {} + form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -15447,8 +24102,14 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + format@0.2.2: {} + forwarded@0.2.0: {} + fraction.js@5.3.4: {} + + fresh@0.5.2: {} + fresh@2.0.0: {} fs-constants@1.0.0: {} @@ -15477,12 +24138,14 @@ snapshots: debug: 4.4.3 env-paths: 3.0.0 semver: 7.7.4 - shell-quote: 1.8.3 + shell-quote: 1.8.4 which: 4.0.0 transitivePeerDependencies: - supports-color optional: true + gemoji@6.1.0: {} + generate-function@2.3.1: dependencies: is-property: 1.0.2 @@ -15512,6 +24175,8 @@ snapshots: get-own-enumerable-keys@1.0.0: {} + get-own-enumerable-property-symbols@3.0.2: {} + get-port@7.2.0: {} get-proto@1.0.1: @@ -15543,6 +24208,20 @@ snapshots: github-from-package@0.0.0: {} + github-slugger@1.5.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + glob-to-regexp@0.4.1: {} glob@10.5.0: @@ -15560,15 +24239,50 @@ snapshots: minipass: 7.1.3 path-scurry: 2.0.2 + global-dirs@3.0.1: + dependencies: + ini: 2.0.0 + global@4.4.0: dependencies: min-document: 2.19.0 process: 0.11.10 + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + globrex@0.1.2: {} gopd@1.2.0: {} + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} @@ -15576,8 +24290,19 @@ snapshots: graphql@16.14.0: optional: true + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.2 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + guess-json-indent@3.0.1: {} + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + h3@1.15.11: dependencies: cookie-es: 1.2.3 @@ -15590,6 +24315,10 @@ snapshots: ufo: 1.6.4 uncrypto: 0.1.3 + hachure-fill@0.5.2: {} + + handle-thing@2.0.1: {} + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -15603,16 +24332,26 @@ snapshots: has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 + has-yarn@3.0.0: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + hast-util-embedded@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -15702,6 +24441,45 @@ snapshots: '@ungap/structured-clone': 1.3.0 unist-util-position: 5.0.0 + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 @@ -15736,6 +24514,23 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-mdast@10.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-phrasing: 3.0.1 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hast-util-whitespace: 3.0.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-hast: 13.2.0 + mdast-util-to-string: 4.0.0 + rehype-minify-whitespace: 6.0.2 + trim-trailing-lines: 2.1.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + hast-util-to-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 @@ -15746,6 +24541,10 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: dependencies: '@types/hast': 3.0.4 @@ -15765,6 +24564,8 @@ snapshots: property-information: 7.0.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + headers-polyfill@5.0.1: dependencies: '@types/set-cookie-parser': 2.4.10 @@ -15775,7 +24576,20 @@ snapshots: highlight.js@11.11.1: {} - hono@4.12.23: {} + history@4.10.1: + dependencies: + '@babel/runtime': 7.29.7 + loose-envify: 1.4.0 + resolve-pathname: 3.0.0 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + value-equal: 1.0.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 19.2.7 + + hono@4.12.24: {} hook-std@4.0.0: {} @@ -15789,6 +24603,13 @@ snapshots: dependencies: lru-cache: 11.3.5 + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + hpagent@1.2.0: {} html-encoding-sniffer@6.0.0(@noble/hashes@2.0.1): @@ -15801,12 +24622,68 @@ snapshots: html-escaper@2.0.2: {} + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.46.1 + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.46.1 + + html-tags@3.3.1: {} + html-url-attributes@3.0.1: {} html-void-elements@3.0.0: {} + html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.18.1 + pretty-error: 4.0.0 + tapable: 2.3.3 + optionalDependencies: + '@rspack/core': 1.7.11(@swc/helpers@0.5.15) + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + html-whitespace-sensitive-tag-names@3.0.1: {} + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-cache-semantics@4.2.0: {} + http-cookie-agent@6.0.8(tough-cookie@5.1.2)(undici@8.4.0): dependencies: agent-base: 7.1.3 @@ -15814,6 +24691,16 @@ snapshots: optionalDependencies: undici: 8.4.0 + http-deceiver@1.2.7: {} + + http-errors@1.8.1: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -15830,6 +24717,8 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + http-parser-js@0.5.10: {} + http-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 @@ -15837,6 +24726,31 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-middleware@2.0.9(@types/express@4.17.25): + dependencies: + '@types/http-proxy': 1.17.17 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.25 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.16.0 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + https-proxy-agent@9.0.0: dependencies: agent-base: 9.0.0 @@ -15850,16 +24764,26 @@ snapshots: human-signals@8.0.0: {} + hyperdyperid@1.2.0: {} + ical.js@2.2.1: {} iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 + icss-utils@5.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + icu-minify@4.13.0: dependencies: '@formatjs/icu-messageformat-parser': 3.5.0 @@ -15870,6 +24794,10 @@ snapshots: ieee754@1.2.1: {} + ignore@5.3.2: {} + + image-size@2.0.2: {} + immediate@3.0.6: {} immer@10.2.0: {} @@ -15890,22 +24818,34 @@ snapshots: transitivePeerDependencies: - supports-color + import-lazy@4.0.0: {} + import-meta-resolve@4.1.0: {} + import-meta-resolve@4.2.0: {} + + imurmurhash@0.1.4: {} + indent-string@4.0.0: {} indent-string@5.0.0: {} index-to-position@1.2.0: {} + infima@0.2.0-alpha.45: {} + inflation@2.1.0: {} inherits@2.0.4: {} ini@1.3.8: {} + ini@2.0.0: {} + inline-style-parser@0.2.4: {} + internmap@1.0.1: {} + internmap@2.0.3: {} intl-messageformat@11.1.1: @@ -15915,6 +24855,10 @@ snapshots: '@formatjs/icu-messageformat-parser': 3.5.0 tslib: 2.8.1 + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ioredis@5.11.0: dependencies: '@ioredis/commands': 1.10.0 @@ -15951,10 +24895,28 @@ snapshots: is-arrayish@0.2.1: {} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-buffer@1.1.6: {} + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + is-decimal@2.0.1: {} + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -15972,23 +24934,48 @@ snapshots: identifier-regex: 1.0.1 super-regex: 1.0.0 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-installed-globally@0.4.0: + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + is-network-error@1.3.2: {} + is-node-process@1.2.0: optional: true + is-npm@6.1.0: {} + is-number@7.0.0: {} + is-obj@1.0.1: {} + is-obj@2.0.0: {} is-obj@3.0.0: {} + is-path-inside@3.0.3: {} + + is-plain-obj@3.0.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + is-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} is-property@1.0.2: {} + is-regexp@1.0.0: {} + is-regexp@3.1.0: {} is-stream@2.0.1: {} @@ -15997,10 +24984,24 @@ snapshots: is-stream@4.0.1: {} + is-typedarray@1.0.0: {} + is-unicode-supported@2.1.0: {} is-what@5.5.0: {} + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + is-yarn-global@0.4.1: {} + + isarray@0.0.1: {} + isarray@1.0.0: {} isexe@2.0.0: {} @@ -16008,6 +25009,8 @@ snapshots: isexe@3.1.5: optional: true + isobject@3.0.1: {} + isomorphic-dompurify@3.16.0(@noble/hashes@2.0.1): dependencies: dompurify: 3.4.8 @@ -16053,23 +25056,46 @@ snapshots: java-properties@1.0.2: {} + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.13.1 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + jest-worker@27.5.1: dependencies: - '@types/node': 24.12.4 + '@types/node': 24.13.1 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@1.21.7: - optional: true + jest-worker@29.7.0: + dependencies: + '@types/node': 24.13.1 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.7: {} + + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 jose@6.0.8: {} jose@6.2.3: {} - jotai@2.20.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.16)(react@19.2.7): + jotai@2.20.0(@babel/core@7.29.0)(@babel/template@7.29.7)(@types/react@19.2.16)(react@19.2.7): optionalDependencies: '@babel/core': 7.29.0 - '@babel/template': 7.28.6 + '@babel/template': 7.29.7 '@types/react': 19.2.16 react: 19.2.7 @@ -16079,6 +25105,11 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -16102,7 +25133,7 @@ snapshots: saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.27.1 + undici: 7.25.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -16115,6 +25146,10 @@ snapshots: jsesc@3.0.2: {} + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + json-parse-better-errors@1.0.2: {} json-parse-even-better-errors@2.3.1: {} @@ -16123,6 +25158,8 @@ snapshots: dependencies: dequal: 2.0.3 + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} json-schema-typed@8.0.2: {} @@ -16152,20 +25189,47 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 + katex@0.16.47: + dependencies: + commander: 8.3.0 + keygrip@1.1.0: dependencies: tsscmp: 1.0.6 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + khroma@2.1.0: {} + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 + kind-of@6.0.3: {} + + kleur@3.0.3: {} + klona@2.0.6: {} kuler@2.0.0: {} kysely@0.29.2: {} + latest-version@7.0.0: + dependencies: + package-json: 8.1.1 + + launch-editor@2.14.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.4 + + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -16174,6 +25238,10 @@ snapshots: dependencies: strict-event-emitter-types: 2.0.0 + leader-line-new@1.1.9: {} + + leven@3.1.0: {} + lie@3.3.0: dependencies: immediate: 3.0.6 @@ -16184,6 +25252,57 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.2 + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} linkifyjs@4.3.3: {} @@ -16208,6 +25327,10 @@ snapshots: p-locate: 2.0.0 path-exists: 3.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + lodash-es@4.17.21: {} lodash.camelcase@4.3.0: {} @@ -16216,6 +25339,8 @@ snapshots: lodash.clonedeep@4.5.0: {} + lodash.debounce@4.0.8: {} + lodash.escaperegexp@4.1.2: {} lodash.isequal@4.5.0: {} @@ -16224,6 +25349,10 @@ snapshots: lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} + + lodash.uniq@4.5.0: {} + lodash.uniqby@4.7.0: {} lodash@4.18.1: {} @@ -16245,6 +25374,12 @@ snapshots: dependencies: js-tokens: 4.0.0 + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lowercase-keys@3.0.0: {} + lowlight@3.3.0: dependencies: '@types/hast': 3.0.4 @@ -16309,13 +25444,15 @@ snapshots: maria2@0.4.1: {} + markdown-extensions@2.0.0: {} + markdown-table@3.0.4: {} marked-terminal@7.3.0(marked@15.0.11): dependencies: ansi-escapes: 7.0.0 ansi-regex: 6.2.2 - chalk: 5.4.1 + chalk: 5.6.2 cli-highlight: 2.1.11 cli-table3: 0.6.5 marked: 15.0.11 @@ -16324,6 +25461,8 @@ snapshots: marked@15.0.11: {} + marked@16.4.2: {} + math-intrinsics@1.1.0: {} mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)): @@ -16335,6 +25474,26 @@ snapshots: optionalDependencies: next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@1.1.1: + dependencies: + escape-string-regexp: 4.0.0 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -16359,6 +25518,17 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-gfm-autolink-literal@2.0.1: dependencies: '@types/mdast': 4.0.4 @@ -16444,6 +25614,16 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -16469,7 +25649,7 @@ snapshots: micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 mdast-util-to-markdown@2.1.2: @@ -16488,18 +25668,71 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + mdn-data@2.27.1: {} media-typer@0.3.0: {} media-typer@1.1.0: {} + medium-zoom@1.1.0: {} + + memfs@4.57.6(tslib@2.8.1): + dependencies: + '@jsonjoy.com/fs-core': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.6(tslib@2.8.1) + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + meow@13.2.0: {} + merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} + merge2@1.4.1: {} + + mermaid@11.15.0: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.3 + '@mermaid-js/parser': 1.1.1 + '@types/d3': 7.4.3 + '@upsetjs/venn.js': 2.0.0 + cytoscape: 3.34.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.0) + cytoscape-fcose: 2.2.0(cytoscape@3.34.0) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.14 + dayjs: 1.11.21 + dompurify: 3.4.7 + es-toolkit: 1.46.1 + katex: 0.16.47 + khroma: 2.1.0 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.4.0 + ts-dedent: 2.2.0 + uuid: 14.0.0 + + methods@1.1.2: {} + microdiff@1.5.0: {} micromark-core-commonmark@2.0.3: @@ -16521,6 +25754,23 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 @@ -16579,6 +25829,57 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -16592,6 +25893,23 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -16611,6 +25929,11 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 @@ -16644,6 +25967,16 @@ snapshots: micromark-util-encode@2.0.1: {} + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + micromark-util-html-tag-name@2.0.1: {} micromark-util-normalize-identifier@2.0.1: @@ -16667,8 +26000,12 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-util-symbol@1.1.0: {} + micromark-util-symbol@2.0.1: {} + micromark-util-types@1.1.0: {} + micromark-util-types@2.0.2: {} micromark@4.0.2: @@ -16698,10 +26035,16 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.33.0: {} + mime-db@1.52.0: {} mime-db@1.54.0: {} + mime-types@2.1.18: + dependencies: + mime-db: 1.33.0 + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -16710,6 +26053,8 @@ snapshots: dependencies: mime-db: 1.54.0 + mime@1.6.0: {} + mime@4.0.4: {} mimic-fn@2.1.0: {} @@ -16718,14 +26063,28 @@ snapshots: mimic-response@3.1.0: {} + mimic-response@4.0.0: {} + min-document@2.19.0: dependencies: dom-walk: 0.1.2 + mini-css-extract-plugin@2.10.2(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + schema-utils: 4.3.3 + tapable: 2.3.3 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + + minimalistic-assert@1.0.1: {} + minimatch@10.2.5: dependencies: brace-expansion: 5.0.6 + minimatch@3.1.5: + dependencies: + brace-expansion: 5.0.6 + minimatch@5.1.6: dependencies: brace-expansion: 5.0.6 @@ -16751,6 +26110,8 @@ snapshots: mrmime@2.0.0: {} + ms@2.0.0: {} + ms@2.1.3: {} msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3): @@ -16779,6 +26140,11 @@ snapshots: - '@types/node' optional: true + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + mute-stream@2.0.0: {} mute-stream@3.0.0: @@ -16824,15 +26190,17 @@ snapshots: napi-build-utils@1.0.2: {} + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + negotiator@1.0.0: {} neo-async@2.6.2: {} nerf-dart@1.0.0: {} - neverpanic@0.0.7(typescript@5.9.3): - dependencies: - typescript: 5.9.3 + neverpanic@0.0.8: {} next-auth@5.0.0-beta.31(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(react@19.2.7): dependencies: @@ -16846,7 +26214,7 @@ snapshots: dependencies: '@formatjs/intl-localematcher': 0.8.1 '@parcel/watcher': 2.4.1 - '@swc/core': 1.15.3 + '@swc/core': 1.15.3(@swc/helpers@0.5.15) icu-minify: 4.13.0 negotiator: 1.0.0 next: 16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0) @@ -16887,6 +26255,11 @@ snapshots: - '@babel/core' - babel-plugin-macros + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + node-abi@3.67.0: dependencies: semver: 7.7.4 @@ -16910,10 +26283,10 @@ snapshots: node-gyp-build@4.8.4: {} - node-loader@2.1.0(webpack@5.107.1(postcss@8.5.15)): + node-loader@2.1.0(webpack@5.107.1(lightningcss@1.32.0)(postcss@8.5.15)): dependencies: loader-utils: 2.0.4 - webpack: 5.107.1(postcss@8.5.15) + webpack: 5.107.1(lightningcss@1.32.0)(postcss@8.5.15) node-mock-http@1.0.4: {} @@ -16933,6 +26306,8 @@ snapshots: normalize-path@3.0.0: {} + normalize-url@8.1.1: {} + normalize-url@9.0.0: {} npm-run-path@4.0.1: @@ -16950,12 +26325,39 @@ snapshots: npm@11.6.2: {} + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + null-loader@4.0.1(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + oauth4webapi@3.3.0: {} object-assign@4.1.1: {} + object-hash@3.0.0: {} + object-inspect@1.13.4: {} + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + obuf@1.1.2: {} + obug@2.1.1: {} octokit@5.0.5: @@ -16984,6 +26386,8 @@ snapshots: dependencies: ee-first: 1.1.1 + on-headers@1.1.0: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -17000,10 +26404,25 @@ snapshots: dependencies: mimic-fn: 4.0.0 + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + openapi3-ts@4.4.0: dependencies: yaml: 2.9.0 + opener@1.5.2: {} + openid-client@6.3.3: dependencies: jose: 6.0.8 @@ -17060,32 +26479,77 @@ snapshots: '@oxlint/binding-win32-ia32-msvc': 1.67.0 '@oxlint/binding-win32-x64-msvc': 1.67.0 + p-cancelable@3.0.0: {} + p-each-series@3.0.0: {} p-filter@4.1.0: dependencies: p-map: 7.0.3 + p-finally@1.0.0: {} + p-limit@1.3.0: dependencies: p-try: 1.0.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + p-locate@2.0.0: dependencies: p-limit: 1.3.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + p-map@7.0.3: {} + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + p-reduce@2.1.0: {} p-reduce@3.0.0: {} + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.3.2 + retry: 0.13.1 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + p-try@1.0.0: {} package-json-from-dist@1.0.1: {} + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.7.4 + + package-manager-detector@1.6.0: {} + pako@1.0.11: {} + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + parchment@3.0.0: {} parent-module@1.0.1: @@ -17122,10 +26586,21 @@ snapshots: parse-ms@4.0.0: {} + parse-numeric-range@1.3.0: {} + parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + parse5@5.1.1: {} parse5@6.0.1: {} @@ -17140,14 +26615,33 @@ snapshots: parseurl@1.3.3: {} + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-data-parser@0.1.0: {} + path-exists@3.0.0: {} + path-exists@5.0.0: {} + path-expression-matcher@1.5.0: {} + path-is-inside@1.0.2: {} + path-key@3.1.1: {} path-key@4.0.0: {} + path-parse@1.0.7: {} + + path-root-regex@0.1.2: {} + + path-root@0.1.1: + dependencies: + path-root-regex: 0.1.2 + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -17158,6 +26652,14 @@ snapshots: lru-cache: 11.3.5 minipass: 7.1.3 + path-to-regexp@0.1.13: {} + + path-to-regexp@1.9.0: + dependencies: + isarray: 0.0.1 + + path-to-regexp@3.3.0: {} + path-to-regexp@6.3.0: optional: true @@ -17212,6 +26714,8 @@ snapshots: picomatch@4.0.4: {} + pify@2.3.0: {} + pify@3.0.0: {} pino-abstract-transport@3.0.0: @@ -17234,6 +26738,8 @@ snapshots: sonic-boom: 4.2.1 thread-stream: 4.0.0 + pirates@4.0.7: {} + pkce-challenge@5.0.1: {} pkcs7@1.0.4: @@ -17245,6 +26751,19 @@ snapshots: find-up: 2.1.0 load-json-file: 4.0.0 + pkg-dir@7.0.0: + dependencies: + find-up: 6.3.0 + + pkijs@3.4.0: + dependencies: + '@noble/hashes': 1.4.0 + asn1js: 3.0.10 + bytestreamjs: 2.0.1 + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + playwright-core@1.60.0: {} playwright@1.60.0: @@ -17255,11 +26774,240 @@ snapshots: po-parser@2.1.1: {} + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + postcss-attribute-case-insensitive@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-calc@9.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-clamp@4.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-color-functional-notation@7.0.12(postcss@8.5.8): + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + postcss-color-hex-alpha@10.0.0(postcss@8.5.8): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-color-rebeccapurple@10.0.0(postcss@8.5.8): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-colormin@6.1.0(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-convert-values@6.1.0(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-custom-media@11.0.6(postcss@8.5.8): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.8 + + postcss-custom-properties@14.0.6(postcss@8.5.8): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-custom-selectors@8.0.5(postcss@8.5.8): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-dir-pseudo-class@9.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-discard-comments@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-discard-duplicates@6.0.3(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-discard-empty@6.0.3(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-discard-overridden@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-discard-unused@6.0.5(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + + postcss-double-position-gradients@6.0.4(postcss@8.5.8): + dependencies: + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-focus-visible@10.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-focus-within@9.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-font-variant@5.0.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-gap-properties@6.0.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-image-set-function@7.0.0(postcss@8.5.8): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-import@15.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.12 + postcss-js@4.0.1(postcss@8.5.15): dependencies: camelcase-css: 2.0.1 postcss: 8.5.15 + postcss-js@4.0.1(postcss@8.5.8): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.8 + + postcss-lab-function@7.0.12(postcss@8.5.8): + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.9.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.8 + tsx: 4.21.0 + yaml: 2.9.0 + + postcss-loader@7.3.4(postcss@8.5.8)(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + cosmiconfig: 8.3.6(typescript@5.9.3) + jiti: 1.21.7 + postcss: 8.5.8 + semver: 7.7.4 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - typescript + + postcss-logical@8.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-merge-idents@6.0.3(postcss@8.5.8): + dependencies: + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-merge-longhand@6.0.5(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.5.8) + + postcss-merge-rules@6.1.1(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + caniuse-api: 3.0.0 + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@6.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@6.0.3(postcss@8.5.8): + dependencies: + colord: 2.9.3 + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-minify-params@6.1.0(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@6.0.4(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + postcss-mixins@12.0.0(postcss@8.5.15): dependencies: postcss: 8.5.15 @@ -17268,17 +27016,229 @@ snapshots: sugarss: 5.0.0(postcss@8.5.15) tinyglobby: 0.2.15 + postcss-modules-extract-imports@3.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.8): + dependencies: + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.8): + dependencies: + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 + + postcss-nested@6.2.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + postcss-nested@7.0.2(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-selector-parser: 7.1.0 + postcss-nesting@13.0.2(postcss@8.5.8): + dependencies: + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-normalize-charset@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-normalize-display-values@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@6.1.0(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-opacity-percentage@3.0.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-ordered-values@6.0.2(postcss@8.5.8): + dependencies: + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-overflow-shorthand@6.0.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-page-break@3.0.4(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-place@10.0.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-preset-env@10.6.1(postcss@8.5.8): + dependencies: + '@csstools/postcss-alpha-function': 1.0.1(postcss@8.5.8) + '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.5.8) + '@csstools/postcss-color-function': 4.0.12(postcss@8.5.8) + '@csstools/postcss-color-function-display-p3-linear': 1.0.1(postcss@8.5.8) + '@csstools/postcss-color-mix-function': 3.0.12(postcss@8.5.8) + '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.2(postcss@8.5.8) + '@csstools/postcss-content-alt-text': 2.0.8(postcss@8.5.8) + '@csstools/postcss-contrast-color-function': 2.0.12(postcss@8.5.8) + '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.8) + '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.8) + '@csstools/postcss-gamut-mapping': 2.0.11(postcss@8.5.8) + '@csstools/postcss-gradients-interpolation-method': 5.0.12(postcss@8.5.8) + '@csstools/postcss-hwb-function': 4.0.12(postcss@8.5.8) + '@csstools/postcss-ic-unit': 4.0.4(postcss@8.5.8) + '@csstools/postcss-initial': 2.0.1(postcss@8.5.8) + '@csstools/postcss-is-pseudo-class': 5.0.3(postcss@8.5.8) + '@csstools/postcss-light-dark-function': 2.0.11(postcss@8.5.8) + '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.8) + '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.8) + '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.8) + '@csstools/postcss-logical-resize': 3.0.0(postcss@8.5.8) + '@csstools/postcss-logical-viewport-units': 3.0.4(postcss@8.5.8) + '@csstools/postcss-media-minmax': 2.0.9(postcss@8.5.8) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.8) + '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.8) + '@csstools/postcss-normalize-display-values': 4.0.1(postcss@8.5.8) + '@csstools/postcss-oklab-function': 4.0.12(postcss@8.5.8) + '@csstools/postcss-position-area-property': 1.0.0(postcss@8.5.8) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/postcss-property-rule-prelude-list': 1.0.0(postcss@8.5.8) + '@csstools/postcss-random-function': 2.0.1(postcss@8.5.8) + '@csstools/postcss-relative-color-syntax': 3.0.12(postcss@8.5.8) + '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.8) + '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.8) + '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.8) + '@csstools/postcss-syntax-descriptor-syntax-production': 1.0.1(postcss@8.5.8) + '@csstools/postcss-system-ui-font-family': 1.0.0(postcss@8.5.8) + '@csstools/postcss-text-decoration-shorthand': 4.0.3(postcss@8.5.8) + '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.8) + '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.8) + autoprefixer: 10.5.0(postcss@8.5.8) + browserslist: 4.28.2 + css-blank-pseudo: 7.0.1(postcss@8.5.8) + css-has-pseudo: 7.0.3(postcss@8.5.8) + css-prefers-color-scheme: 10.0.0(postcss@8.5.8) + cssdb: 8.9.0 + postcss: 8.5.8 + postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.8) + postcss-clamp: 4.1.0(postcss@8.5.8) + postcss-color-functional-notation: 7.0.12(postcss@8.5.8) + postcss-color-hex-alpha: 10.0.0(postcss@8.5.8) + postcss-color-rebeccapurple: 10.0.0(postcss@8.5.8) + postcss-custom-media: 11.0.6(postcss@8.5.8) + postcss-custom-properties: 14.0.6(postcss@8.5.8) + postcss-custom-selectors: 8.0.5(postcss@8.5.8) + postcss-dir-pseudo-class: 9.0.1(postcss@8.5.8) + postcss-double-position-gradients: 6.0.4(postcss@8.5.8) + postcss-focus-visible: 10.0.1(postcss@8.5.8) + postcss-focus-within: 9.0.1(postcss@8.5.8) + postcss-font-variant: 5.0.0(postcss@8.5.8) + postcss-gap-properties: 6.0.0(postcss@8.5.8) + postcss-image-set-function: 7.0.0(postcss@8.5.8) + postcss-lab-function: 7.0.12(postcss@8.5.8) + postcss-logical: 8.1.0(postcss@8.5.8) + postcss-nesting: 13.0.2(postcss@8.5.8) + postcss-opacity-percentage: 3.0.0(postcss@8.5.8) + postcss-overflow-shorthand: 6.0.0(postcss@8.5.8) + postcss-page-break: 3.0.4(postcss@8.5.8) + postcss-place: 10.0.0(postcss@8.5.8) + postcss-pseudo-class-any-link: 10.0.1(postcss@8.5.8) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.8) + postcss-selector-not: 8.0.1(postcss@8.5.8) + postcss-preset-mantine@1.18.0(postcss@8.5.15): dependencies: postcss: 8.5.15 postcss-mixins: 12.0.0(postcss@8.5.15) postcss-nested: 7.0.2(postcss@8.5.15) + postcss-pseudo-class-any-link@10.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-reduce-idents@6.0.3(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@6.1.0(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + caniuse-api: 3.0.0 + postcss: 8.5.8 + + postcss-reduce-transforms@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-replace-overflow-wrap@4.0.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-selector-not@8.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.0 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 @@ -17288,9 +27248,31 @@ snapshots: dependencies: postcss: 8.5.15 + postcss-sort-media-queries@5.2.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + sort-css-media-queries: 2.2.0 + + postcss-svgo@6.0.3(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + svgo: 3.3.3 + + postcss-unique-selectors@6.0.4(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + + postcss-value-parser@4.2.0: {} + + postcss-zindex@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss@8.4.31: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -17300,6 +27282,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: {} postgres-bytea@1.0.0: {} @@ -17310,6 +27298,8 @@ snapshots: dependencies: xtend: 4.0.2 + posthog-docusaurus@2.0.5: {} + preact-render-to-string@6.5.11(preact@10.24.3): dependencies: preact: 10.24.3 @@ -17333,6 +27323,11 @@ snapshots: transitivePeerDependencies: - bare-buffer + pretty-error@4.0.0: + dependencies: + lodash: 4.18.1 + renderkid: 3.0.0 + pretty-ms@9.2.0: dependencies: parse-ms: 4.0.0 @@ -17341,6 +27336,14 @@ snapshots: dependencies: parse-ms: 4.0.0 + pretty-time@1.1.0: {} + + prism-react-renderer@2.4.1(react@19.2.7): + dependencies: + '@types/prismjs': 1.26.6 + clsx: 2.1.1 + react: 19.2.7 + prismjs@1.30.0: {} process-nextick-args@2.0.1: {} @@ -17351,6 +27354,11 @@ snapshots: process@0.11.10: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -17483,6 +27491,16 @@ snapshots: punycode@2.3.1: {} + pupa@3.3.0: + dependencies: + escape-goat: 4.0.0 + + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.5: {} + qs@6.14.0: dependencies: side-channel: 1.1.0 @@ -17491,8 +27509,12 @@ snapshots: dependencies: side-channel: 1.1.0 + queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} + quill-delta@5.1.0: dependencies: fast-diff: 1.3.0 @@ -17509,7 +27531,7 @@ snapshots: radix-vue@1.9.17(vue@3.5.35(typescript@5.9.3)): dependencies: '@floating-ui/dom': 1.7.6 - '@floating-ui/vue': 1.1.9(vue@3.5.35(typescript@5.9.3)) + '@floating-ui/vue': 1.1.11(vue@3.5.35(typescript@5.9.3)) '@internationalized/date': 3.12.2 '@internationalized/number': 3.6.7 '@tanstack/vue-virtual': 3.13.28(vue@3.5.35(typescript@5.9.3)) @@ -17525,6 +27547,14 @@ snapshots: radix3@1.1.2: {} + random-word-slugs@0.1.7: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.0: {} + range-parser@1.2.1: {} rate-limiter-flexible@8.1.0: {} @@ -17536,6 +27566,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + raw-body@3.0.2: dependencies: bytes: 3.1.2 @@ -17566,8 +27603,14 @@ snapshots: dependencies: react: 19.2.7 + react-fast-compare@3.2.2: {} + react-is@19.2.7: {} + react-json-view-lite@2.5.0(react@19.2.7): + dependencies: + react: 19.2.7 + react-jsx-parser@2.4.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: acorn: 8.16.0 @@ -17578,6 +27621,12 @@ snapshots: '@types/react': 18.3.31 '@types/react-dom': 18.3.7(@types/react@18.3.31) + react-loadable-ssr-addon-v5-slorber@1.0.3(@docusaurus/react-loadable@6.0.0(react@19.2.7))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + '@babel/runtime': 7.29.7 + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.7)' + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + react-markdown@10.1.0(@types/react@19.2.16)(react@19.2.7): dependencies: '@types/hast': 3.0.4 @@ -17639,6 +27688,36 @@ snapshots: optionalDependencies: '@types/react': 19.2.16 + react-router-config@5.1.1(react-router@5.3.4(react@19.2.7))(react@19.2.7): + dependencies: + '@babel/runtime': 7.29.7 + react: 19.2.7 + react-router: 5.3.4(react@19.2.7) + + react-router-dom@5.3.4(react@19.2.7): + dependencies: + '@babel/runtime': 7.29.7 + history: 4.10.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.2.7 + react-router: 5.3.4(react@19.2.7) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + react-router@5.3.4(react@19.2.7): + dependencies: + '@babel/runtime': 7.29.7 + history: 4.10.1 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + path-to-regexp: 1.9.0 + prop-types: 15.8.1 + react: 19.2.7 + react-is: 19.2.7 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + react-simple-code-editor@0.14.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: react: 19.2.7 @@ -17661,8 +27740,17 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) + react-virtualized-auto-sizer@1.0.26(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react@19.2.7: {} + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + read-package-up@11.0.0: dependencies: find-up-simple: 1.0.1 @@ -17719,6 +27807,10 @@ snapshots: dependencies: minimatch: 5.1.6 + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + readdirp@5.0.0: {} real-require@0.2.0: {} @@ -17743,6 +27835,35 @@ snapshots: - '@types/react' - redux + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -17764,10 +27885,37 @@ snapshots: redux@5.0.1: {} + reflect-metadata@0.2.2: {} + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + registry-auth-token@5.0.2: dependencies: '@pnpm/npm-conf': 2.3.1 + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + regjsgen@0.8.0: {} + + regjsparser@0.13.1: + dependencies: + jsesc: 3.1.0 + rehype-external-links@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -17782,6 +27930,11 @@ snapshots: '@types/hast': 3.0.4 hast-util-format: 1.1.0 + rehype-minify-whitespace@6.0.2: + dependencies: + '@types/hast': 3.0.4 + hast-util-minify-whitespace: 1.0.1 + rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -17794,6 +27947,22 @@ snapshots: hast-util-raw: 9.1.0 vfile: 6.0.3 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-remark@10.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + hast-util-to-mdast: 10.1.2 + unified: 11.0.5 + vfile: 6.0.3 + rehype-sanitize@6.0.0: dependencies: '@types/hast': 3.0.4 @@ -17805,6 +27974,34 @@ snapshots: hast-util-to-html: 9.0.5 unified: 11.0.5 + relateurl@0.2.7: {} + + remark-directive@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-emoji@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + emoticon: 4.1.0 + mdast-util-find-and-replace: 3.0.2 + node-emoji: 2.2.0 + unified: 11.0.5 + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -17816,6 +28013,13 @@ snapshots: transitivePeerDependencies: - supports-color + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -17851,24 +28055,57 @@ snapshots: rename-keys@1.2.0: {} + renderkid@3.0.0: + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.18.1 + strip-ansi: 6.0.1 + require-directory@2.1.1: {} require-from-string@2.0.2: {} + require-like@0.1.2: {} + + requires-port@1.0.0: {} + reselect@5.1.1: {} reserved-identifiers@1.2.0: {} + resolve-alpn@1.2.1: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} + resolve-package-path@4.0.3: + dependencies: + path-root: 0.1.1 + + resolve-pathname@3.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + ret@0.5.0: {} retry@0.12.0: {} + retry@0.13.1: {} + rettime@0.11.11: optional: true @@ -17878,6 +28115,8 @@ snapshots: rfdc@1.4.1: {} + robust-predicates@3.0.3: {} + rollup@4.60.0: dependencies: '@types/estree': 1.0.8 @@ -17913,6 +28152,13 @@ snapshots: rou3@0.7.12: {} + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + router@2.2.0: dependencies: debug: 4.4.3 @@ -17923,6 +28169,21 @@ snapshots: transitivePeerDependencies: - supports-color + rtlcss@4.3.0: + dependencies: + escalade: 3.2.0 + picocolors: 1.1.1 + postcss: 8.5.8 + strip-json-comments: 3.1.1 + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -17949,12 +28210,22 @@ snapshots: sax@1.4.1: {} + sax@1.6.0: {} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 scheduler@0.27.0: {} + schema-dts@1.1.5: {} + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.15.0 + ajv-keywords: 3.5.2(ajv@6.15.0) + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 @@ -17962,8 +28233,22 @@ snapshots: ajv-formats: 2.1.1(ajv@8.18.0) ajv-keywords: 5.1.0(ajv@8.18.0) + search-insights@2.17.3: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + secure-json-parse@4.1.0: {} + select-hose@2.0.0: {} + + selfsigned@5.5.0: + dependencies: + '@peculiar/x509': 1.14.3 + pkijs: 3.4.0 + semantic-release@25.0.3(typescript@5.9.3): dependencies: '@semantic-release/commit-analyzer': 13.0.1(semantic-release@25.0.3(typescript@5.9.3)) @@ -17998,6 +28283,10 @@ snapshots: - supports-color - typescript + semver-diff@4.0.0: + dependencies: + semver: 7.7.4 + semver-parser@4.2.1: {} semver-regex@4.0.5: {} @@ -18006,6 +28295,24 @@ snapshots: semver@7.7.4: {} + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + send@1.2.1: dependencies: debug: 4.4.3 @@ -18022,6 +28329,41 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-handler@6.1.7: + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + mime-types: 2.1.18 + minimatch: 3.1.5 + path-is-inside: 1.0.2 + path-to-regexp: 3.3.0 + range-parser: 1.2.0 + + serve-index@1.9.2: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.8.1 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + serve-static@2.2.1: dependencies: encodeurl: 2.0.0 @@ -18035,10 +28377,25 @@ snapshots: set-cookie-parser@3.1.0: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} setprototypeof@1.2.0: {} + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shallowequal@1.1.0: {} + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -18079,6 +28436,8 @@ snapshots: shell-quote@1.8.3: {} + shell-quote@1.8.4: {} + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -18127,18 +28486,48 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.25 mrmime: 2.0.0 totalist: 3.0.1 + sisteransi@1.0.5: {} + + sitemap@7.1.3: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 + slash@3.0.0: {} + + slash@4.0.0: {} + smart-buffer@4.2.0: {} + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.5 + socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 @@ -18156,6 +28545,8 @@ snapshots: dependencies: atomic-sleep: 1.0.0 + sort-css-media-queries@2.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -18165,6 +28556,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.6: {} + space-separated-tokens@2.0.2: {} spawn-error-forwarder@1.0.0: {} @@ -18183,6 +28576,27 @@ snapshots: spdx-license-ids@3.0.20: {} + spdy-transport@3.0.0: + dependencies: + debug: 4.4.3 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.3 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + split-ca@1.0.1: {} split2@1.0.0: @@ -18191,12 +28605,16 @@ snapshots: split2@4.2.0: {} + sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} sql-escaper@1.3.3: {} sql.js@1.14.1: {} + srcset@4.0.0: {} + ssh-remote-port-forward@1.0.4: dependencies: '@types/ssh2': 0.5.52 @@ -18216,10 +28634,14 @@ snapshots: standard-as-callback@2.1.0: {} + statuses@1.5.0: {} + statuses@2.0.1: {} statuses@2.0.2: {} + std-env@3.10.0: {} + std-env@4.0.0: {} stream-buffers@3.0.3: {} @@ -18276,6 +28698,12 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + stringify-object@6.0.0: dependencies: get-own-enumerable-keys: 1.0.0 @@ -18291,6 +28719,8 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} strip-final-newline@2.0.0: {} @@ -18301,6 +28731,8 @@ snapshots: strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} + strnum@2.3.0: {} style-mod@4.1.3: {} @@ -18320,6 +28752,24 @@ snapshots: optionalDependencies: '@babel/core': 7.29.0 + stylehacks@6.1.1(postcss@8.5.8): + dependencies: + browserslist: 4.28.2 + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + + stylis@4.4.0: {} + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + sugarss@5.0.0(postcss@8.5.15): dependencies: postcss: 8.5.15 @@ -18350,11 +28800,33 @@ snapshots: has-flag: 4.0.0 supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} + + svg-parser@2.0.4: {} + + svgo@3.3.3: + dependencies: + commander: 7.2.0 + css-select: 5.2.2 + css-tree: 2.3.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + svgson@5.3.1: dependencies: deep-rename-keys: 0.2.1 xml-reader: 2.4.3 + swc-loader@0.2.7(@swc/core@1.15.3(@swc/helpers@0.5.15))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.15) + '@swc/counter': 0.1.3 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + + swiper@12.2.0: {} + swrv@1.2.0(vue@3.5.35(typescript@5.9.3)): dependencies: vue: 3.5.35(typescript@5.9.3) @@ -18369,7 +28841,33 @@ snapshots: tailwind-merge@3.5.0: {} - tailwindcss@4.3.0: {} + tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.9.0): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.8 + postcss-import: 15.1.0(postcss@8.5.8) + postcss-js: 4.0.1(postcss@8.5.8) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.9.0) + postcss-nested: 6.2.0(postcss@8.5.8) + postcss-selector-parser: 6.1.2 + resolve: 1.22.12 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml tapable@2.3.3: {} @@ -18413,14 +28911,43 @@ snapshots: type-fest: 2.19.0 unique-string: 3.0.0 - terser-webpack-plugin@5.6.0(postcss@8.5.15)(webpack@5.107.1(postcss@8.5.15)): + terser-webpack-plugin@5.6.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(@swc/html@1.15.40)(lightningcss@1.32.0)(postcss@8.5.8)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.1 - webpack: 5.107.1(postcss@8.5.15) + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) optionalDependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.15) + '@swc/html': 1.15.40 + lightningcss: 1.32.0 + postcss: 8.5.8 + + terser-webpack-plugin@5.6.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.46.1 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + optionalDependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.15) + clean-css: 5.3.3 + cssnano: 6.1.2(postcss@8.5.8) + html-minifier-terser: 7.2.0 + lightningcss: 1.32.0 + postcss: 8.5.8 + + terser-webpack-plugin@5.6.0(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.1(lightningcss@1.32.0)(postcss@8.5.15)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.46.1 + webpack: 5.107.1(lightningcss@1.32.0)(postcss@8.5.15) + optionalDependencies: + lightningcss: 1.32.0 postcss: 8.5.15 terser@5.46.1: @@ -18446,7 +28973,7 @@ snapshots: ssh-remote-port-forward: 1.0.4 tar-fs: 3.1.2 tmp: 0.2.7 - undici: 7.27.1 + undici: 7.25.0 transitivePeerDependencies: - bare-buffer - supports-color @@ -18465,6 +28992,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thingies@2.6.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + thread-stream@4.0.0: dependencies: real-require: 0.2.0 @@ -18474,6 +29005,8 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 + thunky@1.1.0: {} + time-span@5.1.0: dependencies: convert-hrtime: 5.0.0 @@ -18482,6 +29015,8 @@ snapshots: tiny-invariant@1.3.3: {} + tiny-warning@1.0.3: {} + tinybench@2.9.0: {} tinyexec@1.0.2: {} @@ -18491,6 +29026,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinypool@1.1.1: {} + tinypool@2.1.0: {} tinyrainbow@3.1.0: {} @@ -18535,19 +29072,25 @@ snapshots: traverse@0.6.8: {} + tree-dump@1.1.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + tree-kill@1.2.2: {} trim-lines@3.0.1: {} + trim-trailing-lines@2.1.0: {} + triple-beam@1.4.1: {} trough@2.2.0: {} - trpc-to-mcp@1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3): + trpc-to-mcp@1.3.2(@trpc/server@11.17.0(typescript@5.9.3))(better-auth@1.6.15(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)))(mcp-handler@1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)))(zod@4.4.3): dependencies: '@modelcontextprotocol/sdk': 1.26.0(zod@4.4.3) '@trpc/server': 11.17.0(typescript@5.9.3) - better-auth: 1.6.14(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)) + better-auth: 1.6.15(@opentelemetry/api@1.9.0)(better-sqlite3@12.10.0)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@libsql/client-wasm@0.14.0)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.10.0)(gel@2.0.0)(kysely@0.29.2)(mysql2@3.22.4(@types/node@24.13.1))(pg@8.21.0)(sql.js@1.14.1))(mysql2@3.22.4(@types/node@24.13.1))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0))(pg@8.21.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vitest@4.1.8)(vue@3.5.35(typescript@5.9.3)) mcp-handler: 1.1.0(@modelcontextprotocol/sdk@1.26.0(zod@4.4.3))(next@16.2.7(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.60.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(sass@1.100.0)) zod: 4.4.3 transitivePeerDependencies: @@ -18571,6 +29114,10 @@ snapshots: string-byte-length: 3.0.1 string-byte-slice: 3.0.1 + ts-dedent@2.2.0: {} + + ts-interface-checker@0.1.13: {} + tsconfck@3.1.3(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -18583,6 +29130,8 @@ snapshots: transitivePeerDependencies: - supports-color + tslib@1.14.1: {} + tslib@2.8.1: {} tsscmp@1.0.6: {} @@ -18601,6 +29150,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsyringe@4.10.0: + dependencies: + tslib: 1.14.1 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -18639,6 +29192,10 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + typescript@5.9.3: {} ufo@1.6.4: {} @@ -18658,6 +29215,8 @@ snapshots: undici@6.23.0: {} + undici@7.25.0: {} + undici@7.27.1: {} undici@8.4.0: {} @@ -18666,8 +29225,19 @@ snapshots: dependencies: hookable: 6.1.1 + unicode-canonical-property-names-ecmascript@2.0.1: {} + unicode-emoji-modifier-base@1.0.0: {} + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + unicorn-magic@0.1.0: {} unicorn-magic@0.3.0: {} @@ -18691,10 +29261,16 @@ snapshots: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-is@4.1.0: {} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -18703,11 +29279,22 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 4.1.0 + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-visit@2.0.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -18737,8 +29324,38 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-notifier@6.0.2: + dependencies: + boxen: 7.1.1 + chalk: 5.4.1 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.1.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.3.0 + semver: 7.7.4 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + url-join@5.0.0: {} + url-loader@4.1.1(file-loader@6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + optionalDependencies: + file-loader: 6.2.0(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + url-toolkit@2.2.5: {} use-callback-ref@1.3.3(@types/react@19.2.16)(react@19.2.7): @@ -18748,6 +29365,10 @@ snapshots: optionalDependencies: '@types/react': 19.2.16 + use-debounce@10.1.1(react@19.2.7): + dependencies: + react: 19.2.7 + use-deep-compare-effect@1.8.1(react@19.2.7): dependencies: '@babel/runtime': 7.29.7 @@ -18780,11 +29401,28 @@ snapshots: util-deprecate@1.0.2: {} + utila@0.4.0: {} + + utility-types@3.11.0: {} + + utils-merge@1.0.1: {} + + uuid@14.0.0: {} + + uuid@8.3.2: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + validate-peer-dependencies@2.2.0: + dependencies: + resolve-package-path: 4.0.3 + semver: 7.7.4 + + value-equal@1.0.1: {} + vary@1.1.2: {} vfile-location@5.0.3: @@ -18845,17 +29483,17 @@ snapshots: dependencies: global: 4.4.0 - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.3(typescript@5.9.3) - vite: 7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): + vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -18867,16 +29505,17 @@ snapshots: '@types/node': 24.13.1 fsevents: 2.3.3 jiti: 1.21.7 + lightningcss: 1.32.0 sass: 1.100.0 sugarss: 5.0.0(postcss@8.5.15) terser: 5.46.1 tsx: 4.21.0 yaml: 2.9.0 - vitest@4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): + vitest@4.1.8(@opentelemetry/api@1.9.0)(@types/node@24.13.1)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.8(msw@2.14.6(@types/node@24.13.1)(typescript@5.9.3))(vite@7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.8 '@vitest/runner': 4.1.8 '@vitest/snapshot': 4.1.8 @@ -18893,7 +29532,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.1.12(@types/node@24.13.1)(jiti@1.21.7)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vite: 7.1.12(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.100.0)(sugarss@5.0.0(postcss@8.5.15))(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -18904,7 +29543,7 @@ snapshots: transitivePeerDependencies: - msw - vue-component-type-helpers@3.3.3: {} + vue-component-type-helpers@3.3.4: {} vue-demi@0.14.10(vue@3.5.35(typescript@5.9.3)): dependencies: @@ -18933,15 +29572,101 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + web-namespaces@2.0.1: {} webidl-conversions@3.0.1: {} webidl-conversions@8.0.1: {} + webpack-bundle-analyzer@4.10.2: + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.16.0 + acorn-walk: 8.3.5 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + html-escaper: 2.0.2 + opener: 1.5.2 + picocolors: 1.1.1 + sirv: 2.0.4 + ws: 7.5.11 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + colorette: 2.0.20 + memfs: 4.57.6(tslib@2.8.1) + mime-types: 3.0.2 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.3 + optionalDependencies: + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - tslib + + webpack-dev-server@5.2.4(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.5 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.4.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.1 + connect-history-api-fallback: 2.0.0 + express: 4.22.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.3.0 + launch-editor: 2.14.1 + open: 10.2.0 + p-retry: 6.2.1 + schema-utils: 4.3.3 + selfsigned: 5.5.0 + serve-index: 1.9.2 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + ws: 8.21.0 + optionalDependencies: + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - tslib + - utf-8-validate + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-merge@6.0.1: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + webpack-sources@3.5.0: {} - webpack@5.107.1(postcss@8.5.15): + webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(@swc/html@1.15.40)(lightningcss@1.32.0)(postcss@8.5.8): dependencies: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 @@ -18963,7 +29688,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(postcss@8.5.15)(webpack@5.107.1(postcss@8.5.15)) + terser-webpack-plugin: 5.6.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(@swc/html@1.15.40)(lightningcss@1.32.0)(postcss@8.5.8)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) watchpack: 2.5.1 webpack-sources: 3.5.0 transitivePeerDependencies: @@ -18980,6 +29705,108 @@ snapshots: - postcss - uglify-js + webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8): + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.22.0 + es-module-lexer: 2.1.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + loader-runner: 4.3.2 + mime-db: 1.54.0 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8)(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)) + watchpack: 2.5.1 + webpack-sources: 3.5.0 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + + webpack@5.107.1(lightningcss@1.32.0)(postcss@8.5.15): + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.22.0 + es-module-lexer: 2.1.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + loader-runner: 4.3.2 + mime-db: 1.54.0 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.0(lightningcss@1.32.0)(postcss@8.5.15)(webpack@5.107.1(lightningcss@1.32.0)(postcss@8.5.15)) + watchpack: 2.5.1 + webpack-sources: 3.5.0 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + + webpackbar@7.0.0(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(lightningcss@1.32.0)(postcss@8.5.8)): + dependencies: + ansis: 3.17.0 + consola: 3.4.2 + pretty-time: 1.1.0 + std-env: 3.10.0 + optionalDependencies: + '@rspack/core': 1.7.11(@swc/helpers@0.5.15) + webpack: 5.107.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.8))(html-minifier-terser@7.2.0)(lightningcss@1.32.0)(postcss@8.5.8) + + websocket-driver@0.7.5: + dependencies: + http-parser-js: 0.5.10 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + whatwg-mimetype@5.0.0: {} whatwg-url@16.0.1(@noble/hashes@2.0.1): @@ -19009,6 +29836,12 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + + wildcard@2.0.1: {} + winston-transport@4.9.0: dependencies: logform: 2.7.0 @@ -19057,12 +29890,27 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + ws@7.5.11: {} + ws@8.20.1: {} ws@8.21.0: {} + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + xcase@2.0.1: {} + xdg-basedir@5.1.0: {} + xml-js@1.6.11: dependencies: sax: 1.4.1 @@ -19134,6 +29982,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 + yocto-queue@1.2.2: {} + yoctocolors-cjs@2.1.3: {} yoctocolors@2.1.1: {} diff --git a/turbo.json b/turbo.json index 3b04a28f7..6e583ba03 100644 --- a/turbo.json +++ b/turbo.json @@ -13,8 +13,30 @@ }, "build": { "dependsOn": ["^build"], - "inputs": ["$TURBO_DEFAULT$", "!**/*.test.ts", "!**/*.test.tsx", "!**/*.spec.ts", "!**/__tests__/**"], - "outputs": [".next/**", "!.next/cache/**", "next-env.d.ts", ".output/**", ".vercel/output/**"] + "inputs": [ + "$TURBO_DEFAULT$", + "!**/*.test.ts", + "!**/*.test.tsx", + "!**/*.spec.ts", + "!**/__tests__/**", + "!**/*.md", + "!**/*.mdx", + "!**/README*", + "!**/CHANGELOG*", + "!**/LICENSE*", + "!**/*.stories.{ts,tsx}" + ], + "outputs": [".next/**", "!.next/cache/**", "next-env.d.ts", ".output/**", ".vercel/output/**", "build/**"] + }, + "@homarr/cli#build": { + "outputs": ["cli.cjs"] + }, + "@homarr/db#build": { + "outputs": ["migrations/sqlite/migrate.cjs", "migrations/mysql/migrate.cjs", "migrations/postgresql/migrate.cjs"] + }, + "@homarr/docs#build": { + "inputs": ["$TURBO_DEFAULT$", "../../packages/definitions/src/docs/**"], + "outputs": ["build/**", ".docusaurus/**"] }, "dev": { "persistent": true,