diff --git a/.github/workflows/deploy-storybook.yml b/.github/workflows/deploy-storybook.yml new file mode 100644 index 0000000000..3aceb2a983 --- /dev/null +++ b/.github/workflows/deploy-storybook.yml @@ -0,0 +1,126 @@ +name: "Deploy Storybook" + +# Builds the Storybook integration-test package and publishes the static +# Storybook to GitHub Pages. The deployed Storybook is the same runtime the +# Playwright integration tests execute against (see tests/storybook and +# tests/playwright). +# +# To coexist with the existing GitHub Pages content (most notably the API +# documentation served from the Pages root), the Storybook is published into a +# dedicated `storybook/` subfolder of the `gh-pages` branch. Publishing uses +# `keep_files: true`, so sibling content (e.g. `docs/api/`) is left untouched. +# Resulting URL: https://coremedia.github.io/ckeditor-plugins/storybook/ + +on: + # Publish on every push to the main branch. + push: + branches: + - main + # Allow manual deployment from the Actions tab. + workflow_dispatch: + +run-name: | + ${{ github.workflow }}: ${{ github.ref_name }} + +env: + # https://github.com/actions/runner-images/issues/70 + NODE_OPTIONS: "--max_old_space_size=4096" + +# Least-privilege defaults; the publish job opts into the permissions it needs. +permissions: {} + +# Allow only one concurrent deployment, without cancelling in-progress runs, so +# an in-flight Pages deployment is allowed to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + get-env: + name: "Get Environment" + uses: "./.github/workflows/env.yml" + get-engines: + name: "Get Engines" + uses: "./.github/workflows/get-engines.yml" + secrets: inherit + deploy: + name: "Build and Publish Storybook" + runs-on: ubuntu-latest + timeout-minutes: 20 + needs: + - get-env + - get-engines + # Required to push the built Storybook to the `gh-pages` branch. + permissions: + contents: write + env: + nodeVersion: ${{ needs.get-engines.outputs.nodeVersion }} + pnpmVersion: ${{ needs.get-engines.outputs.pnpmVersion }} + npmHost: ${{ needs.get-env.outputs.npm-host }} + npmUrl: ${{ needs.get-env.outputs.npm-url }} + steps: + - id: checkout + name: Checkout + uses: actions/checkout@v5 + - id: authorize + name: "NPM Authorization" + run: | + result=$(curl -s -H "Accept: application/json" -H "Content-Type:application/json" -X PUT --data '{"name": "${{ secrets.PLUGINS_NEXUS_USER }}", "password": "${{ secrets.PLUGINS_NEXUS_PASSWORD }}"}' "${{ env.npmUrl }}/-/user/org.couchdb.user:${{ secrets.PLUGINS_NEXUS_USER }}" | jq --raw-output .token) + # Ensure, the token is not exposed in output. + echo "::add-mask::${result}" + echo "NODE_AUTH_TOKEN=${result}" >> $GITHUB_ENV + - id: initNpmConfiguration + name: "Initialize NPM Configuration" + run: | + npmHost="${{ env.npmHost }}" + npmUrl="${{ env.npmUrl }}" + npmAuthToken="${{ env.NODE_AUTH_TOKEN }}" + + echo "//${npmHost}/:_authToken=${npmAuthToken}" >> .npmrc + echo "@coremedia:registry=${npmUrl}" >> .npmrc + echo "@coremedia-internal:registry=${npmUrl}" >> .npmrc + # We must not commit this change. + git update-index --assume-unchanged .npmrc + - id: installPnpm + name: "Install: Use PNPM ${{ env.pnpmVersion }}" + uses: pnpm/action-setup@v5 + with: + version: ${{ env.pnpmVersion }} + run_install: false + - id: installNodeJs + name: "Install: Use Node.js ${{ env.nodeVersion }}" + uses: actions/setup-node@v5 + with: + node-version: ${{ env.nodeVersion }} + cache: "pnpm" + - id: install + name: Install + run: | + pnpm install --frozen-lockfile + - name: Create env file + run: | + touch .env + echo CKEDITOR_LICENSE_KEY=${{ secrets.CKEDITOR_LICENSE }}>> .env + - id: build + name: "Build Workspace" + run: | + pnpm -r build + - id: buildStorybook + name: "Build Storybook" + env: + CKEDITOR_LICENSE_KEY: ${{ secrets.CKEDITOR_LICENSE }} + run: | + pnpm --filter "@coremedia/ckeditor5-storybook-itest" run build-storybook + - id: publish + name: "Publish Storybook to GitHub Pages" + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: tests/storybook/build/storybook + # Publish into a subfolder so the existing Pages content (e.g. the API + # docs at the Pages root) is preserved. + destination_dir: storybook + keep_files: true + user_name: "github-actions[bot]" + user_email: "github-actions[bot]@users.noreply.github.com" + commit_message: "docs(storybook): deploy ${{ github.sha }}" diff --git a/GOALS.md b/GOALS.md new file mode 100644 index 0000000000..57ef34ab78 --- /dev/null +++ b/GOALS.md @@ -0,0 +1,36 @@ +# Goals + +## Objective + +Create a new Storybook package and use it as the runtime target for Playwright tests. + +## Current State + +- Playwright tests are located in `tests/playwright`. +- Playwright currently runs against the app in `app`. +- The Playwright app contains wrappers used to set up test scenarios, including locator-based wrappers and JS-handle wrappers. +- JS-handle wrappers currently include type workarounds for missing importable Playwright internals (for example `PageFunctionOn`). + +## Target State + +- Introduce a dedicated Storybook package for UI test scenarios. +- Configure Playwright tests in `tests/playwright` to run against Storybook instead of the `app` target. +- Provide a dedicated Storybook story for each Playwright test case. +- Move JS-wrapper functionality from Playwright test code into the Storybook package as reusable story setup utilities. +- Remove `JSWrapper`-based and other JS-handle wrappers; keep locator-based wrappers where they provide value. +- Eliminate JS-wrapper-specific type workarounds (for example local replacements for `PageFunctionOn`). +- Deploy the Storybook package to GitHub Pages. +- Update `README.md` at the end to document the final Storybook package and Playwright integration workflow. + +## Success Criteria + +- A Storybook package exists and can be started in a stable way for tests. +- Playwright uses the Storybook URL/runtime as its test target. +- Existing Playwright test location (`tests/playwright`) remains unchanged. +- Each Playwright test has a dedicated corresponding Storybook story. +- Story setup for tests is driven by Storybook-side utilities migrated from wrapper functionality. +- Test scenario setup behavior remains intact after removing JS-handle wrappers. +- Locator-based wrappers continue to be supported where appropriate. +- No custom type shims remain that only exist to support `JSWrapper` internals. +- Storybook is deployed and reachable via GitHub Pages. +- `README.md` is updated at the end with the finalized Storybook/test setup documentation. diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md new file mode 100644 index 0000000000..3b71953da1 --- /dev/null +++ b/IMPLEMENTATION_PLAN.md @@ -0,0 +1,93 @@ +# Storybook + Playwright Implementation Plan + +This plan describes how to implement the goals defined in `GOALS.md` step by step. + +## 1. Create Storybook package skeleton + +- [x] Add a new workspace package for Storybook in `tests/storybook`. +- [x] Register `tests/storybook` in `pnpm-workspace.yaml`. +- [x] Add all new Storybook dependencies via pnpm in the `tests/storybook` package and ensure workspace wiring is updated accordingly. +- [x] Configure Storybook build and dev scripts. +- [x] Ensure the package can run locally and build in CI. + +## 2. Define Storybook test runtime contract + +- [x] Define a stable story URL strategy that Playwright can target. +- [x] Define story args/parameters for scenario setup input. +- [x] Provide a shared helper module in Storybook for scenario initialization. + +## 3. Migrate JS-wrapper functionality into Storybook utilities + +- [x] Inventory all `JSWrapper`-based wrappers used by Playwright tests. +- [x] Move the setup logic into Storybook-side utilities (no Playwright JSHandle wrappers). +- [x] Replace `JSWrapper`-specific type shims/workarounds (including `PageFunctionOn`-style local types) with Storybook-side implementation. + +## 4. Keep and align locator-based access patterns + +- [x] Keep locator-based wrappers/helpers where they add clarity and value. +- [x] Align locator APIs with Storybook story structure and stable selectors. + +## 5. Migrate Playwright tests one by one + +- [x] Create a migration checklist of all test files in `tests/playwright/test`. +- [x] Build real editor factories (richtext + bbcode) in the Storybook package, ported from `app/src/editors`. +- [x] Pick one test file, create/migrate the corresponding Storybook story setup, and switch only that test to Storybook runtime. +- [x] Validate that migrated test file passes before starting the next file. +- [x] Repeat until every Playwright test file is migrated. +- [x] Track completion per test file by checking off each migrated item. + +### Per-test migration checklist + +- [x] `HelloEditor.test.ts` (richtext base scenario) +- [x] `Application.test.ts` +- [x] `BBCode.test.ts` (bbcode base scenario) +- [x] `ContentLink.test.ts` +- [x] `LinkBalloon.test.ts` +- [x] `LinkUserInteraction.test.ts` +- [x] `Blocklist.test.ts` +- [x] `BlocklistCollapsed.test.ts` +- [x] `BlocklistExpandedToolbar.test.ts` +- [x] `BlocklistExpandedKeyboard.test.ts` +- [x] `Differencing.test.ts` +- [x] `DocumentLists.test.ts` +- [x] `DragDrop.test.ts` +- [x] `FontMapper.test.ts` +- [x] `Images.test.ts` +- [x] `PasteButton.test.ts` + +## 6. Create and refine stories for migrated scenarios + +- [x] Ensure each migrated test has a dedicated story/scenario entry in Storybook. +- [x] Wire each migrated story to the Storybook setup utilities. +- [x] Ensure scenario behavior matches current tests. + +## 7. Switch Playwright runtime target to Storybook + +- [x] Update Playwright environment/config to point to Storybook URL instead of `app`. +- [x] Update web server startup command in Playwright config to run Storybook. +- [x] Keep test location under `tests/playwright` unchanged. + +## 8. Remove obsolete JS-handle wrappers + +- [x] Remove `tests/playwright/test/wrappers/JSWrapper.ts`. +- [x] Remove wrappers that only exist for JS-handle access. +- [x] Keep locator-based wrappers that remain useful. +- [x] Clean imports/usages and delete dead code. + +## 9. Add GitHub Pages deployment for Storybook + +- [x] Add/adjust CI workflow to build and publish Storybook to GitHub Pages. +- [x] Ensure deployment uses the correct base path for this repository. +- [x] Verify deployed Storybook is reachable. + +## 10. Hardening and parity checks + +- [x] Run lint/build/tests for affected packages. +- [x] Fix regressions in story setup and Playwright execution. +- [x] Confirm all success criteria from `GOALS.md` are met. + +## 11. Final documentation update + +- [x] Update `README_STORYBOOK` at the end with finalized Storybook package usage. +- [x] Document how Playwright targets Storybook and how stories map to tests. +- [x] Document GitHub Pages URL/deployment behavior. diff --git a/README.md b/README.md index 73e0aca2a5..eefa9ab082 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,8 @@ implements the described behavior. ## See Also * **[GitHub Pages][gp:ckeditor-plugins]:** These pages on GitHub Pages. +* **[Storybook][gp:storybook]:** Interactive Storybook of the integration-test + scenarios on GitHub Pages (see [`tests/storybook`](./tests/storybook/README.md)). * **[Walk-Through Examples](./examples/README.md):** Some step-by-step guides for customizing CKEditor 5. * **[Development](./DEVELOPMENT.md):** Hints for developing within this @@ -250,3 +252,5 @@ implements the described behavior. [CoreMedia CMS]: "Best-of-Breed Digital Experience Platform CoreMedia" [gp:ckeditor-plugins]: "CoreMedia CKEditor 5 Plugins – GitHub Pages" + +[gp:storybook]: "CoreMedia CKEditor 5 Plugins – Storybook" diff --git a/TESTS_REFACTORING.md b/TESTS_REFACTORING.md new file mode 100644 index 0000000000..65966042be --- /dev/null +++ b/TESTS_REFACTORING.md @@ -0,0 +1,251 @@ +# Tests Refactoring: Fully Prepared Stories Instead of `page.evaluate` + +## Objective + +The Playwright integration tests in `tests/playwright` already run against the +Storybook package (`tests/storybook`). However, they still drive the editor and +set up scenarios at runtime through an in-page test API +(`window.coremediaEditorTestApi`) called via `page.evaluate` (wrapped by +`tests/playwright/test/storybook/testApi.ts`). + +**Goal:** eliminate `page.evaluate` from the tests. Each test should open a +story that is **completely prepared** for it — all data, mock contents, +read-only state, blocked words and drag sources baked into the story — and then +interact with and assert against the editor purely through **Playwright +locators**. Any value a test currently reads back through `page.evaluate` should +instead be exposed by the story as an **observable DOM output** that Playwright +reads with a locator. + +This document is the plan. No test or story code is changed yet. + +## Background: Current State + +- One story per test file (`Tests/` → `tests---default`), usually an + **empty** editor. The test arranges everything afterwards via the API. +- Scenario setup already has a declarative contract: `ScenarioArgs` in + `tests/storybook/src/runtime/scenario.ts` (`data`, `mockContents`, + `mockExternalContents`, `readOnly`, `dataType`, `uiLanguage`) applied by + `applyScenario.ts`. Stories *can* be prepared declaratively today — most tests + simply don't use it yet and call the API at runtime instead. +- The in-page API and its Playwright mirror expose both **setup** and + **read/act** operations (see categorization below). + +### Current `page.evaluate` usage per test + +Counts are call sites of the `testApi` helpers (each is a `page.evaluate`). + +| Test | API calls used | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `Application.test.ts` | _(none — already prepared)_ | +| `BBCode.test.ts` | `setEditorData` ×2 | +| `Blocklist.test.ts` | `setEditorData` ×2 | +| `BlocklistCollapsed.test.ts` | `setEditorData` ×2, `addBlockedWord` ×2 | +| `BlocklistExpandedKeyboard.test.ts` | `setEditorData` ×2, `addBlockedWord` ×3 | +| `BlocklistExpandedToolbar.test.ts` | `setEditorData` ×2, `addBlockedWord` ×3 | +| `ContentLink.test.ts` | `setEditorData` ×5, `addMockContents` ×6 | +| `Differencing.test.ts` | `setEditorDataAndGetDataView` ×6, `setEditorData` ×2, `addMockContents` ×2 | +| `DocumentLists.test.ts` | `setEditorDataAndGetDataView` ×11 | +| `DragDrop.test.ts` | `setEditorData` ×2, `getEditorData` ×2, `addMockContents` ×3, `addMockExternalContents` ×2, `addInputExampleElement` ×3, `validateIsDroppableState` ×2, `validateIsDroppableInLinkBalloon` ×2 | +| `FontMapper.test.ts` | `getEditorData` ×2, `focusEditor` ×3 | +| `HelloEditor.test.ts` | `setEditorData` ×4, `getEditorData` ×2, `addMockContents` ×2 | +| `Images.test.ts` | `setEditorDataAndGetDataView` ×8, `addMockContents` ×7, `getLastOpenedEntities` ×2 | +| `LinkBalloon.test.ts` | `setEditorData` ×4, `addMockContents` ×4 | +| `LinkUserInteraction.test.ts` | `setEditorData` ×9, `addMockContents` ×5, `setReadOnly` ×5, `getLastOpenedEntities` ×5 | +| `PasteButton.test.ts` | `setEditorData` ×2, `getEditorData` ×2, `addMockContents` ×2, `addInputExampleElement` ×2 | + +## Categorizing the API Calls + +The way each call is eliminated depends on whether it **arranges** state before +the test acts, or **reads/acts** during the test. + +### A. Arrange (pre-test setup) — move into the prepared story + +These describe the starting state and map directly onto story args. They are the +bulk of the calls and the easiest to remove. + +| API call | Story mechanism | +| ------------------------------ | ---------------------------------------------------------------------- | +| `setEditorData(data)` | `ScenarioArgs.data` (already supported) | +| `addMockContents(...)` | `ScenarioArgs.mockContents` (already supported) | +| `addMockExternalContents(...)` | `ScenarioArgs.mockExternalContents` (already supported) | +| `setReadOnly(true)` _(initial)_ | `ScenarioArgs.readOnly` (already supported) | +| `addBlockedWord(word)` | **New** `ScenarioArgs.blockedWords: string[]` | +| `addInputExampleElement(el)` | **New** `ScenarioArgs.inputExampleElements: InputExampleElement[]` | + +### B. Read / Act (during the test) — expose as observable DOM output + +These read live editor/service state or perform an action mid-test. They cannot +be "baked in"; instead the story renders the value into a stable, observable +element that updates reactively, and the test reads it via a locator +(`expect.poll(() => locator.textContent())`). See +[Observable Outputs Harness](#observable-outputs-harness). + +| API call | Replacement | +| ------------------------------------- | -------------------------------------------------------------------------------------------- | +| `getEditorData()` | Harness element `[data-test="editor-data"]`, bound to `editor` data changes | +| `setEditorDataAndGetDataView(data)` | Story is prepared with `data`; harness element `[data-test="data-view"]` renders the processed data view | +| `getLastOpenedEntities()` | Harness element `[data-test="last-opened-entities"]`, fed by the mock content-form service | +| `validateIsDroppableState(uris)` | Harness element `[data-test="is-droppable-state"]` for the story's fixed uris | +| `validateIsDroppableInLinkBalloon(uris)` | Harness element `[data-test="is-droppable-in-link-balloon"]` for the story's fixed uris | +| `focusEditor()` | Locator action `editor(page).click()` (no harness needed) | + +> **Note on `setEditorDataAndGetDataView`:** this is a data-processing +> round-trip (set data → read processed data view). Since the input becomes +> fixed story data, each distinct input becomes its own story variant, and the +> resulting data view is rendered into the harness. This converts the +> heavily-parametrized `Differencing`, `DocumentLists` and `Images` tests into +> sets of prepared story variants. + +## Target Design + +### 1. Extend the scenario contract + +Add to `ScenarioArgs` (and `defaultScenarioArgs`, `applyScenario`): + +- `blockedWords: string[]` — pre-registered with the mock blocklist service + before the editor loads (uses existing `serviceAgent.addBlockedWord`). +- `inputExampleElements: InputExampleElement[]` — draggable input-example + sources created at mount time (uses existing + `inputExample.addInputExampleElement`). + +These reuse the existing in-page setup helpers; only the declarative wiring is +new. + +### 2. Observable Outputs Harness + +Introduce an opt-in harness rendered by `mountScenario` next to the editor +(within the scenario container), controlled by a new `ScenarioArgs.outputs` +flag/list so only stories that need it render it. The harness exposes live +values as `textContent` on stable selectors: + +- `[data-test="editor-data"]` — current editor data, updated on + `editor.model.document` `change:data`. +- `[data-test="data-view"]` — processed data view for the loaded data + (richtext only). +- `[data-test="last-opened-entities"]` — JSON array of entities opened via the + mock content-form service, updated reactively. +- `[data-test="is-droppable-state"]` / + `[data-test="is-droppable-in-link-balloon"]` — JSON evaluation results for the + story's configured uris. + +Add a Playwright-side locator module (e.g. `test/locators/outputs.ts`) with +typed readers (`editorData(page)`, `dataView(page)`, +`lastOpenedEntities(page)`, …) returning locators / parsed values — **no +`page.evaluate`**. + +### 3. Dedicated, fully prepared stories per scenario + +Replace single empty `--default` stories with one story export per test +scenario. Conventions (unchanged id scheme): + +- Title stays `Tests/`; add **multiple exports**, one per scenario + variant. +- Story id = `tests---` (e.g. + `tests-linkuserinteraction--content-link-read-only`). +- A shared per-file factory builds the variants to avoid duplication + (especially for `DocumentLists` / `Differencing` / `Images`). + +The test body then becomes: `openStory(page, id)` → locator interactions → +locator assertions. `beforeEach` may map a per-`describe` story. + +### 4. Retire the runtime API + +Once no test references them, remove the runtime-only helpers and keep the +in-page pieces only where the harness needs them: + +- Delete `tests/playwright/test/storybook/testApi.ts` (the `page.evaluate` + wrappers) and its `EditorTestApi` mirror. +- In `tests/storybook`, drop `installEditorTestApi` / the `window`-exposed API + surface that exists purely for `page.evaluate`; fold the still-needed reads + (data view, last opened entities, dropability) into the harness wiring. +- `window.editor` exposure and the editor factories are unaffected. + +## Per-Test Refactoring Plan + +For each test: create prepared story variant(s), move arrange-calls into args, +replace read/act-calls with harness locators or locator actions, delete API +imports. + +| Test | New story variants (exports) | Arrange → args | Read/act → replacement | +| ---------------------------- | ------------------------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------------------- | +| `Application` | keep as-is (already prepared) | — | — | +| `BBCode` | per data case | `data`, `dataType: "bbcode"` | — | +| `Blocklist` | per data case | `data` | — | +| `BlocklistCollapsed` | per case | `data`, `blockedWords` | — | +| `BlocklistExpandedKeyboard` | per case | `data`, `blockedWords` | — | +| `BlocklistExpandedToolbar` | per case | `data`, `blockedWords` | — | +| `ContentLink` | per link case | `data`, `mockContents` | — | +| `Differencing` | per diff case | `data`, `mockContents` | `data-view` harness | +| `DocumentLists` | per list case (factory: ol/ul × attribute set) | `data` | `data-view` harness | +| `DragDrop` | per drag case | `mockContents`, `mockExternalContents`, `inputExampleElements`, `data` | `editor-data` harness; `is-droppable-*` harness | +| `FontMapper` | per case | `data` | `editor-data` harness; `focusEditor` → `editor.click()` | +| `HelloEditor` | per case | `data`, `mockContents` | `editor-data` harness | +| `Images` | per image case | `data`, `mockContents` | `data-view` harness; `last-opened-entities` harness | +| `LinkBalloon` | per case | `data`, `mockContents` | — | +| `LinkUserInteraction` | `ExternalLink`, `ExternalLinkReadOnly`, `ContentLink`, `ContentLinkReadOnly` | `data`, `mockContents`, `readOnly` | `last-opened-entities` harness | +| `PasteButton` | per paste case | `mockContents`, `inputExampleElements`, `data` | `editor-data` harness | + +> Tests that currently key their data off `testInfo.title` (e.g. +> `LinkUserInteraction`, `HelloEditor`) must move that constant into the story +> and assert against the story's known text instead. + +## Step-by-Step Execution Plan + +1. **Contract & harness foundation** + - [x] Extend `ScenarioArgs` with `blockedWords` and `inputExampleElements`; + wire them in `applyScenario.ts` and `defaultScenarioArgs`. + - [x] Implement the Observable Outputs Harness in `tests/storybook/src` + (reactive bindings for editor data, data view, last opened entities, + dropability) behind an opt-in `outputs` arg. + - [x] Add `tests/playwright/test/locators/outputs.ts` typed readers. + - [x] Verify with one pilot (e.g. `HelloEditor`) before rolling out. +2. **Pilot migration (`HelloEditor`)** + - [x] Create prepared story variants, refactor the test to locators only, + remove its `testApi` imports. Confirm green. +3. **Roll out by group** (small → large), running the affected file after each: + - [x] Setup-only: `BBCode`, `Blocklist*`, `ContentLink`, `LinkBalloon`. + - [x] Read-back: `FontMapper`, `PasteButton`, `DragDrop`. + - [x] Data-view round-trips: `DocumentLists`, `Differencing`, `Images`. + - [x] Interaction + service reads: `LinkUserInteraction`. +4. **Retire the runtime API** + - [x] Delete `test/storybook/testApi.ts` and the Storybook + `installEditorTestApi` window surface once unused. + - [x] Remove now-dead helpers/imports; keep harness-backing setup utilities. +5. **Docs & verification** + - [x] Update `tests/storybook/README.md` (story-per-scenario model, harness, + no `page.evaluate`) and the story↔test mapping. + - [x] Full suite green (`PLAYWRIGHT_RETRIES=2`), lint + typecheck for both + packages. + +## Success Criteria + +- [x] No `page.evaluate` (directly or via `testApi`) remains in + `tests/playwright` — the former `FontMapper` browser-clipboard write is now a + prepared-story clipboard payload, so even that test runs with locators only. +- [x] `tests/playwright/test/storybook/testApi.ts` is removed. +- [x] Every test opens a story that is fully prepared for it; arrange happens in + the story, not the test. +- [x] All values previously read via the API are exposed as observable DOM + outputs and read through locators. +- [x] Each test scenario maps to a dedicated story (id + `tests---`). +- [x] Full Playwright suite passes; lint/typecheck/build pass for both packages. +- [x] `tests/storybook/README.md` reflects the new model. + +## Risks & Open Questions + +- **Story proliferation:** `DocumentLists` / `Differencing` / `Images` expand + into many variants. Mitigate with per-file story factories generating exports + from a parameter table. +- **Reactive harness fidelity:** values read *after* an interaction (e.g. + `getEditorData` post-paste, `getLastOpenedEntities` post-click) require the + harness to update reactively; tests should use `expect.poll`. +- **Dropability evaluation:** `validateIsDroppable*` results depend on the uris + under test. With prepared stories the uris are fixed per variant; confirm this + preserves the original coverage. +- **`testInfo.title`-derived data:** must become explicit story constants; + ensure assertions are updated accordingly. +- **DragDrop flakiness:** pre-existing drag-timing flakiness should not regress; + keep `PLAYWRIGHT_RETRIES` behavior for CI. +- **Two-copy contract:** while migrating, the Storybook and Playwright API + copies must stay in sync until both are removed together. diff --git a/TESTS_REFACTORING_IMPL_PLAN.md b/TESTS_REFACTORING_IMPL_PLAN.md new file mode 100644 index 0000000000..7b5dfe6a67 --- /dev/null +++ b/TESTS_REFACTORING_IMPL_PLAN.md @@ -0,0 +1,382 @@ +# Tests Refactoring — Implementation Plan + +Concrete, code-referenced execution plan for the refactoring described in +[`TESTS_REFACTORING.md`](./TESTS_REFACTORING.md): remove every `page.evaluate` / +`testApi` call from `tests/playwright` by serving **fully prepared stories** and +reading all values back through **observable DOM outputs** via Playwright +locators. + +This plan is the working checklist. Track progress by checking the boxes. Each +phase ends with a verification gate that must pass before the next phase starts. + +## Conventions & Ground Rules + +- **No `page.evaluate` at all** may remain in `tests/playwright` at the end + (neither direct nor via `test/storybook/testApi.ts`). The former + browser-clipboard exception in `FontMapper.test.ts` was also removed: the Word + HTML now lives in the Storybook package and each prepared FontMapper story + writes it to the browser clipboard while mounting (`clipboard` scenario arg → + `src/setup/clipboard.ts`), so the test only pastes and asserts through the + `editor-data` output. The Phase 6 audit greps confirm no `page.evaluate` + remains. +- **Story files are CSF:** every named export is treated as a story. **Do not + export helper constants/types** from a `*.stories.ts` file — Storybook will try + to render them as stories and the editor never becomes ready. Put per-story + fixtures in the shared constants package (see next rule) and import them into + both the story and its test, so neither file mirrors literals by hand. +- **Shared constants live in `@coremedia/ckeditor5-itest-constants`** + (`tests/constants`). Constants that both the Storybook and Playwright packages + rely on — the scenario container contract (`SCENARIO_CONTAINER_CLASS`, + `EDITOR_READY_ATTRIBUTE`, `EDITOR_ELEMENT_ID`), the outputs harness ids + (`OUTPUT_TEST_IDS`, `OUTPUTS_CONTAINER_CLASS`, `ScenarioOutput`), the in-page + test API global (`EDITOR_TEST_API_GLOBAL`), and per-story fixtures (e.g. + `helloEditorScenario`) — are defined **once** there and imported by both + packages. This replaces the former "kept in sync by value" copies. The package + is consumed as TypeScript source (`main` → `src/index.ts`), so there is no + build step; just add a `workspace:^27.0.0` dependency where needed and + `pnpm install`. +- **Arrange in the story, act/assert via locators.** Tests only call + `openStory(page, id)` and then use locators. +- **Story id scheme unchanged:** `tests---`. New per-scenario + exports replace the single `Default` where needed. +- **Keep both API copies in sync** (`tests/storybook/src/runtime/testApi.ts` and + `tests/playwright/test/storybook/testApi.ts`) until they are removed together + in Phase 5. Their shared `EDITOR_TEST_API_GLOBAL` now comes from + `@coremedia/ckeditor5-itest-constants`; remove it there once both API copies + are deleted. Do not partially delete one side. +- **CRLF caveat:** the `create` tool writes CRLF and trips prettier. After + creating/editing files run + `pnpm --filter exec eslint --fix `. +- **Verification per file:** + `pnpm --filter "@coremedia/ckeditor5-playwright-itest" run ui-test --project=.test.ts`. +- **Do not weaken assertions.** A scenario that previously asserted on + `testInfo.title`-derived text must assert on the equivalent fixed story + constant. + +## Source-of-Truth References (existing code) + +These already exist and are reused — the harness wraps them, it does not +reimplement them: + +- `tests/storybook/src/runtime/scenario.ts` — `ScenarioArgs`, + `defaultScenarioArgs`. **Extend here.** +- `tests/storybook/src/setup/applyScenario.ts` — `applyScenario(editor, args)`. + **Extend here.** +- `tests/storybook/src/runtime/mountStory.ts` — `mountScenario(initialize, + args)`, container, `EDITOR_READY_ATTRIBUTE`, `installEditorTestApi`. **Render + harness here.** +- `tests/storybook/src/setup/editorData.ts` — `getEditorData`, `setEditorData`, + `setDataAndGetDataView` (one-shot `richtext:toView` listener). +- `tests/storybook/src/setup/serviceAgent.ts` — `getLastOpenedEntities`, + `getContentFormService`, `addBlockedWord`, `getBlocklistService`. +- `tests/storybook/src/setup/inputExample.ts` — `addInputExampleElement`, + `validateIsDroppableState`, `validateIsDroppableInLinkBalloon`. +- `tests/storybook/src/editors/index.ts` — `createEditorScenario`, + `editorFactories`. +- `tests/playwright/test/locators/` — existing locator modules (`editor.ts`, + `balloon.ts`). **Add `outputs.ts`.** + +## Phase 0 — Baseline + +- [x] Record the current green baseline: run the full suite with + `PLAYWRIGHT_RETRIES=2` and note pass/flaky counts. _(104 passed, 0 flaky.)_ +- [x] Confirm typecheck/lint clean for both packages. + +**Gate:** baseline suite green (modulo known DragDrop flakiness). _(Met.)_ + +## Phase 1 — Scenario Contract Extension + +Goal: stories can declare blocked words and input-example drag sources. + +- [x] `scenario.ts`: add to `ScenarioArgs`: + - `blockedWords: string[]` + - `inputExampleElements: InputExampleElement[]` + (import `InputExampleElement` from + `@coremedia-internal/ckeditor5-coremedia-studio-integration-mock`). +- [x] `scenario.ts`: add both to `defaultScenarioArgs` (`[]` each). +- [x] `applyScenario.ts`: after existing steps, apply the new args: + - for each `blockedWords` → `await addBlockedWord(editor, word)` + (note: async; make `applyScenario` async or fire a tracked promise — see + below). + - for each `inputExampleElements` → `addInputExampleElement(editor, el)`. +- [x] **Async ordering decision:** `addBlockedWord` is async (resolves the mock + blocklist service). `applyScenario` is currently sync and called inside + `createEditorScenario` before returning the editor. Make `applyScenario` + `async` and `await` it in `createEditorScenario` so the + `data-editor-ready` signal is only set after blocked words are registered. + Verify `mountScenario`'s ready wiring still holds. _(Done: `applyScenario` + is now async and awaited in `createEditorScenario`.)_ +- [x] Typecheck `tests/storybook`. + +**Gate:** `pnpm --filter "@coremedia/ckeditor5-storybook-itest" run typecheck` +and `run lint` pass. _(Met.)_ + +## Phase 2 — Observable Outputs Harness + +Goal: an opt-in harness renders live editor/service values as `textContent` on +stable `[data-test="…"]` selectors, updated reactively. + +### 2a. Scenario flag + +- [x] `scenario.ts`: add `outputs?: ScenarioOutput[]` where + `ScenarioOutput = "editor-data" | "data-view" | "last-opened-entities" | + "is-droppable-state" | "is-droppable-in-link-balloon"`. +- [x] Add a companion arg for the dropability inputs the harness needs: + `droppableUris?: string[]` (uris evaluated for `is-droppable-*` outputs). +- [x] Default in `defaultScenarioArgs`: `outputs: []`, `droppableUris: []`. + +### 2b. Harness module + +- [x] New file `tests/storybook/src/runtime/outputs.ts` exporting + `installOutputsHarness(container: HTMLElement, editor: ClassicEditor, args: + ScenarioArgs): void`. Behavior per requested output: + - `editor-data`: create `
`; set on
+    `editor.model.document` `change:data` (and once initially) to
+    `getEditorData(editor)`.
+  - `data-view`: create `
`; render the processed
+    data view for the **loaded** `args.data` using the `richtext:toView`
+    mechanism from `editorData.ts` (persistent listener + one re-set to
+    populate; richtext only).
+  - `last-opened-entities`: create `
`;
+    resolve the mock content-form service once, then poll
+    `JSON.stringify(service.getLastOpenedEntities())` reactively.
+  - `is-droppable-state` / `is-droppable-in-link-balloon`: create the matching
+    `
`; poll `JSON.stringify(validateIsDroppable*(editor,
+    args.droppableUris) ?? null)`.
+- [x] Export `ScenarioOutput` and the `data-test` constant names so the
+      Playwright locators can share them by value (string copy; no build-time
+      dependency, mirroring the `EDITOR_TEST_API_GLOBAL` pattern).
+- [x] Define a shared constants block (`OUTPUT_TEST_IDS`) in `outputs.ts`.
+
+### 2c. Mount wiring
+
+- [x] `mountStory.ts`: after the editor is ready and before/with
+      `installEditorTestApi`, if `resolvedArgs.outputs.length > 0` call
+      `installOutputsHarness(container, editor, resolvedArgs)`. Harness elements
+      live inside the scenario container but visually out of the way (they are
+      only read by tests).
+
+### 2d. Playwright locators
+
+- [x] New file `tests/playwright/test/locators/outputs.ts` with typed readers
+      (no `page.evaluate`): `editorData`, `dataView`, `lastOpenedEntities`,
+      `isDroppableState`, `isDroppableInLinkBalloon`, plus `*Output` locator
+      getters for `expect.poll`/`toHaveText`.
+- [x] Mirror the `data-test` id constants here (string copy).
+
+**Gate:** `tests/storybook` typecheck/lint and `tests/playwright` build/lint
+pass. Harness not yet consumed. _(Met.)_
+
+## Phase 3 — Pilot: `HelloEditor`
+
+Goal: prove the end-to-end model on the simplest read-back test before rolling
+out. Current usage: `setEditorData ×4`, `getEditorData ×2`, `addMockContents ×2`.
+
+- [x] `HelloEditor.stories.ts`: replace single `Default` with prepared variants,
+      one per test case (`Welcome`, `Cleared`, `ExternalLink`, `InternalLink`).
+      Each sets `data`, `mockContents`, and `outputs: ["editor-data"]` where the
+      test reads data back.
+- [x] `HelloEditor.test.ts`: per test `openStory(page, "tests-helloeditor--")`;
+      replace `setEditorData`/`getEditorData` with story data + `editorData`
+      locator (`expect.poll`); drop `addMockContents` (now in args). Remove all
+      `testApi` imports.
+- [x] Move `testInfo.title`-derived link text to explicit story constants and
+      update assertions.
+- [x] `eslint --fix`, then run `--project=HelloEditor.test.ts`. _(4 passed.)_
+- [x] Extract the constants shared between the story and its test into the new
+      `@coremedia/ckeditor5-itest-constants` package (`helloEditorScenario`), and
+      move the previously "kept in sync by value" infra constants
+      (`OUTPUT_TEST_IDS` / scenario container contract / `EDITOR_TEST_API_GLOBAL`)
+      there too. Both `tests/storybook` and `tests/playwright` now import them
+      instead of holding private copies. _(typecheck/lint/build green; 4 passed.)_
+
+**Gate:** `HelloEditor.test.ts` green with **zero** `testApi` imports. Re-confirm
+the harness reactivity (data updates after the cleared case). _(Met.)_
+
+If the pilot reveals harness gaps (e.g. reactive timing for
+`last-opened-entities`), fix Phase 2 before continuing.
+
+## Phase 4 — Rollout by Group
+
+For every test: create prepared story variant(s) → move arrange-calls into args
+→ replace read/act-calls with locators/harness → delete `testApi` imports →
+`eslint --fix` → run that file. Check the box only when the file is green with no
+`testApi` import.
+
+### 4a. Setup-only (arrange args, no harness)
+
+- [x] `BBCode` — `data`, `dataType: "bbcode"`. _(story `tests-bbcode--bold-word`;
+      bold word shared via `bbCodeScenario`; 1 passed.)_
+- [x] `Blocklist` — `data`. _(story `tests-blocklist--default`; paragraphs +
+      blocked word shared via `blocklistScenario`; 1 passed.)_
+- [x] `BlocklistCollapsed` — `data`, `blockedWords`. _(shared `blocklistWordsScenario`; 1 passed.)_
+- [x] `BlocklistExpandedKeyboard` — `data`, `blockedWords`. _(shared `blocklistWordsScenario`; 1 passed.)_
+- [x] `BlocklistExpandedToolbar` — `data`, `blockedWords`. _(shared `blocklistWordsScenario`; 1 passed.)_
+- [x] `ContentLink` — `data`, `mockContents`. _(6 prepared variants; shared
+      `contentLinkScenario`/`contentLinkContentName`; 6 passed.)_
+- [x] `LinkBalloon` — `data`, `mockContents`. _(content link + helper fixture
+      divs baked into the story render; the test's own `page.evaluate` injectors
+      removed; shared `linkBalloonScenario` (also used by the richtext keep-open
+      config); 3 passed.)_
+
+### 4b. Read-back (`editor-data` harness; focus via locator)
+
+- [x] `FontMapper` — `outputs: ["editor-data"]`; `getEditorData` → `editorData`
+      locator; `focusEditor` → `editor(page).click()`. _(Story `Default` exposes
+      `editor-data`; the `writeToClipboard` `page.evaluate` is retained as the
+      documented browser-clipboard exception — see Ground Rules; 3 passed.)_
+- [x] `PasteButton` — `data`, `mockContents`, `inputExampleElements`;
+      `getEditorData` → `editorData` locator. _(7 prepared per-test stories
+      built by a `pasteButtonStory` factory; shared `pasteButtonScenario`; the
+      PNG/content-name fixtures moved into the constants package
+      (`mockFixtures.ts`, re-exported by playwright's `MockFixtures.ts`); image
+      variants expose `editor-data`; 7 passed.)_
+- [x] `DragDrop` — `mockContents`, `mockExternalContents`,
+      `inputExampleElements`, `data`; `getEditorData` → `editorData`;
+      `validateIsDroppable*` → `is-droppable-*` harness with per-variant
+      `droppableUris`. Keep `PLAYWRIGHT_RETRIES` behavior. _(11 prepared per-test
+      stories built by `contentDragStory`/`externalDragStory` factories; shared
+      `dragDropScenario`; dropability polled via the `isDroppableState` /
+      `isDroppableInLinkBalloon` output locators; image variants expose
+      `editor-data`; 11 passed.)_
+
+### 4c. Data-view round-trips (`data-view` harness; many variants)
+
+These are heavily parametrized; build a **per-file story factory** that
+generates exports from a parameter table to avoid duplication.
+
+- [x] `DocumentLists` — factory over (ol/ul × attribute sets); each variant sets
+      `data`, `outputs: ["data-view"]`; assert `dataView` locator + editing-view
+      locators. _(38 prepared per-test stories generated by a `story`/`makeStory`
+      factory from the shared `documentListsCases` table; the test iterates the
+      same table and asserts by case `kind`; 38 passed.)_
+- [x] `Differencing` — variants set `data`/`mockContents`,
+      `outputs: ["data-view"]`. _(8 prepared per-test stories — 4 text-diff types,
+      all-attributes, false-positive-newline, added-newline, image-changetype.
+      The augmented `` markup is generated once in the shared
+      `differencingScenario` (`tests/constants/src/stories/differencing.ts`, which
+      deliberately depends on example-data because the augmented markup _is_ the
+      asserted value) and consumed by both story `data` and test assertions, so
+      the byte-exact xdiff ids never drift. The `data-view` harness was fixed to
+      re-set the original scenario `data` rather than `editor.getData()`, because
+      editing-only augmentations like `` are stripped from `getData()`
+      but must be visible in the data view; DocumentLists re-verified (38 passed).
+      8 passed.)_
+- [x] `Images` — variants set `data`/`mockContents`,
+      `outputs: ["data-view","last-opened-entities"]`. _(10 prepared per-test
+      stories — 4 media-representation cases (shared `imageMediaCases` table,
+      `data-view`), invalid-href, alignment, open-in-tab enabled/disabled
+      (enabled exposes `last-opened-entities`), image-links no-link/with-link.
+      Literals shared via `imagesScenario`/`imageMediaCases`. Two latent bugs
+      surfaced and fixed: (1) the `last-opened-entities` harness output stringified
+      the Promise returned by `service.getLastOpenedEntities()` without awaiting it
+      (Images is its first consumer) → now awaited; (2) `PNG_EMPTY_24x24` in the
+      shared `mockFixtures` had a two-character base64 corruption introduced during
+      the constants-package move → restored to the original value. 10 passed.)_
+
+### 4d. Interaction + service reads
+
+- [x] `LinkUserInteraction` — variants `ExternalLink`, `ExternalLinkReadOnly`,
+      `ContentLink`, `ContentLinkReadOnly` set `data`, `mockContents`,
+      `readOnly`, `outputs: ["last-opened-entities"]`; replace
+      `getLastOpenedEntities` with the harness locator; `setReadOnly` initial
+      state → `readOnly` arg. Move `testInfo.title` link text into story
+      constants. _(4 prepared stories, each backing a mouse + keyboard test pair
+      (8 tests total): external-link / external-link-read-only drive the new
+      browser-tab assertions; content-link / content-link-read-only expose
+      `last-opened-entities` for the work-area-tab assertions. Link texts and the
+      `["content/42"]` expectation shared via `linkUserInteractionScenario`.
+      8 passed.)_
+
+### 4e. Already-prepared
+
+- [x] `Application` — verify it has no `testApi` usage; no change expected.
+      _(Verified: `Application.test.ts` only opens `tests-application--default` and
+      waits for the editor locator — no `testApi`, no `page.evaluate`. No change
+      needed; 1 passed. A repo-wide grep over `tests/playwright/test/*.test.ts`
+      confirms no remaining `testApi` imports, and the only `page.evaluate` is the
+      documented FontMapper clipboard-write exception.)_
+
+**Gate after 4:** every `*.test.ts` is free of `testApi` imports;
+`grep` for `storybook/testApi` and `page.evaluate` in `tests/playwright/test`
+returns nothing.
+
+## Phase 5 — Retire the Runtime API
+
+- [x] Delete `tests/playwright/test/storybook/testApi.ts`.
+- [x] In `tests/storybook`: remove `installEditorTestApi` /
+      `createEditorTestApi` and the `window[EDITOR_TEST_API_GLOBAL]` surface from
+      `src/runtime/testApi.ts`; drop its export from `src/runtime/index.ts`.
+      Keep the underlying setup utilities (`editorData`, `serviceAgent`,
+      `inputExample`) — the harness depends on them. _(The whole
+      `src/runtime/testApi.ts` was deleted — it only held the test-API surface;
+      the kept setup utilities live in `src/setup/*`. `setDataAndGetDataView`
+      remains exported as an unused-but-kept setup helper.)_
+- [x] Remove the `installEditorTestApi` call in `mountStory.ts`. _(Import +
+      call removed; `window.editor` instance global is left as-is — it is not the
+      test-API global and is not used by any test.)_
+- [x] Remove now-dead imports/types; ensure no `EditorTestApi` references
+      remain.
+- [x] Verify nothing else imports the removed symbols. _(Also deleted
+      `tests/constants/src/testApi.ts` (`EDITOR_TEST_API_GLOBAL`) and its barrel
+      export, as both API copies are gone. A repo-wide grep for
+      `installEditorTestApi` / `createEditorTestApi` / `EditorTestApi` /
+      `EDITOR_TEST_API_GLOBAL` / `coremediaEditorTestApi` / `storybook/testApi`
+      returns nothing. All three packages typecheck/lint/build clean; smoke test
+      24 passed.)_
+
+**Gate:** both packages typecheck/lint/build; no references to
+`coremediaEditorTestApi` remain except possibly historical docs.
+
+## Phase 6 — Documentation & Final Verification
+
+- [x] Update `tests/storybook/README.md`:
+  - story-per-scenario model (multiple exports per `Tests/`),
+  - the Observable Outputs Harness and `data-test` ids,
+  - explicit statement that tests use **locators only**, no `page.evaluate`,
+  - refresh the story↔test mapping (now many variants).
+- [x] Update root `README.md` / any cross-links if needed. _(No root-README
+      references to the retired API; updated `tests/constants/README.md` to drop
+      the deleted `testApi.ts` entry and note `mockFixtures.ts` +
+      the `stories/differencing.ts` example-data exception.)_
+- [x] Update `TESTS_REFACTORING.md` success-criteria checklist to done.
+- [x] Full suite green with `PLAYWRIGHT_RETRIES=2`. _(104 passed, 1.9m.)_
+- [x] `pnpm -r` lint + build clean (at least both test packages).
+      _(constants + storybook typecheck/lint clean; playwright lint/build clean.)_
+- [x] Final `grep` audits:
+  - `tests/playwright/test` contains no `page.evaluate`,
+  - no import of `./storybook/testApi`,
+  - `tests/storybook/src` exposes no `window` test-API global.
+
+**Gate:** all success criteria in `TESTS_REFACTORING.md` met.
+
+## Tracking Table (per-file status)
+
+| File                          | Variants created | Args moved | Reads → harness/locator | `testApi` removed | Green |
+| ----------------------------- | ---------------- | ---------- | ----------------------- | ----------------- | ----- |
+| `Application`                 | n/a              | n/a        | n/a                     | n/a               | [x]   |
+| `HelloEditor` (pilot)         | [x]              | [x]        | [x]                     | [x]               | [x]   |
+| `BBCode`                      | [x]              | [x]        | n/a                     | [x]               | [x]   |
+| `Blocklist`                   | [x]              | [x]        | n/a                     | [x]               | [x]   |
+| `BlocklistCollapsed`          | [x]              | [x]        | n/a                     | [x]               | [x]   |
+| `BlocklistExpandedKeyboard`   | [x]              | [x]        | n/a                     | [x]               | [x]   |
+| `BlocklistExpandedToolbar`    | [x]              | [x]        | n/a                     | [x]               | [x]   |
+| `ContentLink`                 | [x]              | [x]        | n/a                     | [x]               | [x]   |
+| `LinkBalloon`                 | [x]              | [x]        | n/a                     | [x]               | [x]   |
+| `FontMapper`                  | [x]              | [x]        | [x]                     | [x]               | [x]   |
+| `PasteButton`                 | [x]              | [x]        | [x]                     | [x]               | [x]   |
+| `DragDrop`                    | [x]              | [x]        | [x]                     | [x]               | [x]   |
+| `DocumentLists`               | [x]              | [x]        | [x]                     | [x]               | [x]   |
+| `Differencing`                | [x]              | [x]        | [x]                     | [x]               | [x]   |
+| `Images`                      | [x]              | [x]        | [x]                     | [x]               | [x]   |
+| `LinkUserInteraction`         | [x]              | [x]        | [x]                     | [x]               | [x]   |
+
+## Rollback / Safety
+
+- One file per commit (story + test together) keeps the suite green throughout
+  on the working branch in use; the two API copies stay until Phase 5, so
+  partially migrated states still run.
+- If a harness output proves unreliable for a given test, prefer fixing the
+  reactive binding over reintroducing `page.evaluate`; only as a last resort,
+  keep that single read on the API and document it as an open item before
+  Phase 5.
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4578ebcab5..73055fbfbe 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -66,6 +66,24 @@ catalogs:
     '@playwright/test':
       specifier: ^1.59.1
       version: 1.60.0
+    '@storybook/addon-essentials':
+      specifier: ^8.6.14
+      version: 8.6.14
+    '@storybook/addon-interactions':
+      specifier: ^8.6.14
+      version: 8.6.14
+    '@storybook/addon-webpack5-compiler-swc':
+      specifier: ^2.1.0
+      version: 2.1.0
+    '@storybook/html':
+      specifier: ^8.6.14
+      version: 8.6.18
+    '@storybook/html-webpack5':
+      specifier: ^8.6.14
+      version: 8.6.14
+    '@storybook/test':
+      specifier: ^8.6.14
+      version: 8.6.15
     '@stylistic/eslint-plugin':
       specifier: ^5.2.3
       version: 5.4.0
@@ -126,9 +144,6 @@ catalogs:
     expect:
       specifier: ^30.2.0
       version: 30.4.1
-    express:
-      specifier: ^5.1.0
-      version: 5.1.0
     global-jsdom:
       specifier: ^27.0.0
       version: 27.0.0
@@ -171,6 +186,9 @@ catalogs:
     source-map-loader:
       specifier: ^5.0.0
       version: 5.0.0
+    storybook:
+      specifier: ^8.6.14
+      version: 8.6.18
     style-loader:
       specifier: ^4.0.0
       version: 4.0.0
@@ -432,7 +450,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -456,7 +474,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -473,7 +491,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -497,7 +515,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -543,7 +561,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@coremedia/service-agent':
         specifier: 'catalog:'
         version: 2.1.2
@@ -578,7 +596,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@coremedia/service-agent':
         specifier: 'catalog:'
         version: 2.1.2
@@ -616,7 +634,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@coremedia/service-agent':
         specifier: 'catalog:'
         version: 2.1.2
@@ -666,7 +684,7 @@ importers:
         version: link:../ckeditor5-coremedia-example-data
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -690,7 +708,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -707,13 +725,13 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
       '@types/webpack':
         specifier: 'catalog:'
-        version: 5.28.5(postcss@8.5.15)
+        version: 5.28.5(@swc/core@1.15.41)(postcss@8.5.15)
       copyfiles:
         specifier: 'catalog:'
         version: 2.4.1
@@ -731,7 +749,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -762,7 +780,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@coremedia/service-agent':
         specifier: 'catalog:'
         version: 2.1.2
@@ -812,7 +830,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@coremedia/service-agent':
         specifier: 'catalog:'
         version: 2.1.2
@@ -839,7 +857,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -877,7 +895,7 @@ importers:
         version: link:../ckeditor5-coremedia-example-data
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -904,7 +922,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -924,7 +942,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -948,7 +966,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -994,7 +1012,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@coremedia/service-agent':
         specifier: 'catalog:'
         version: 2.1.2
@@ -1018,7 +1036,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -1044,7 +1062,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@coremedia/service-agent':
         specifier: 'catalog:'
         version: 2.1.2
@@ -1071,7 +1089,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -1091,7 +1109,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -1118,7 +1136,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -1138,7 +1156,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -1165,7 +1183,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -1204,7 +1222,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -1228,7 +1246,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -1245,7 +1263,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -1266,7 +1284,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -1289,13 +1307,13 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
       '@types/webpack':
         specifier: 'catalog:'
-        version: 5.28.5(postcss@8.5.15)
+        version: 5.28.5(@swc/core@1.15.41)(postcss@8.5.15)
       ckeditor5:
         specifier: 'catalog:'
         version: 48.1.1
@@ -1316,7 +1334,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -1355,7 +1373,7 @@ importers:
     devDependencies:
       '@coremedia-internal/studio-client.test-runner-helper':
         specifier: 'catalog:'
-        version: 1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+        version: 1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       '@types/node':
         specifier: 'catalog:'
         version: 24.12.4
@@ -1376,7 +1394,7 @@ importers:
         version: 6.1.3
       ts-node:
         specifier: 'catalog:'
-        version: 10.9.2(@types/node@24.12.4)(typescript@5.9.3)
+        version: 10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3)
       tsx:
         specifier: 'catalog:'
         version: 4.22.4
@@ -1385,6 +1403,28 @@ importers:
         version: 5.9.3
     publishDirectory: dist
 
+  tests/constants:
+    dependencies:
+      '@coremedia-internal/ckeditor5-coremedia-example-data':
+        specifier: workspace:^1.0.0-SNAPSHOT
+        version: link:../../packages/ckeditor5-coremedia-example-data
+    devDependencies:
+      '@coremedia/studio-client.build-config':
+        specifier: 'catalog:'
+        version: 1.2.1(postcss@8.5.15)(typescript@5.9.3)(webpack@5.107.1(postcss@8.5.15))
+      '@coremedia/studio-client.eslint-config':
+        specifier: 'catalog:'
+        version: 1.0.2(@types/eslint@9.6.1)(eslint@9.39.4(jiti@1.21.6))(typescript@5.9.3)
+      '@types/node':
+        specifier: 'catalog:'
+        version: 24.12.4
+      eslint:
+        specifier: 'catalog:'
+        version: 9.39.4(jiti@1.21.6)
+      typescript:
+        specifier: 'catalog:'
+        version: 5.9.3
+
   tests/playwright:
     devDependencies:
       '@coremedia-internal/ckeditor5-coremedia-example-data':
@@ -1399,6 +1439,9 @@ importers:
       '@coremedia/ckeditor5-coremedia-studio-integration':
         specifier: workspace:^27.0.0
         version: link:../../packages/ckeditor5-coremedia-studio-integration
+      '@coremedia/ckeditor5-itest-constants':
+        specifier: workspace:^27.0.0
+        version: link:../constants
       '@coremedia/studio-client.build-config':
         specifier: 'catalog:'
         version: 1.2.1(postcss@8.5.15)(typescript@5.9.3)(webpack@5.107.1(postcss@8.5.15))
@@ -1423,9 +1466,6 @@ importers:
       eslint:
         specifier: 'catalog:'
         version: 9.39.4(jiti@1.21.6)
-      express:
-        specifier: 'catalog:'
-        version: 5.1.0
       playwright-core:
         specifier: 'catalog:'
         version: 1.60.0
@@ -1439,6 +1479,112 @@ importers:
         specifier: 'catalog:'
         version: 5.9.3
 
+  tests/storybook:
+    dependencies:
+      '@coremedia-internal/ckeditor5-coremedia-example-data':
+        specifier: workspace:^1.0.0-SNAPSHOT
+        version: link:../../packages/ckeditor5-coremedia-example-data
+      '@coremedia-internal/ckeditor5-coremedia-studio-integration-mock':
+        specifier: workspace:^1.0.0-SNAPSHOT
+        version: link:../../packages/ckeditor5-coremedia-studio-integration-mock
+      '@coremedia/ckeditor5-bbcode':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-bbcode
+      '@coremedia/ckeditor5-coremedia-blocklist':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-coremedia-blocklist
+      '@coremedia/ckeditor5-coremedia-content-clipboard':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-coremedia-content-clipboard
+      '@coremedia/ckeditor5-coremedia-differencing':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-coremedia-differencing
+      '@coremedia/ckeditor5-coremedia-images':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-coremedia-images
+      '@coremedia/ckeditor5-coremedia-link':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-coremedia-link
+      '@coremedia/ckeditor5-coremedia-richtext':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-coremedia-richtext
+      '@coremedia/ckeditor5-coremedia-studio-essentials':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-coremedia-studio-essentials
+      '@coremedia/ckeditor5-coremedia-studio-integration':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-coremedia-studio-integration
+      '@coremedia/ckeditor5-data-facade':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-data-facade
+      '@coremedia/ckeditor5-dataprocessor-support':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-dataprocessor-support
+      '@coremedia/ckeditor5-dialog-visibility':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-dialog-visibility
+      '@coremedia/ckeditor5-dom-converter':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-dom-converter
+      '@coremedia/ckeditor5-font-mapper':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-font-mapper
+      '@coremedia/ckeditor5-itest-constants':
+        specifier: workspace:^27.0.0
+        version: link:../constants
+      '@coremedia/ckeditor5-link-common':
+        specifier: workspace:^27.0.0
+        version: link:../../packages/ckeditor5-link-common
+      ckeditor5:
+        specifier: 'catalog:'
+        version: 48.1.1
+    devDependencies:
+      '@coremedia/studio-client.build-config':
+        specifier: 'catalog:'
+        version: 1.2.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      '@coremedia/studio-client.eslint-config':
+        specifier: 'catalog:'
+        version: 1.0.2(@types/eslint@9.6.1)(eslint@9.39.4(jiti@1.21.6))(typescript@5.9.3)
+      '@storybook/addon-essentials':
+        specifier: 'catalog:'
+        version: 8.6.14(@types/react@19.2.17)(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-interactions':
+        specifier: 'catalog:'
+        version: 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-webpack5-compiler-swc':
+        specifier: 'catalog:'
+        version: 2.1.0(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      '@storybook/html':
+        specifier: 'catalog:'
+        version: 8.6.18(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/html-webpack5':
+        specifier: 'catalog:'
+        version: 8.6.14(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(storybook@8.6.18(prettier@3.8.3))(typescript@5.9.3)
+      '@storybook/test':
+        specifier: 'catalog:'
+        version: 8.6.15(storybook@8.6.18(prettier@3.8.3))
+      '@types/node':
+        specifier: 'catalog:'
+        version: 24.12.4
+      dotenv:
+        specifier: 'catalog:'
+        version: 16.4.7
+      eslint:
+        specifier: 'catalog:'
+        version: 9.39.4(jiti@1.21.6)
+      rimraf:
+        specifier: 'catalog:'
+        version: 6.1.3
+      storybook:
+        specifier: 'catalog:'
+        version: 8.6.18(prettier@3.8.3)
+      typescript:
+        specifier: 'catalog:'
+        version: 5.9.3
+      webpack:
+        specifier: 'catalog:'
+        version: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
 packages:
 
   '@adobe/css-tools@4.4.4':
@@ -2463,6 +2609,12 @@ packages:
     resolution: {integrity: sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==}
     engines: {node: '>=20.11.0'}
 
+  '@esbuild/aix-ppc64@0.25.12':
+    resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
+
   '@esbuild/aix-ppc64@0.27.7':
     resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
     engines: {node: '>=18'}
@@ -2475,6 +2627,12 @@ packages:
     cpu: [ppc64]
     os: [aix]
 
+  '@esbuild/android-arm64@0.25.12':
+    resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
+
   '@esbuild/android-arm64@0.27.7':
     resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
     engines: {node: '>=18'}
@@ -2487,6 +2645,12 @@ packages:
     cpu: [arm64]
     os: [android]
 
+  '@esbuild/android-arm@0.25.12':
+    resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
+
   '@esbuild/android-arm@0.27.7':
     resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
     engines: {node: '>=18'}
@@ -2499,6 +2663,12 @@ packages:
     cpu: [arm]
     os: [android]
 
+  '@esbuild/android-x64@0.25.12':
+    resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
+
   '@esbuild/android-x64@0.27.7':
     resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
     engines: {node: '>=18'}
@@ -2511,6 +2681,12 @@ packages:
     cpu: [x64]
     os: [android]
 
+  '@esbuild/darwin-arm64@0.25.12':
+    resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
+
   '@esbuild/darwin-arm64@0.27.7':
     resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
     engines: {node: '>=18'}
@@ -2523,6 +2699,12 @@ packages:
     cpu: [arm64]
     os: [darwin]
 
+  '@esbuild/darwin-x64@0.25.12':
+    resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
+
   '@esbuild/darwin-x64@0.27.7':
     resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
     engines: {node: '>=18'}
@@ -2535,6 +2717,12 @@ packages:
     cpu: [x64]
     os: [darwin]
 
+  '@esbuild/freebsd-arm64@0.25.12':
+    resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
+
   '@esbuild/freebsd-arm64@0.27.7':
     resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
     engines: {node: '>=18'}
@@ -2547,6 +2735,12 @@ packages:
     cpu: [arm64]
     os: [freebsd]
 
+  '@esbuild/freebsd-x64@0.25.12':
+    resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
+
   '@esbuild/freebsd-x64@0.27.7':
     resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
     engines: {node: '>=18'}
@@ -2559,6 +2753,12 @@ packages:
     cpu: [x64]
     os: [freebsd]
 
+  '@esbuild/linux-arm64@0.25.12':
+    resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
   '@esbuild/linux-arm64@0.27.7':
     resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
     engines: {node: '>=18'}
@@ -2571,6 +2771,12 @@ packages:
     cpu: [arm64]
     os: [linux]
 
+  '@esbuild/linux-arm@0.25.12':
+    resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
   '@esbuild/linux-arm@0.27.7':
     resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
     engines: {node: '>=18'}
@@ -2583,6 +2789,12 @@ packages:
     cpu: [arm]
     os: [linux]
 
+  '@esbuild/linux-ia32@0.25.12':
+    resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
   '@esbuild/linux-ia32@0.27.7':
     resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
     engines: {node: '>=18'}
@@ -2595,6 +2807,12 @@ packages:
     cpu: [ia32]
     os: [linux]
 
+  '@esbuild/linux-loong64@0.25.12':
+    resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
   '@esbuild/linux-loong64@0.27.7':
     resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
     engines: {node: '>=18'}
@@ -2607,6 +2825,12 @@ packages:
     cpu: [loong64]
     os: [linux]
 
+  '@esbuild/linux-mips64el@0.25.12':
+    resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
   '@esbuild/linux-mips64el@0.27.7':
     resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
     engines: {node: '>=18'}
@@ -2619,6 +2843,12 @@ packages:
     cpu: [mips64el]
     os: [linux]
 
+  '@esbuild/linux-ppc64@0.25.12':
+    resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
   '@esbuild/linux-ppc64@0.27.7':
     resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
     engines: {node: '>=18'}
@@ -2631,6 +2861,12 @@ packages:
     cpu: [ppc64]
     os: [linux]
 
+  '@esbuild/linux-riscv64@0.25.12':
+    resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
   '@esbuild/linux-riscv64@0.27.7':
     resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
     engines: {node: '>=18'}
@@ -2643,6 +2879,12 @@ packages:
     cpu: [riscv64]
     os: [linux]
 
+  '@esbuild/linux-s390x@0.25.12':
+    resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
   '@esbuild/linux-s390x@0.27.7':
     resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
     engines: {node: '>=18'}
@@ -2655,6 +2897,12 @@ packages:
     cpu: [s390x]
     os: [linux]
 
+  '@esbuild/linux-x64@0.25.12':
+    resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
   '@esbuild/linux-x64@0.27.7':
     resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
     engines: {node: '>=18'}
@@ -2667,6 +2915,12 @@ packages:
     cpu: [x64]
     os: [linux]
 
+  '@esbuild/netbsd-arm64@0.25.12':
+    resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [netbsd]
+
   '@esbuild/netbsd-arm64@0.27.7':
     resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
     engines: {node: '>=18'}
@@ -2679,6 +2933,12 @@ packages:
     cpu: [arm64]
     os: [netbsd]
 
+  '@esbuild/netbsd-x64@0.25.12':
+    resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
   '@esbuild/netbsd-x64@0.27.7':
     resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
     engines: {node: '>=18'}
@@ -2691,6 +2951,12 @@ packages:
     cpu: [x64]
     os: [netbsd]
 
+  '@esbuild/openbsd-arm64@0.25.12':
+    resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
   '@esbuild/openbsd-arm64@0.27.7':
     resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
     engines: {node: '>=18'}
@@ -2703,6 +2969,12 @@ packages:
     cpu: [arm64]
     os: [openbsd]
 
+  '@esbuild/openbsd-x64@0.25.12':
+    resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
   '@esbuild/openbsd-x64@0.27.7':
     resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
     engines: {node: '>=18'}
@@ -2715,6 +2987,12 @@ packages:
     cpu: [x64]
     os: [openbsd]
 
+  '@esbuild/openharmony-arm64@0.25.12':
+    resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openharmony]
+
   '@esbuild/openharmony-arm64@0.27.7':
     resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
     engines: {node: '>=18'}
@@ -2727,6 +3005,12 @@ packages:
     cpu: [arm64]
     os: [openharmony]
 
+  '@esbuild/sunos-x64@0.25.12':
+    resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
   '@esbuild/sunos-x64@0.27.7':
     resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
     engines: {node: '>=18'}
@@ -2739,6 +3023,12 @@ packages:
     cpu: [x64]
     os: [sunos]
 
+  '@esbuild/win32-arm64@0.25.12':
+    resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
   '@esbuild/win32-arm64@0.27.7':
     resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
     engines: {node: '>=18'}
@@ -2751,6 +3041,12 @@ packages:
     cpu: [arm64]
     os: [win32]
 
+  '@esbuild/win32-ia32@0.25.12':
+    resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
   '@esbuild/win32-ia32@0.27.7':
     resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
     engines: {node: '>=18'}
@@ -2763,6 +3059,12 @@ packages:
     cpu: [ia32]
     os: [win32]
 
+  '@esbuild/win32-x64@0.25.12':
+    resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
   '@esbuild/win32-x64@0.27.7':
     resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
     engines: {node: '>=18'}
@@ -2899,6 +3201,9 @@ packages:
   '@jridgewell/sourcemap-codec@1.5.0':
     resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
 
+  '@jridgewell/sourcemap-codec@1.5.5':
+    resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
   '@jridgewell/trace-mapping@0.3.31':
     resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
 
@@ -2911,6 +3216,12 @@ packages:
   '@kwsites/promise-deferred@1.1.1':
     resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==}
 
+  '@mdx-js/react@3.1.1':
+    resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==}
+    peerDependencies:
+      '@types/react': '>=16'
+      react: '>=16'
+
   '@microsoft/tsdoc-config@0.18.1':
     resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==}
 
@@ -3019,29 +3330,329 @@ packages:
     resolution: {integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==}
     engines: {node: ^20.17.0 || >=22.9.0}
 
-  '@sigstore/verify@3.1.0':
-    resolution: {integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==}
-    engines: {node: ^20.17.0 || >=22.9.0}
+  '@sigstore/verify@3.1.0':
+    resolution: {integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==}
+    engines: {node: ^20.17.0 || >=22.9.0}
+
+  '@simple-git/args-pathspec@1.0.3':
+    resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==}
+
+  '@simple-git/argv-parser@1.1.1':
+    resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==}
+
+  '@sinclair/typebox@0.34.41':
+    resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==}
+
+  '@storybook/addon-actions@8.6.14':
+    resolution: {integrity: sha512-mDQxylxGGCQSK7tJPkD144J8jWh9IU9ziJMHfB84PKpI/V5ZgqMDnpr2bssTrUaGDqU5e1/z8KcRF+Melhs9pQ==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-backgrounds@8.6.14':
+    resolution: {integrity: sha512-l9xS8qWe5n4tvMwth09QxH2PmJbCctEvBAc1tjjRasAfrd69f7/uFK4WhwJAstzBTNgTc8VXI4w8ZR97i1sFbg==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-controls@8.6.14':
+    resolution: {integrity: sha512-IiQpkNJdiRyA4Mq9mzjZlvQugL/aE7hNgVxBBGPiIZG6wb6Ht9hNnBYpap5ZXXFKV9p2qVI0FZK445ONmAa+Cw==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-docs@8.6.14':
+    resolution: {integrity: sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-essentials@8.6.14':
+    resolution: {integrity: sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-highlight@8.6.14':
+    resolution: {integrity: sha512-4H19OJlapkofiE9tM6K/vsepf4ir9jMm9T+zw5L85blJZxhKZIbJ6FO0TCG9PDc4iPt3L6+aq5B0X29s9zicNQ==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-interactions@8.6.14':
+    resolution: {integrity: sha512-8VmElhm2XOjh22l/dO4UmXxNOolGhNiSpBcls2pqWSraVh4a670EyYBZsHpkXqfNHo2YgKyZN3C91+9zfH79qQ==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-measure@8.6.14':
+    resolution: {integrity: sha512-1Tlyb72NX8aAqm6I6OICsUuGOP6hgnXcuFlXucyhKomPa6j3Eu2vKu561t/f0oGtAK2nO93Z70kVaEh5X+vaGw==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-outline@8.6.14':
+    resolution: {integrity: sha512-CW857JvN6OxGWElqjlzJO2S69DHf+xO3WsEfT5mT3ZtIjmsvRDukdWfDU9bIYUFyA2lFvYjncBGjbK+I91XR7w==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-toolbars@8.6.14':
+    resolution: {integrity: sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-viewport@8.6.14':
+    resolution: {integrity: sha512-gNzVQbMqRC+/4uQTPI2ZrWuRHGquTMZpdgB9DrD88VTEjNudP+J6r8myLfr2VvGksBbUMHkGHMXHuIhrBEnXYA==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/addon-webpack5-compiler-swc@2.1.0':
+    resolution: {integrity: sha512-mCzNtuqY8LJqj/2vW12o3S/UujRSBFstxRqhOUErrbbOBRyM6RgcPuvytDdRv1npFi8OaKOIz3SoJBT/EtAN3A==}
+    engines: {node: '>=18'}
+
+  '@storybook/blocks@8.6.14':
+    resolution: {integrity: sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ==}
+    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
+      storybook: ^8.6.14
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+
+  '@storybook/builder-webpack5@8.6.14':
+    resolution: {integrity: sha512-YZYAqc6NBKoMTKZpjxnkMch6zDtMkBZdS/yaji1+wJX2QPFBwTbSh7SpeBxDp1S11gXSAJ4f1btUWeqSqo8nJA==}
+    peerDependencies:
+      storybook: ^8.6.14
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@storybook/components@8.6.14':
+    resolution: {integrity: sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/components@8.6.18':
+    resolution: {integrity: sha512-55yViiZzPS/cPBuOeW4QGxGqrusjXVyxuknmbYCIwDtFyyvI/CgbjXRHdxNBaIjz+IlftxvBmmSaOqFG5+/dkA==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/core-webpack@8.6.14':
+    resolution: {integrity: sha512-iG7r8osNKabSGBbuJuSeMWKbU+ilt5PvzTYkClcYaagla/DliXkXvfywA6jOugVk/Cpx+c6tVKlPfjLcaQHwmw==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/core@8.6.18':
+    resolution: {integrity: sha512-dRBP2TnX6fGdS0T2mXBHjkS/3Nlu1ra1huovZVFuM67CYMzrhM/3hX/zru1vWSC5rqY93ZaAhjMciPW4pK5mMQ==}
+    peerDependencies:
+      prettier: ^2 || ^3
+    peerDependenciesMeta:
+      prettier:
+        optional: true
+
+  '@storybook/csf-plugin@8.6.14':
+    resolution: {integrity: sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/global@5.0.0':
+    resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==}
+
+  '@storybook/html-webpack5@8.6.14':
+    resolution: {integrity: sha512-OLq/ONRV7I84oyoaMSnwa9xDHP9Y6/u9Zz7jTcAgE2iThmaQND+2IfUHgRYK8QNWyQQwwLzV4+anvUsojtAmkw==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/html@8.6.14':
+    resolution: {integrity: sha512-Mbn5M7qsODJbVYMlDTduXQCj3uG2AXwwNJF2K9ttph/m6rnW2zn6ZPtSVi0HKc92C8tDdzws6Z8ibftRrmLcTw==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/html@8.6.18':
+    resolution: {integrity: sha512-7yjb09rf7wP4hlVlirVPe+Jjo6kRsr4zEhuHlLM97Jf5Ojf7LH+vtvV9M3F7zs50lm9jTNBd45oWfTX8T7d2mw==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      storybook: ^8.6.18
+
+  '@storybook/icons@1.6.0':
+    resolution: {integrity: sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+
+  '@storybook/instrumenter@8.6.14':
+    resolution: {integrity: sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/instrumenter@8.6.15':
+    resolution: {integrity: sha512-TvHR/+yyIAOp/1bLulFai2kkhIBtAlBw7J6Jd9DKyInoGhTWNE1G1Y61jD5GWXX29AlwaHfzGUaX5NL1K+FJpg==}
+    peerDependencies:
+      storybook: ^8.6.15
+
+  '@storybook/manager-api@8.6.14':
+    resolution: {integrity: sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/manager-api@8.6.18':
+    resolution: {integrity: sha512-BjIp12gEMgzFkEsgKpDIbZdnSWTZpm2dlws8WiPJCpgJtG+HWSxZ0/Ms30Au9yfwzQEKRSbV/5zpsKMGc2SIJw==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/preset-html-webpack@8.6.14':
+    resolution: {integrity: sha512-zKg2zOtiUh+obNTmSWBmYZtAl1xyNdLoCVZZhhrxbBpO72AOqMLMnPgIMx+HpOpfSjgB1N+OaDEXIFyjzoritw==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/preview-api@8.6.14':
+    resolution: {integrity: sha512-2GhcCd4dNMrnD7eooEfvbfL4I83qAqEyO0CO7JQAmIO6Rxb9BsOLLI/GD5HkvQB73ArTJ+PT50rfaO820IExOQ==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/preview-api@8.6.18':
+    resolution: {integrity: sha512-joXRXh3GdVvzhbfIgmix1xs90p8Q/nja7AhEAC2egn5Pl7SKsIYZUCYI6UdrQANb2myg9P552LKXfPect8llKg==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/react-dom-shim@8.6.14':
+    resolution: {integrity: sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.6.14
+
+  '@storybook/test@8.6.14':
+    resolution: {integrity: sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==}
+    peerDependencies:
+      storybook: ^8.6.14
+
+  '@storybook/test@8.6.15':
+    resolution: {integrity: sha512-EwquDRUDVvWcZds3T2abmB5wSN/Vattal4YtZ6fpBlIUqONV4o/cOBX39cFfQSUCBrIXIjQ6RmapQCHK/PvBYw==}
+    peerDependencies:
+      storybook: ^8.6.15
+
+  '@storybook/theming@8.6.14':
+    resolution: {integrity: sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/theming@8.6.18':
+    resolution: {integrity: sha512-n6OEjEtHupa2PdTwWzRepr7cO8NkDd4rgF6BKLitRbujOspLxzMBEqdphs+QLcuiCIgf33SqmEA64QWnbSMhPw==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@stylistic/eslint-plugin@5.4.0':
+    resolution: {integrity: sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: '>=9.0.0'
+
+  '@swc/core-darwin-arm64@1.15.41':
+    resolution: {integrity: sha512-kREh6J5paQFvP3i7f/4FbqRNOJREutVFVOkder4GVyCBQ39YmER55cW/y1NNjwrchzFqgYswFn0mMDCqbqKzrw==}
+    engines: {node: '>=10'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@swc/core-darwin-x64@1.15.41':
+    resolution: {integrity: sha512-N8B56ESFazZAWZyIkecADSPCwlLEinW7QLMEeotCpv4J7VXwfH+OLkmRL8o96UZ+1355fwHxDTS6/wK7yucvkA==}
+    engines: {node: '>=10'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@swc/core-linux-arm-gnueabihf@1.15.41':
+    resolution: {integrity: sha512-6XrId2fyle0mS5xxON8rU84mPd2Cq1kDJRj+4BnQKTd7u+2kSA6Ww+JkOP0iTNqOqt9OXhPOEAjBHAuonWcdCg==}
+    engines: {node: '>=10'}
+    cpu: [arm]
+    os: [linux]
+
+  '@swc/core-linux-arm64-gnu@1.15.41':
+    resolution: {integrity: sha512-ynLIarxlkVnqHn1D0fKOVht6mNU5ks6lrH+MY3kkS+XFaGGgDxFZVjWKJlkYTKm3RCvBTfA8Ng5fLufXheMRKQ==}
+    engines: {node: '>=10'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@swc/core-linux-arm64-musl@1.15.41':
+    resolution: {integrity: sha512-dXu/5vd4gh8symyhRF+4G7gOPkjmb4pONhh7sl+6GSiW0LOKZlfu5kXmyFbTz9smOT7jgr002qY9b1nujjXt2A==}
+    engines: {node: '>=10'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@swc/core-linux-ppc64-gnu@1.15.41':
+    resolution: {integrity: sha512-XGO6zVPXoPE0gf/XnI4jBbafNT13AYgoh6ns0JCSdOetI/kqVf0vhpz7NuNgAzZrMVCsmieqjPoTwViDgh4mOQ==}
+    engines: {node: '>=10'}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@swc/core-linux-s390x-gnu@1.15.41':
+    resolution: {integrity: sha512-0WUglRwyZtW+iMi7J3iFdrCxreZZIKf4egTwEQfIYRsqFax69A0OrFj+NIoFSE03xBT/IFRrg+S8K6f9Ky+4hA==}
+    engines: {node: '>=10'}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+
+  '@swc/core-linux-x64-gnu@1.15.41':
+    resolution: {integrity: sha512-VxkuQK59c0tHm6uJZCUrS3cyA2JhGGfdU6e41SZz0x/JS+4Sm7C1mIc97In14vkZJopEt7yXA2TouCqZDSygEA==}
+    engines: {node: '>=10'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@swc/core-linux-x64-musl@1.15.41':
+    resolution: {integrity: sha512-/0qXIu1ZxggLuovLb22vFfKHq2AA4n6Whw5UwmVCHk4pkw7KWnPIQpMCEqUMPsNkFJig7PPp/TSYFu8ZEb2rtQ==}
+    engines: {node: '>=10'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@swc/core-win32-arm64-msvc@1.15.41':
+    resolution: {integrity: sha512-Y481sMNZM6rECh9VO4+y26N1lWEDAyxnBZskUf37fl90uHE946VHfmiVQWT0uMFOhyJJFovGTRuF4W82dwewUg==}
+    engines: {node: '>=10'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@swc/core-win32-ia32-msvc@1.15.41':
+    resolution: {integrity: sha512-BAchBD5qeUzy3hiPSLJtaaoSm4blCLyYffOF1bGE4ETcV+OisqjUAwDQMJj++4bTpvMCDzwC+Bj3PmQyBCtscw==}
+    engines: {node: '>=10'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@swc/core-win32-x64-msvc@1.15.41':
+    resolution: {integrity: sha512-WOkA+fJ/ViVBQDsSV9JC52NACTe5PhlurA6viASDZGb7HR3KS01ZG7RZ+Bg6SVQFIoq3gSbTsskQVe6EbHFAYw==}
+    engines: {node: '>=10'}
+    cpu: [x64]
+    os: [win32]
 
-  '@simple-git/args-pathspec@1.0.3':
-    resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==}
+  '@swc/core@1.15.41':
+    resolution: {integrity: sha512-03nQq/082QRJJiOvp3FGbgxTGyyxMxohPTjhk/W9bD2J0tk4ukITI7goOhOO2WbaHn/lsPmo/zf8+DIXhwpgYQ==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@swc/helpers': '>=0.5.17'
+    peerDependenciesMeta:
+      '@swc/helpers':
+        optional: true
 
-  '@simple-git/argv-parser@1.1.1':
-    resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==}
+  '@swc/counter@0.1.3':
+    resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
 
-  '@sinclair/typebox@0.34.41':
-    resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==}
+  '@swc/types@0.1.27':
+    resolution: {integrity: sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==}
 
-  '@stylistic/eslint-plugin@5.4.0':
-    resolution: {integrity: sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      eslint: '>=9.0.0'
+  '@testing-library/dom@10.4.0':
+    resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
+    engines: {node: '>=18'}
 
   '@testing-library/dom@10.4.1':
     resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
     engines: {node: '>=18'}
 
+  '@testing-library/jest-dom@6.5.0':
+    resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==}
+    engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
+
   '@testing-library/jest-dom@6.9.1':
     resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==}
     engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
@@ -3061,6 +3672,12 @@ packages:
       '@types/react-dom':
         optional: true
 
+  '@testing-library/user-event@14.5.2':
+    resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==}
+    engines: {node: '>=12', npm: '>=6'}
+    peerDependencies:
+      '@testing-library/dom': '>=7.21.4'
+
   '@tsconfig/node10@1.0.11':
     resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
 
@@ -3105,6 +3722,9 @@ packages:
   '@types/hast@3.0.4':
     resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
 
+  '@types/html-minifier-terser@6.1.0':
+    resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==}
+
   '@types/istanbul-lib-coverage@2.0.6':
     resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
 
@@ -3123,12 +3743,24 @@ 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/ms@2.1.0':
     resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
 
   '@types/node@24.12.4':
     resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==}
 
+  '@types/parse-json@4.0.2':
+    resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
+  '@types/react@19.2.17':
+    resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==}
+
+  '@types/semver@7.7.1':
+    resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==}
+
   '@types/stack-utils@2.0.3':
     resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
 
@@ -3138,6 +3770,9 @@ packages:
   '@types/unist@3.0.3':
     resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
 
+  '@types/uuid@9.0.8':
+    resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
+
   '@types/webpack@5.28.5':
     resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==}
 
@@ -3456,6 +4091,24 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@vitest/expect@2.0.5':
+    resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==}
+
+  '@vitest/pretty-format@2.0.5':
+    resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==}
+
+  '@vitest/pretty-format@2.1.9':
+    resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==}
+
+  '@vitest/spy@2.0.5':
+    resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
+
+  '@vitest/utils@2.0.5':
+    resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
+
+  '@vitest/utils@2.1.9':
+    resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==}
+
   '@webassemblyjs/ast@1.14.1':
     resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
 
@@ -3536,10 +4189,6 @@ packages:
     resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==}
     engines: {node: ^20.17.0 || >=22.9.0}
 
-  accepts@2.0.0:
-    resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
-    engines: {node: '>= 0.6'}
-
   acorn-import-phases@1.0.4:
     resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==}
     engines: {node: '>=10.13.0'}
@@ -3591,6 +4240,11 @@ packages:
   ajv@8.20.0:
     resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
 
+  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'}
@@ -3611,6 +4265,10 @@ packages:
     resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
     engines: {node: '>=12'}
 
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
   are-docs-informative@0.0.2:
     resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
     engines: {node: '>=14'}
@@ -3652,6 +4310,14 @@ packages:
     resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
     engines: {node: '>= 0.4'}
 
+  assertion-error@2.0.1:
+    resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+    engines: {node: '>=12'}
+
+  ast-types@0.16.1:
+    resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
+    engines: {node: '>=4'}
+
   async-function@1.0.0:
     resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
     engines: {node: '>= 0.4'}
@@ -3722,18 +4388,25 @@ packages:
     resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
     engines: {node: '>= 0.8'}
 
+  better-opn@3.0.2:
+    resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
+    engines: {node: '>=12.0.0'}
+
   bidi-js@1.0.3:
     resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
 
   big.js@5.2.2:
     resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
 
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
   blurhash@2.0.5:
     resolution: {integrity: sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==}
 
-  body-parser@2.2.2:
-    resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==}
-    engines: {node: '>=18'}
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
 
   brace-expansion@1.1.15:
     resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==}
@@ -3749,6 +4422,9 @@ packages:
     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     engines: {node: '>=8'}
 
+  browser-assert@1.2.1:
+    resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==}
+
   browserslist@4.28.2:
     resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==}
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -3757,10 +4433,6 @@ packages:
   buffer-from@1.1.2:
     resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
 
-  bytes@3.1.2:
-    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
-    engines: {node: '>= 0.8'}
-
   cacache@20.0.4:
     resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==}
     engines: {node: ^20.17.0 || >=22.9.0}
@@ -3781,12 +4453,27 @@ packages:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     engines: {node: '>=6'}
 
+  camel-case@4.1.2:
+    resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+
   caniuse-lite@1.0.30001793:
     resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==}
 
+  case-sensitive-paths-webpack-plugin@2.4.0:
+    resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==}
+    engines: {node: '>=4'}
+
   ccount@2.0.1:
     resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
 
+  chai@5.3.3:
+    resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
+    engines: {node: '>=18'}
+
+  chalk@3.0.0:
+    resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
+    engines: {node: '>=8'}
+
   chalk@4.1.2:
     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
     engines: {node: '>=10'}
@@ -3800,6 +4487,14 @@ packages:
   character-entities@2.0.2:
     resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
 
+  check-error@2.1.3:
+    resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==}
+    engines: {node: '>= 16'}
+
+  chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
   chownr@3.0.0:
     resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
     engines: {node: '>=18'}
@@ -3822,12 +4517,19 @@ packages:
     peerDependencies:
       webpack: '>=4.0.1'
 
+  cjs-module-lexer@1.4.3:
+    resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==}
+
   ckeditor5@47.6.2:
     resolution: {integrity: sha512-Ezi+mp/KAAelM8b1P4gbe9xLB6w70MwMQdlj5ZICju++klsbKdPfGM7Ufn0qe1AyEWelTFQQXYZbA+KO/aGxuw==}
 
   ckeditor5@48.1.1:
     resolution: {integrity: sha512-zW6MxvoCeSdWmOlkpq4sUZZujWVKTZ9Y9kBNVUBGuqkf5gaRQq4JqeHIaqra2UYl4Br/7+VxrMWvFiY2SVHM6g==}
 
+  clean-css@5.3.3:
+    resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
+    engines: {node: '>= 10.0'}
+
   cli-cursor@5.0.0:
     resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
     engines: {node: '>=18'}
@@ -3882,6 +4584,10 @@ packages:
   commander@2.20.3:
     resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
 
+  commander@8.3.0:
+    resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+    engines: {node: '>= 12'}
+
   comment-parser@1.4.1:
     resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
     engines: {node: '>= 12.0.0'}
@@ -3892,25 +4598,12 @@ packages:
   concat-map@0.0.1:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
 
-  content-disposition@1.0.0:
-    resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
-    engines: {node: '>= 0.6'}
-
-  content-type@1.0.5:
-    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
-    engines: {node: '>= 0.6'}
+  constants-browserify@1.0.0:
+    resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
 
   convert-source-map@2.0.0:
     resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
 
-  cookie-signature@1.2.2:
-    resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
-    engines: {node: '>=6.6.0'}
-
-  cookie@0.7.2:
-    resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
-    engines: {node: '>= 0.6'}
-
   copyfiles@2.4.1:
     resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==}
     hasBin: true
@@ -3925,6 +4618,10 @@ packages:
     resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==}
     engines: {node: '>= 0.4.0'}
 
+  cosmiconfig@7.1.0:
+    resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+    engines: {node: '>=10'}
+
   cosmiconfig@9.0.0:
     resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
     engines: {node: '>=14'}
@@ -3941,6 +4638,18 @@ packages:
     resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
     engines: {node: '>= 8'}
 
+  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-loader@7.1.4:
     resolution: {integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==}
     engines: {node: '>= 18.12.0'}
@@ -3953,10 +4662,17 @@ packages:
       webpack:
         optional: true
 
+  css-select@4.3.0:
+    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+
   css-tree@3.1.0:
     resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
     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'}
+
   css.escape@1.5.1:
     resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
 
@@ -3969,6 +4685,9 @@ packages:
     resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==}
     engines: {node: '>=20'}
 
+  csstype@3.2.3:
+    resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
   data-urls@6.0.0:
     resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==}
     engines: {node: '>=20'}
@@ -4008,21 +4727,29 @@ packages:
   decode-named-character-reference@1.2.0:
     resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==}
 
+  deep-eql@5.0.2:
+    resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+    engines: {node: '>=6'}
+
   deep-is@0.1.4:
     resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
 
+  deepmerge@4.3.1:
+    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+    engines: {node: '>=0.10.0'}
+
   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-properties@1.2.1:
     resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
     engines: {node: '>= 0.4'}
 
-  depd@2.0.0:
-    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
-    engines: {node: '>= 0.8'}
-
   dequal@2.0.3:
     resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
     engines: {node: '>=6'}
@@ -4048,6 +4775,25 @@ packages:
   dom-accessibility-api@0.6.3:
     resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
 
+  dom-converter@0.2.0:
+    resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==}
+
+  dom-serializer@1.4.1:
+    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+
+  domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+  domhandler@4.3.1:
+    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+    engines: {node: '>= 4'}
+
+  domutils@2.8.0:
+    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+
+  dot-case@3.0.4:
+    resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
   dotenv@16.4.7:
     resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
     engines: {node: '>=12'}
@@ -4056,9 +4802,6 @@ packages:
     resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
     engines: {node: '>= 0.4'}
 
-  ee-first@1.1.1:
-    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
-
   electron-to-chromium@1.5.361:
     resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==}
 
@@ -4072,14 +4815,13 @@ packages:
     resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
     engines: {node: '>= 4'}
 
-  encodeurl@2.0.0:
-    resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
-    engines: {node: '>= 0.8'}
-
   enhanced-resolve@5.21.6:
     resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
     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'}
@@ -4112,6 +4854,9 @@ packages:
     resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
     engines: {node: '>= 0.4'}
 
+  es-module-lexer@1.7.0:
+    resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
   es-module-lexer@2.1.0:
     resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==}
 
@@ -4142,6 +4887,16 @@ packages:
     peerDependencies:
       webpack: ^4.40.0 || ^5.0.0
 
+  esbuild-register@3.6.0:
+    resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
+    peerDependencies:
+      esbuild: '>=0.12 <1'
+
+  esbuild@0.25.12:
+    resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
+    engines: {node: '>=18'}
+    hasBin: true
+
   esbuild@0.27.7:
     resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
     engines: {node: '>=18'}
@@ -4156,9 +4911,6 @@ packages:
     resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
     engines: {node: '>=6'}
 
-  escape-html@1.0.3:
-    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-
   escape-string-regexp@2.0.0:
     resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
     engines: {node: '>=8'}
@@ -4290,6 +5042,11 @@ packages:
     resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  esprima@4.0.1:
+    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+    engines: {node: '>=4'}
+    hasBin: true
+
   esquery@1.6.0:
     resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
     engines: {node: '>=0.10'}
@@ -4306,14 +5063,13 @@ packages:
     resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
     engines: {node: '>=4.0'}
 
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
   esutils@2.0.3:
     resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
     engines: {node: '>=0.10.0'}
 
-  etag@1.8.1:
-    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
-    engines: {node: '>= 0.6'}
-
   eventemitter3@4.0.7:
     resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
 
@@ -4332,10 +5088,6 @@ packages:
   exponential-backoff@3.1.3:
     resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
 
-  express@5.1.0:
-    resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
-    engines: {node: '>= 18'}
-
   extend@3.0.2:
     resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
 
@@ -4382,10 +5134,6 @@ packages:
     resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
     engines: {node: '>=8'}
 
-  finalhandler@2.1.0:
-    resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
-    engines: {node: '>= 0.8'}
-
   find-cache-dir@3.3.2:
     resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
     engines: {node: '>=8'}
@@ -4426,18 +5174,24 @@ packages:
     resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
     engines: {node: '>= 0.4'}
 
-  forwarded@0.2.0:
-    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
-    engines: {node: '>= 0.6'}
+  fork-ts-checker-webpack-plugin@8.0.0:
+    resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==}
+    engines: {node: '>=12.13.0', yarn: '>=1.0.0'}
+    peerDependencies:
+      typescript: '>3.6.0'
+      webpack: ^5.11.0
 
-  fresh@2.0.0:
-    resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
-    engines: {node: '>= 0.8'}
+  fs-extra@10.1.0:
+    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+    engines: {node: '>=12'}
 
   fs-minipass@3.0.3:
     resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==}
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
 
+  fs-monkey@1.1.0:
+    resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==}
+
   fs.realpath@1.0.0:
     resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
 
@@ -4626,16 +5380,41 @@ packages:
     resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
     engines: {node: '>=18'}
 
+  html-entities@2.6.0:
+    resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
+
+  html-loader@3.1.2:
+    resolution: {integrity: sha512-9WQlLiAV5N9fCna4MUmBW/ifaUbuFZ2r7IZmtXzhyfyi4zgPEjXsmsYCKs+yT873MzRj+f1WMjuAiPNA7C6Tcw==}
+    engines: {node: '>= 12.13.0'}
+    peerDependencies:
+      webpack: ^5.0.0
+
+  html-minifier-terser@6.1.0:
+    resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
+    engines: {node: '>=12'}
+    hasBin: true
+
   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
+
+  htmlparser2@6.1.0:
+    resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
+
   http-cache-semantics@4.2.0:
     resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
 
-  http-errors@2.0.1:
-    resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
-    engines: {node: '>= 0.8'}
-
   http-proxy-agent@7.0.2:
     resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
     engines: {node: '>= 14'}
@@ -4723,9 +5502,9 @@ packages:
     resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==}
     engines: {node: '>= 12'}
 
-  ipaddr.js@1.9.1:
-    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
-    engines: {node: '>= 0.10'}
+  is-arguments@1.2.0:
+    resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+    engines: {node: '>= 0.4'}
 
   is-array-buffer@3.0.5:
     resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
@@ -4742,6 +5521,10 @@ packages:
     resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
     engines: {node: '>= 0.4'}
 
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
   is-boolean-object@1.2.2:
     resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
     engines: {node: '>= 0.4'}
@@ -4765,6 +5548,11 @@ packages:
     resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
     engines: {node: '>= 0.4'}
 
+  is-docker@2.2.1:
+    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+    engines: {node: '>=8'}
+    hasBin: true
+
   is-extglob@2.1.1:
     resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
     engines: {node: '>=0.10.0'}
@@ -4816,9 +5604,6 @@ packages:
   is-potential-custom-element-name@1.0.1:
     resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
 
-  is-promise@4.0.0:
-    resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
-
   is-regex@1.2.1:
     resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
     engines: {node: '>= 0.4'}
@@ -4859,6 +5644,10 @@ packages:
     resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
     engines: {node: '>= 0.4'}
 
+  is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
+
   isarray@0.0.1:
     resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
 
@@ -4921,6 +5710,10 @@ packages:
     resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
     hasBin: true
 
+  jsdoc-type-pratt-parser@4.8.0:
+    resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==}
+    engines: {node: '>=12.0.0'}
+
   jsdoc-type-pratt-parser@5.1.1:
     resolution: {integrity: sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==}
     engines: {node: '>=12.0.0'}
@@ -4967,6 +5760,9 @@ packages:
     engines: {node: '>=6'}
     hasBin: true
 
+  jsonfile@6.2.1:
+    resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
+
   jsonparse@1.3.1:
     resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
     engines: {'0': node >= 0.2.0}
@@ -5090,6 +5886,12 @@ packages:
   longest-streak@3.1.0:
     resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
 
+  loupe@3.2.1:
+    resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
+
+  lower-case@2.0.2:
+    resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
   lru-cache@11.2.2:
     resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==}
     engines: {node: 20 || >=22}
@@ -5104,6 +5906,9 @@ packages:
     resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
     hasBin: true
 
+  magic-string@0.30.21:
+    resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
   make-dir@3.1.0:
     resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
     engines: {node: '>=8'}
@@ -5115,6 +5920,9 @@ packages:
     resolution: {integrity: sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==}
     engines: {node: ^20.17.0 || >=22.9.0}
 
+  map-or-similar@1.5.0:
+    resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==}
+
   markdown-it@14.1.1:
     resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==}
     hasBin: true
@@ -5171,13 +5979,12 @@ packages:
   mdurl@2.0.0:
     resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
 
-  media-typer@1.1.0:
-    resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
-    engines: {node: '>= 0.8'}
+  memfs@3.5.3:
+    resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
+    engines: {node: '>= 4.0.0'}
 
-  merge-descriptors@2.0.0:
-    resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
-    engines: {node: '>=18'}
+  memoizerific@1.11.3:
+    resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==}
 
   merge-stream@2.0.0:
     resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -5274,12 +6081,16 @@ packages:
     resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
     engines: {node: '>=8.6'}
 
+  mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
   mime-db@1.54.0:
     resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
     engines: {node: '>= 0.6'}
 
-  mime-types@3.0.1:
-    resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
+  mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
     engines: {node: '>= 0.6'}
 
   mime@1.6.0:
@@ -5383,6 +6194,12 @@ packages:
   neo-async@2.6.2:
     resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
 
+  no-case@3.0.4:
+    resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+  node-abort-controller@3.1.1:
+    resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+
   node-esapi@0.0.1:
     resolution: {integrity: sha512-lT0ci+q4WvJgu+TxJyjSCKiQFUtMNgluxzTq0lbvGCxdgZcllaE0xl5HFuAbqtHdZxIeVzbXgDVP/0aQL8h1pA==}
 
@@ -5403,6 +6220,10 @@ packages:
     engines: {node: ^20.17.0 || >=22.9.0}
     hasBin: true
 
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
   npm-bundled@5.0.0:
     resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==}
     engines: {node: ^20.17.0 || >=22.9.0}
@@ -5435,6 +6256,9 @@ packages:
     resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
     engines: {node: '>=8'}
 
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
   object-inspect@1.13.4:
     resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
     engines: {node: '>= 0.4'}
@@ -5459,10 +6283,6 @@ packages:
     resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
     engines: {node: '>= 0.4'}
 
-  on-finished@2.4.1:
-    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
-    engines: {node: '>= 0.8'}
-
   once@1.4.0:
     resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
 
@@ -5474,6 +6294,10 @@ packages:
     resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
     engines: {node: '>=18'}
 
+  open@8.4.2:
+    resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+    engines: {node: '>=12'}
+
   opener@1.5.2:
     resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
     hasBin: true
@@ -5522,6 +6346,9 @@ packages:
     engines: {node: ^20.17.0 || >=22.9.0}
     hasBin: true
 
+  param-case@3.0.4:
+    resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+
   parent-module@1.0.1:
     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
     engines: {node: '>=6'}
@@ -5536,12 +6363,17 @@ packages:
   parse-statements@1.0.11:
     resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==}
 
+  parse5@6.0.1:
+    resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+
   parse5@7.3.0:
     resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
 
-  parseurl@1.3.3:
-    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
-    engines: {node: '>= 0.8'}
+  pascal-case@3.1.2:
+    resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+
+  path-browserify@1.0.1:
+    resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
 
   path-exists@4.0.0:
     resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
@@ -5570,8 +6402,13 @@ packages:
     resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
     engines: {node: 18 || 20 || >=22}
 
-  path-to-regexp@8.4.2:
-    resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
+  path-type@4.0.0:
+    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+    engines: {node: '>=8'}
+
+  pathval@2.0.1:
+    resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
+    engines: {node: '>= 14.16'}
 
   picocolors@1.1.1:
     resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -5608,6 +6445,10 @@ packages:
   pofile@1.1.4:
     resolution: {integrity: sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==}
 
+  polished@4.3.1:
+    resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==}
+    engines: {node: '>=10'}
+
   portfinder@1.0.32:
     resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==}
     engines: {node: '>= 0.12.0'}
@@ -5677,6 +6518,9 @@ packages:
     engines: {node: '>=14'}
     hasBin: true
 
+  pretty-error@4.0.0:
+    resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
+
   pretty-format@27.5.1:
     resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
     engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
@@ -5692,17 +6536,20 @@ packages:
   process-nextick-args@2.0.1:
     resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
 
+  process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+
   property-information@7.1.0:
     resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
 
-  proxy-addr@2.0.7:
-    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
-    engines: {node: '>= 0.10'}
-
   punycode.js@2.3.1:
     resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
     engines: {node: '>=6'}
 
+  punycode@1.4.1:
+    resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+
   punycode@2.3.1:
     resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
     engines: {node: '>=6'}
@@ -5718,10 +6565,6 @@ packages:
     resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
     engines: {node: '>= 0.6'}
 
-  raw-body@3.0.2:
-    resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
-    engines: {node: '>= 0.10'}
-
   raw-loader@4.0.2:
     resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==}
     engines: {node: '>= 10.13.0'}
@@ -5765,6 +6608,14 @@ packages:
     resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
     engines: {node: '>= 6'}
 
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  recast@0.23.11:
+    resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==}
+    engines: {node: '>= 4'}
+
   rechoir@0.8.0:
     resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==}
     engines: {node: '>= 10.13.0'}
@@ -5811,6 +6662,10 @@ packages:
   rehype-remark@10.0.1:
     resolution: {integrity: sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==}
 
+  relateurl@0.2.7:
+    resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
+    engines: {node: '>= 0.10'}
+
   remark-breaks@4.0.0:
     resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==}
 
@@ -5826,6 +6681,9 @@ packages:
   remark-stringify@11.0.0:
     resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
 
+  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'}
@@ -5874,10 +6732,6 @@ packages:
     engines: {node: 20 || >=22}
     hasBin: true
 
-  router@2.2.0:
-    resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
-    engines: {node: '>= 18'}
-
   rrweb-cssom@0.8.0:
     resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
 
@@ -5939,14 +6793,6 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
-  send@1.2.0:
-    resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
-    engines: {node: '>= 18'}
-
-  serve-static@2.2.0:
-    resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
-    engines: {node: '>= 18'}
-
   set-function-length@1.2.2:
     resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
     engines: {node: '>= 0.4'}
@@ -5959,9 +6805,6 @@ packages:
     resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
     engines: {node: '>= 0.4'}
 
-  setprototypeof@1.2.0:
-    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
-
   shallow-clone@3.0.1:
     resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
     engines: {node: '>=8'}
@@ -6071,14 +6914,19 @@ packages:
     resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
     engines: {node: '>=10'}
 
-  statuses@2.0.2:
-    resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
-    engines: {node: '>= 0.8'}
-
   stop-iteration-iterator@1.1.0:
     resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
     engines: {node: '>= 0.4'}
 
+  storybook@8.6.18:
+    resolution: {integrity: sha512-p8seiSI6FiVY6P3V0pG+5v7c8pDMehMAFRWEhG5XqIBSQszzOjDnW2rNvm3odoLKfo3V3P6Cs6Hv9ILzymULyQ==}
+    hasBin: true
+    peerDependencies:
+      prettier: ^2 || ^3
+    peerDependenciesMeta:
+      prettier:
+        optional: true
+
   string-width@4.2.3:
     resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
     engines: {node: '>=8'}
@@ -6135,6 +6983,12 @@ packages:
     resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
     engines: {node: '>=8'}
 
+  style-loader@3.3.4:
+    resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==}
+    engines: {node: '>= 12.13.0'}
+    peerDependencies:
+      webpack: ^5.0.0
+
   style-loader@4.0.0:
     resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==}
     engines: {node: '>= 18.12.0'}
@@ -6153,6 +7007,12 @@ packages:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
 
+  swc-loader@0.2.7:
+    resolution: {integrity: sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==}
+    peerDependencies:
+      '@swc/core': ^1.2.147
+      webpack: '>=2'
+
   symbol-tree@3.2.4:
     resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
 
@@ -6222,10 +7082,21 @@ packages:
   through2@4.0.2:
     resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
 
+  tiny-invariant@1.3.3:
+    resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
   tinyglobby@0.2.16:
     resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
     engines: {node: '>=12.0.0'}
 
+  tinyrainbow@1.2.0:
+    resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
+    engines: {node: '>=14.0.0'}
+
+  tinyspy@3.0.2:
+    resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+    engines: {node: '>=14.0.0'}
+
   tldts-core@7.0.17:
     resolution: {integrity: sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==}
 
@@ -6237,10 +7108,6 @@ packages:
     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
     engines: {node: '>=8.0'}
 
-  toidentifier@1.0.1:
-    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
-    engines: {node: '>=0.6'}
-
   tough-cookie@6.0.0:
     resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==}
     engines: {node: '>=16'}
@@ -6264,6 +7131,10 @@ packages:
     peerDependencies:
       typescript: '>=4.8.4'
 
+  ts-dedent@2.3.0:
+    resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==}
+    engines: {node: '>=6.10'}
+
   ts-node@10.9.2:
     resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
     hasBin: true
@@ -6297,10 +7168,6 @@ packages:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
     engines: {node: '>= 0.8.0'}
 
-  type-is@2.0.1:
-    resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
-    engines: {node: '>= 0.6'}
-
   typed-array-buffer@1.0.3:
     resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
     engines: {node: '>= 0.4'}
@@ -6396,9 +7263,13 @@ packages:
   unist-util-visit@5.0.0:
     resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
 
-  unpipe@1.0.0:
-    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
-    engines: {node: '>= 0.8'}
+  universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  unplugin@1.16.1:
+    resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
+    engines: {node: '>=14.0.0'}
 
   unrs-resolver@1.12.2:
     resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==}
@@ -6423,9 +7294,24 @@ packages:
   url-join@4.0.1:
     resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==}
 
+  url@0.11.4:
+    resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
+    engines: {node: '>= 0.4'}
+
   util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
 
+  util@0.12.5:
+    resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+
+  utila@0.4.0:
+    resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==}
+
+  uuid@9.0.1:
+    resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+    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
+
   v8-compile-cache-lib@3.0.1:
     resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
 
@@ -6440,10 +7326,6 @@ packages:
   vanilla-colorful@0.7.2:
     resolution: {integrity: sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==}
 
-  vary@1.1.2:
-    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
-    engines: {node: '>= 0.8'}
-
   vfile-message@4.0.3:
     resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
 
@@ -6474,11 +7356,23 @@ packages:
       webpack-bundle-analyzer: '*'
       webpack-dev-server: '*'
     peerDependenciesMeta:
-      webpack-bundle-analyzer:
-        optional: true
-      webpack-dev-server:
+      webpack-bundle-analyzer:
+        optional: true
+      webpack-dev-server:
+        optional: true
+
+  webpack-dev-middleware@6.1.3:
+    resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==}
+    engines: {node: '>= 14.15.0'}
+    peerDependencies:
+      webpack: ^5.0.0
+    peerDependenciesMeta:
+      webpack:
         optional: true
 
+  webpack-hot-middleware@2.26.1:
+    resolution: {integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==}
+
   webpack-merge@6.0.1:
     resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==}
     engines: {node: '>=18.0.0'}
@@ -6487,6 +7381,9 @@ packages:
     resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==}
     engines: {node: '>=10.13.0'}
 
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
   webpack@5.107.1:
     resolution: {integrity: sha512-mvdIWxj/H6QsfgDdH9djne3a5dYcmEmtsXGESkypaGN5jXjF/b+9KDlmTDQ2TKlFUeA2fI9Y65kihD30JOdB+Q==}
     engines: {node: '>=10.13.0'}
@@ -6604,6 +7501,10 @@ packages:
     resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
     engines: {node: '>=18'}
 
+  yaml@1.10.3:
+    resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==}
+    engines: {node: '>= 6'}
+
   yaml@2.9.0:
     resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
     engines: {node: '>= 14.6'}
@@ -7970,6 +8871,8 @@ snapshots:
       '@ckeditor/ckeditor5-ui': 47.6.2
       '@ckeditor/ckeditor5-utils': 47.6.2
       ckeditor5: 47.6.2
+    transitivePeerDependencies:
+      - supports-color
 
   '@ckeditor/ckeditor5-highlight@48.1.1':
     dependencies:
@@ -7987,6 +8890,8 @@ snapshots:
       '@ckeditor/ckeditor5-utils': 47.6.2
       '@ckeditor/ckeditor5-widget': 47.6.2
       ckeditor5: 47.6.2
+    transitivePeerDependencies:
+      - supports-color
 
   '@ckeditor/ckeditor5-horizontal-line@48.1.1':
     dependencies:
@@ -8005,8 +8910,6 @@ snapshots:
       '@ckeditor/ckeditor5-utils': 47.6.2
       '@ckeditor/ckeditor5-widget': 47.6.2
       ckeditor5: 47.6.2
-    transitivePeerDependencies:
-      - supports-color
 
   '@ckeditor/ckeditor5-html-embed@48.1.1':
     dependencies:
@@ -8094,6 +8997,8 @@ snapshots:
       '@ckeditor/ckeditor5-ui': 47.6.2
       '@ckeditor/ckeditor5-utils': 47.6.2
       ckeditor5: 47.6.2
+    transitivePeerDependencies:
+      - supports-color
 
   '@ckeditor/ckeditor5-indent@48.1.1':
     dependencies:
@@ -8114,6 +9019,8 @@ snapshots:
       '@ckeditor/ckeditor5-ui': 47.6.2
       '@ckeditor/ckeditor5-utils': 47.6.2
       ckeditor5: 47.6.2
+    transitivePeerDependencies:
+      - supports-color
 
   '@ckeditor/ckeditor5-language@48.1.1':
     dependencies:
@@ -8165,6 +9072,8 @@ snapshots:
       '@ckeditor/ckeditor5-utils': 47.6.2
       ckeditor5: 47.6.2
       es-toolkit: 1.39.5
+    transitivePeerDependencies:
+      - supports-color
 
   '@ckeditor/ckeditor5-list@48.1.1':
     dependencies:
@@ -8622,11 +9531,11 @@ snapshots:
       '@ckeditor/ckeditor5-utils': 48.1.1
       es-toolkit: 1.45.1
 
-  '@coremedia-internal/studio-client.test-runner-helper@1.1.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+  '@coremedia-internal/studio-client.test-runner-helper@1.1.1(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
     dependencies:
       '@testing-library/dom': 10.4.1
       '@testing-library/jest-dom': 6.9.1
-      '@testing-library/react': 16.3.2(@testing-library/dom@10.4.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+      '@testing-library/react': 16.3.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       expect: 30.4.1
       react-intersection-observer: 9.16.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
       tsx: 4.22.4
@@ -8651,6 +9560,41 @@ snapshots:
       semver: 7.8.1
       yargs: 18.0.0
 
+  '@coremedia/studio-client.build-config@1.2.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/preset-env': 7.29.7(@babel/core@7.29.7)
+      '@babel/preset-typescript': 7.28.5(@babel/core@7.29.7)
+      babel-loader: 8.4.1(@babel/core@7.29.7)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      babel-plugin-transform-import-meta: 2.3.3(@babel/core@7.29.7)
+      css-loader: 7.1.4(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      find-up: 5.0.0
+      js-yaml: 4.1.1
+      json5: 2.2.3
+      semver: 7.8.1
+      source-map-loader: 4.0.2(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      terser: 5.48.0
+      terser-webpack-plugin: 5.6.0(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      yargs: 17.7.2
+    optionalDependencies:
+      postcss: 8.5.15
+      typescript: 5.9.3
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+    transitivePeerDependencies:
+      - '@minify-html/node'
+      - '@rspack/core'
+      - '@swc/core'
+      - '@swc/css'
+      - '@swc/html'
+      - clean-css
+      - cssnano
+      - csso
+      - esbuild
+      - html-minifier-terser
+      - lightningcss
+      - supports-color
+      - uglify-js
+
   '@coremedia/studio-client.build-config@1.2.1(postcss@8.5.15)(typescript@5.9.3)(webpack@5.107.1(postcss@8.5.15))':
     dependencies:
       '@babel/core': 7.29.7
@@ -8759,156 +9703,234 @@ snapshots:
       esquery: 1.6.0
       jsdoc-type-pratt-parser: 5.1.1
 
+  '@esbuild/aix-ppc64@0.25.12':
+    optional: true
+
   '@esbuild/aix-ppc64@0.27.7':
     optional: true
 
   '@esbuild/aix-ppc64@0.28.0':
     optional: true
 
+  '@esbuild/android-arm64@0.25.12':
+    optional: true
+
   '@esbuild/android-arm64@0.27.7':
     optional: true
 
   '@esbuild/android-arm64@0.28.0':
     optional: true
 
+  '@esbuild/android-arm@0.25.12':
+    optional: true
+
   '@esbuild/android-arm@0.27.7':
     optional: true
 
   '@esbuild/android-arm@0.28.0':
     optional: true
 
+  '@esbuild/android-x64@0.25.12':
+    optional: true
+
   '@esbuild/android-x64@0.27.7':
     optional: true
 
   '@esbuild/android-x64@0.28.0':
     optional: true
 
+  '@esbuild/darwin-arm64@0.25.12':
+    optional: true
+
   '@esbuild/darwin-arm64@0.27.7':
     optional: true
 
   '@esbuild/darwin-arm64@0.28.0':
     optional: true
 
+  '@esbuild/darwin-x64@0.25.12':
+    optional: true
+
   '@esbuild/darwin-x64@0.27.7':
     optional: true
 
   '@esbuild/darwin-x64@0.28.0':
     optional: true
 
+  '@esbuild/freebsd-arm64@0.25.12':
+    optional: true
+
   '@esbuild/freebsd-arm64@0.27.7':
     optional: true
 
   '@esbuild/freebsd-arm64@0.28.0':
     optional: true
 
+  '@esbuild/freebsd-x64@0.25.12':
+    optional: true
+
   '@esbuild/freebsd-x64@0.27.7':
     optional: true
 
   '@esbuild/freebsd-x64@0.28.0':
     optional: true
 
+  '@esbuild/linux-arm64@0.25.12':
+    optional: true
+
   '@esbuild/linux-arm64@0.27.7':
     optional: true
 
   '@esbuild/linux-arm64@0.28.0':
     optional: true
 
+  '@esbuild/linux-arm@0.25.12':
+    optional: true
+
   '@esbuild/linux-arm@0.27.7':
     optional: true
 
   '@esbuild/linux-arm@0.28.0':
     optional: true
 
+  '@esbuild/linux-ia32@0.25.12':
+    optional: true
+
   '@esbuild/linux-ia32@0.27.7':
     optional: true
 
   '@esbuild/linux-ia32@0.28.0':
     optional: true
 
+  '@esbuild/linux-loong64@0.25.12':
+    optional: true
+
   '@esbuild/linux-loong64@0.27.7':
     optional: true
 
   '@esbuild/linux-loong64@0.28.0':
     optional: true
 
+  '@esbuild/linux-mips64el@0.25.12':
+    optional: true
+
   '@esbuild/linux-mips64el@0.27.7':
     optional: true
 
   '@esbuild/linux-mips64el@0.28.0':
     optional: true
 
+  '@esbuild/linux-ppc64@0.25.12':
+    optional: true
+
   '@esbuild/linux-ppc64@0.27.7':
     optional: true
 
   '@esbuild/linux-ppc64@0.28.0':
     optional: true
 
+  '@esbuild/linux-riscv64@0.25.12':
+    optional: true
+
   '@esbuild/linux-riscv64@0.27.7':
     optional: true
 
   '@esbuild/linux-riscv64@0.28.0':
     optional: true
 
+  '@esbuild/linux-s390x@0.25.12':
+    optional: true
+
   '@esbuild/linux-s390x@0.27.7':
     optional: true
 
   '@esbuild/linux-s390x@0.28.0':
     optional: true
 
+  '@esbuild/linux-x64@0.25.12':
+    optional: true
+
   '@esbuild/linux-x64@0.27.7':
     optional: true
 
   '@esbuild/linux-x64@0.28.0':
     optional: true
 
+  '@esbuild/netbsd-arm64@0.25.12':
+    optional: true
+
   '@esbuild/netbsd-arm64@0.27.7':
     optional: true
 
   '@esbuild/netbsd-arm64@0.28.0':
     optional: true
 
+  '@esbuild/netbsd-x64@0.25.12':
+    optional: true
+
   '@esbuild/netbsd-x64@0.27.7':
     optional: true
 
   '@esbuild/netbsd-x64@0.28.0':
     optional: true
 
+  '@esbuild/openbsd-arm64@0.25.12':
+    optional: true
+
   '@esbuild/openbsd-arm64@0.27.7':
     optional: true
 
   '@esbuild/openbsd-arm64@0.28.0':
     optional: true
 
+  '@esbuild/openbsd-x64@0.25.12':
+    optional: true
+
   '@esbuild/openbsd-x64@0.27.7':
     optional: true
 
   '@esbuild/openbsd-x64@0.28.0':
     optional: true
 
+  '@esbuild/openharmony-arm64@0.25.12':
+    optional: true
+
   '@esbuild/openharmony-arm64@0.27.7':
     optional: true
 
   '@esbuild/openharmony-arm64@0.28.0':
     optional: true
 
+  '@esbuild/sunos-x64@0.25.12':
+    optional: true
+
   '@esbuild/sunos-x64@0.27.7':
     optional: true
 
   '@esbuild/sunos-x64@0.28.0':
     optional: true
 
+  '@esbuild/win32-arm64@0.25.12':
+    optional: true
+
   '@esbuild/win32-arm64@0.27.7':
     optional: true
 
   '@esbuild/win32-arm64@0.28.0':
     optional: true
 
+  '@esbuild/win32-ia32@0.25.12':
+    optional: true
+
   '@esbuild/win32-ia32@0.27.7':
     optional: true
 
   '@esbuild/win32-ia32@0.28.0':
     optional: true
 
+  '@esbuild/win32-x64@0.25.12':
+    optional: true
+
   '@esbuild/win32-x64@0.27.7':
     optional: true
 
@@ -9047,6 +10069,8 @@ snapshots:
 
   '@jridgewell/sourcemap-codec@1.5.0': {}
 
+  '@jridgewell/sourcemap-codec@1.5.5': {}
+
   '@jridgewell/trace-mapping@0.3.31':
     dependencies:
       '@jridgewell/resolve-uri': 3.1.2
@@ -9065,6 +10089,12 @@ snapshots:
 
   '@kwsites/promise-deferred@1.1.1': {}
 
+  '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.0)':
+    dependencies:
+      '@types/mdx': 2.0.14
+      '@types/react': 19.2.17
+      react: 19.2.0
+
   '@microsoft/tsdoc-config@0.18.1':
     dependencies:
       '@microsoft/tsdoc': 0.16.0
@@ -9177,45 +10207,369 @@ snapshots:
 
   '@shikijs/vscode-textmate@10.0.2': {}
 
-  '@sigstore/bundle@4.0.0':
+  '@sigstore/bundle@4.0.0':
+    dependencies:
+      '@sigstore/protobuf-specs': 0.5.1
+
+  '@sigstore/core@3.2.0': {}
+
+  '@sigstore/protobuf-specs@0.5.1': {}
+
+  '@sigstore/sign@4.1.1':
+    dependencies:
+      '@gar/promise-retry': 1.0.3
+      '@sigstore/bundle': 4.0.0
+      '@sigstore/core': 3.2.0
+      '@sigstore/protobuf-specs': 0.5.1
+      make-fetch-happen: 15.0.5
+      proc-log: 6.1.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@sigstore/tuf@4.0.2':
+    dependencies:
+      '@sigstore/protobuf-specs': 0.5.1
+      tuf-js: 4.1.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@sigstore/verify@3.1.0':
+    dependencies:
+      '@sigstore/bundle': 4.0.0
+      '@sigstore/core': 3.2.0
+      '@sigstore/protobuf-specs': 0.5.1
+
+  '@simple-git/args-pathspec@1.0.3': {}
+
+  '@simple-git/argv-parser@1.1.1':
+    dependencies:
+      '@simple-git/args-pathspec': 1.0.3
+
+  '@sinclair/typebox@0.34.41': {}
+
+  '@storybook/addon-actions@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@types/uuid': 9.0.8
+      dequal: 2.0.3
+      polished: 4.3.1
+      storybook: 8.6.18(prettier@3.8.3)
+      uuid: 9.0.1
+
+  '@storybook/addon-backgrounds@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      memoizerific: 1.11.3
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+
+  '@storybook/addon-controls@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      dequal: 2.0.3
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+
+  '@storybook/addon-docs@8.6.14(@types/react@19.2.17)(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.0)
+      '@storybook/blocks': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/csf-plugin': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/react-dom-shim': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@8.6.18(prettier@3.8.3))
+      react: 19.2.0
+      react-dom: 19.2.0(react@19.2.0)
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+    transitivePeerDependencies:
+      - '@types/react'
+
+  '@storybook/addon-essentials@8.6.14(@types/react@19.2.17)(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/addon-actions': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-backgrounds': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-controls': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-docs': 8.6.14(@types/react@19.2.17)(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-highlight': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-measure': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-outline': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-toolbars': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/addon-viewport': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+    transitivePeerDependencies:
+      - '@types/react'
+
+  '@storybook/addon-highlight@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      storybook: 8.6.18(prettier@3.8.3)
+
+  '@storybook/addon-interactions@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@storybook/instrumenter': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/test': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      polished: 4.3.1
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+
+  '@storybook/addon-measure@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      storybook: 8.6.18(prettier@3.8.3)
+      tiny-invariant: 1.3.3
+
+  '@storybook/addon-outline@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+
+  '@storybook/addon-toolbars@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      storybook: 8.6.18(prettier@3.8.3)
+
+  '@storybook/addon-viewport@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      memoizerific: 1.11.3
+      storybook: 8.6.18(prettier@3.8.3)
+
+  '@storybook/addon-webpack5-compiler-swc@2.1.0(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))':
+    dependencies:
+      '@swc/core': 1.15.41
+      swc-loader: 0.2.7(@swc/core@1.15.41)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+    transitivePeerDependencies:
+      - '@swc/helpers'
+      - webpack
+
+  '@storybook/blocks@8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/icons': 1.6.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+    optionalDependencies:
+      react: 19.2.0
+      react-dom: 19.2.0(react@19.2.0)
+
+  '@storybook/builder-webpack5@8.6.14(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(storybook@8.6.18(prettier@3.8.3))(typescript@5.9.3)':
+    dependencies:
+      '@storybook/core-webpack': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@types/semver': 7.7.1
+      browser-assert: 1.2.1
+      case-sensitive-paths-webpack-plugin: 2.4.0
+      cjs-module-lexer: 1.4.3
+      constants-browserify: 1.0.0
+      css-loader: 6.11.0(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      es-module-lexer: 1.7.0
+      fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      html-webpack-plugin: 5.6.7(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      magic-string: 0.30.21
+      path-browserify: 1.0.1
+      process: 0.11.10
+      semver: 7.8.1
+      storybook: 8.6.18(prettier@3.8.3)
+      style-loader: 3.3.4(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      terser-webpack-plugin: 5.6.0(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      ts-dedent: 2.3.0
+      url: 0.11.4
+      util: 0.12.5
+      util-deprecate: 1.0.2
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+      webpack-dev-middleware: 6.1.3(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      webpack-hot-middleware: 2.26.1
+      webpack-virtual-modules: 0.6.2
+    optionalDependencies:
+      typescript: 5.9.3
+    transitivePeerDependencies:
+      - '@minify-html/node'
+      - '@rspack/core'
+      - '@swc/core'
+      - '@swc/css'
+      - '@swc/html'
+      - clean-css
+      - cssnano
+      - csso
+      - esbuild
+      - html-minifier-terser
+      - lightningcss
+      - postcss
+      - uglify-js
+      - webpack-cli
+
+  '@storybook/components@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      storybook: 8.6.18(prettier@3.8.3)
+
+  '@storybook/components@8.6.18(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      storybook: 8.6.18(prettier@3.8.3)
+
+  '@storybook/core-webpack@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+
+  '@storybook/core@8.6.18(prettier@3.8.3)(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/theming': 8.6.18(storybook@8.6.18(prettier@3.8.3))
+      better-opn: 3.0.2
+      browser-assert: 1.2.1
+      esbuild: 0.25.12
+      esbuild-register: 3.6.0(esbuild@0.25.12)
+      jsdoc-type-pratt-parser: 4.8.0
+      process: 0.11.10
+      recast: 0.23.11
+      semver: 7.8.1
+      util: 0.12.5
+      ws: 8.20.1
+    optionalDependencies:
+      prettier: 3.8.3
+    transitivePeerDependencies:
+      - bufferutil
+      - storybook
+      - supports-color
+      - utf-8-validate
+
+  '@storybook/csf-plugin@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      storybook: 8.6.18(prettier@3.8.3)
+      unplugin: 1.16.1
+
+  '@storybook/global@5.0.0': {}
+
+  '@storybook/html-webpack5@8.6.14(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(storybook@8.6.18(prettier@3.8.3))(typescript@5.9.3)':
+    dependencies:
+      '@storybook/builder-webpack5': 8.6.14(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(storybook@8.6.18(prettier@3.8.3))(typescript@5.9.3)
+      '@storybook/global': 5.0.0
+      '@storybook/html': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/preset-html-webpack': 8.6.14(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(storybook@8.6.18(prettier@3.8.3))
+      storybook: 8.6.18(prettier@3.8.3)
+    transitivePeerDependencies:
+      - '@minify-html/node'
+      - '@rspack/core'
+      - '@swc/core'
+      - '@swc/css'
+      - '@swc/html'
+      - clean-css
+      - cssnano
+      - csso
+      - esbuild
+      - html-minifier-terser
+      - lightningcss
+      - postcss
+      - typescript
+      - uglify-js
+      - webpack-cli
+
+  '@storybook/html@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/components': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/global': 5.0.0
+      '@storybook/manager-api': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/preview-api': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/theming': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+
+  '@storybook/html@8.6.18(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/components': 8.6.18(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/global': 5.0.0
+      '@storybook/manager-api': 8.6.18(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/preview-api': 8.6.18(storybook@8.6.18(prettier@3.8.3))
+      '@storybook/theming': 8.6.18(storybook@8.6.18(prettier@3.8.3))
+      storybook: 8.6.18(prettier@3.8.3)
+      ts-dedent: 2.3.0
+
+  '@storybook/icons@1.6.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+    dependencies:
+      react: 19.2.0
+      react-dom: 19.2.0(react@19.2.0)
+
+  '@storybook/instrumenter@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@vitest/utils': 2.1.9
+      storybook: 8.6.18(prettier@3.8.3)
+
+  '@storybook/instrumenter@8.6.15(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@vitest/utils': 2.1.9
+      storybook: 8.6.18(prettier@3.8.3)
+
+  '@storybook/manager-api@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      storybook: 8.6.18(prettier@3.8.3)
+
+  '@storybook/manager-api@8.6.18(storybook@8.6.18(prettier@3.8.3))':
     dependencies:
-      '@sigstore/protobuf-specs': 0.5.1
+      storybook: 8.6.18(prettier@3.8.3)
 
-  '@sigstore/core@3.2.0': {}
+  '@storybook/preset-html-webpack@8.6.14(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/core-webpack': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      html-loader: 3.1.2(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      storybook: 8.6.18(prettier@3.8.3)
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+    transitivePeerDependencies:
+      - '@minify-html/node'
+      - '@swc/core'
+      - '@swc/css'
+      - '@swc/html'
+      - clean-css
+      - cssnano
+      - csso
+      - esbuild
+      - html-minifier-terser
+      - lightningcss
+      - postcss
+      - uglify-js
+      - webpack-cli
 
-  '@sigstore/protobuf-specs@0.5.1': {}
+  '@storybook/preview-api@8.6.14(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      storybook: 8.6.18(prettier@3.8.3)
 
-  '@sigstore/sign@4.1.1':
+  '@storybook/preview-api@8.6.18(storybook@8.6.18(prettier@3.8.3))':
     dependencies:
-      '@gar/promise-retry': 1.0.3
-      '@sigstore/bundle': 4.0.0
-      '@sigstore/core': 3.2.0
-      '@sigstore/protobuf-specs': 0.5.1
-      make-fetch-happen: 15.0.5
-      proc-log: 6.1.0
-    transitivePeerDependencies:
-      - supports-color
+      storybook: 8.6.18(prettier@3.8.3)
 
-  '@sigstore/tuf@4.0.2':
+  '@storybook/react-dom-shim@8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@8.6.18(prettier@3.8.3))':
     dependencies:
-      '@sigstore/protobuf-specs': 0.5.1
-      tuf-js: 4.1.0
-    transitivePeerDependencies:
-      - supports-color
+      react: 19.2.0
+      react-dom: 19.2.0(react@19.2.0)
+      storybook: 8.6.18(prettier@3.8.3)
 
-  '@sigstore/verify@3.1.0':
+  '@storybook/test@8.6.14(storybook@8.6.18(prettier@3.8.3))':
     dependencies:
-      '@sigstore/bundle': 4.0.0
-      '@sigstore/core': 3.2.0
-      '@sigstore/protobuf-specs': 0.5.1
+      '@storybook/global': 5.0.0
+      '@storybook/instrumenter': 8.6.14(storybook@8.6.18(prettier@3.8.3))
+      '@testing-library/dom': 10.4.0
+      '@testing-library/jest-dom': 6.5.0
+      '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0)
+      '@vitest/expect': 2.0.5
+      '@vitest/spy': 2.0.5
+      storybook: 8.6.18(prettier@3.8.3)
 
-  '@simple-git/args-pathspec@1.0.3': {}
+  '@storybook/test@8.6.15(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@storybook/instrumenter': 8.6.15(storybook@8.6.18(prettier@3.8.3))
+      '@testing-library/dom': 10.4.0
+      '@testing-library/jest-dom': 6.5.0
+      '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0)
+      '@vitest/expect': 2.0.5
+      '@vitest/spy': 2.0.5
+      storybook: 8.6.18(prettier@3.8.3)
 
-  '@simple-git/argv-parser@1.1.1':
+  '@storybook/theming@8.6.14(storybook@8.6.18(prettier@3.8.3))':
     dependencies:
-      '@simple-git/args-pathspec': 1.0.3
+      storybook: 8.6.18(prettier@3.8.3)
 
-  '@sinclair/typebox@0.34.41': {}
+  '@storybook/theming@8.6.18(storybook@8.6.18(prettier@3.8.3))':
+    dependencies:
+      storybook: 8.6.18(prettier@3.8.3)
 
   '@stylistic/eslint-plugin@5.4.0(eslint@9.39.4(jiti@1.21.6))':
     dependencies:
@@ -9227,6 +10581,77 @@ snapshots:
       estraverse: 5.3.0
       picomatch: 4.0.4
 
+  '@swc/core-darwin-arm64@1.15.41':
+    optional: true
+
+  '@swc/core-darwin-x64@1.15.41':
+    optional: true
+
+  '@swc/core-linux-arm-gnueabihf@1.15.41':
+    optional: true
+
+  '@swc/core-linux-arm64-gnu@1.15.41':
+    optional: true
+
+  '@swc/core-linux-arm64-musl@1.15.41':
+    optional: true
+
+  '@swc/core-linux-ppc64-gnu@1.15.41':
+    optional: true
+
+  '@swc/core-linux-s390x-gnu@1.15.41':
+    optional: true
+
+  '@swc/core-linux-x64-gnu@1.15.41':
+    optional: true
+
+  '@swc/core-linux-x64-musl@1.15.41':
+    optional: true
+
+  '@swc/core-win32-arm64-msvc@1.15.41':
+    optional: true
+
+  '@swc/core-win32-ia32-msvc@1.15.41':
+    optional: true
+
+  '@swc/core-win32-x64-msvc@1.15.41':
+    optional: true
+
+  '@swc/core@1.15.41':
+    dependencies:
+      '@swc/counter': 0.1.3
+      '@swc/types': 0.1.27
+    optionalDependencies:
+      '@swc/core-darwin-arm64': 1.15.41
+      '@swc/core-darwin-x64': 1.15.41
+      '@swc/core-linux-arm-gnueabihf': 1.15.41
+      '@swc/core-linux-arm64-gnu': 1.15.41
+      '@swc/core-linux-arm64-musl': 1.15.41
+      '@swc/core-linux-ppc64-gnu': 1.15.41
+      '@swc/core-linux-s390x-gnu': 1.15.41
+      '@swc/core-linux-x64-gnu': 1.15.41
+      '@swc/core-linux-x64-musl': 1.15.41
+      '@swc/core-win32-arm64-msvc': 1.15.41
+      '@swc/core-win32-ia32-msvc': 1.15.41
+      '@swc/core-win32-x64-msvc': 1.15.41
+
+  '@swc/counter@0.1.3': {}
+
+  '@swc/types@0.1.27':
+    dependencies:
+      '@swc/counter': 0.1.3
+
+  '@testing-library/dom@10.4.0':
+    dependencies:
+      '@babel/code-frame': 7.29.7
+      '@babel/runtime': 7.29.2
+      '@types/aria-query': 5.0.4
+      aria-query: 5.3.0
+      chalk: 4.1.2
+      dom-accessibility-api: 0.5.16
+      lz-string: 1.5.0
+      pretty-format: 27.5.1
+
   '@testing-library/dom@10.4.1':
     dependencies:
       '@babel/code-frame': 7.29.7
@@ -9238,6 +10663,16 @@ snapshots:
       picocolors: 1.1.1
       pretty-format: 27.5.1
 
+  '@testing-library/jest-dom@6.5.0':
+    dependencies:
+      '@adobe/css-tools': 4.4.4
+      aria-query: 5.3.2
+      chalk: 3.0.0
+      css.escape: 1.5.1
+      dom-accessibility-api: 0.6.3
+      lodash: 4.18.1
+      redent: 3.0.0
+
   '@testing-library/jest-dom@6.9.1':
     dependencies:
       '@adobe/css-tools': 4.4.4
@@ -9247,12 +10682,18 @@ snapshots:
       picocolors: 1.1.1
       redent: 3.0.0
 
-  '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+  '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
     dependencies:
       '@babel/runtime': 7.29.2
       '@testing-library/dom': 10.4.1
       react: 19.2.0
       react-dom: 19.2.0(react@19.2.0)
+    optionalDependencies:
+      '@types/react': 19.2.17
+
+  '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)':
+    dependencies:
+      '@testing-library/dom': 10.4.0
 
   '@tsconfig/node10@1.0.11': {}
 
@@ -9297,6 +10738,8 @@ snapshots:
     dependencies:
       '@types/unist': 3.0.3
 
+  '@types/html-minifier-terser@6.1.0': {}
+
   '@types/istanbul-lib-coverage@2.0.6': {}
 
   '@types/istanbul-lib-report@3.0.3':
@@ -9315,12 +10758,22 @@ snapshots:
     dependencies:
       '@types/unist': 3.0.3
 
+  '@types/mdx@2.0.14': {}
+
   '@types/ms@2.1.0': {}
 
   '@types/node@24.12.4':
     dependencies:
       undici-types: 7.16.0
 
+  '@types/parse-json@4.0.2': {}
+
+  '@types/react@19.2.17':
+    dependencies:
+      csstype: 3.2.3
+
+  '@types/semver@7.7.1': {}
+
   '@types/stack-utils@2.0.3': {}
 
   '@types/through2@2.0.41':
@@ -9329,11 +10782,13 @@ snapshots:
 
   '@types/unist@3.0.3': {}
 
-  '@types/webpack@5.28.5(postcss@8.5.15)':
+  '@types/uuid@9.0.8': {}
+
+  '@types/webpack@5.28.5(@swc/core@1.15.41)(postcss@8.5.15)':
     dependencies:
       '@types/node': 24.12.4
       tapable: 2.3.3
-      webpack: 5.107.1(postcss@8.5.15)
+      webpack: 5.107.1(@swc/core@1.15.41)(postcss@8.5.15)
     transitivePeerDependencies:
       - '@minify-html/node'
       - '@swc/core'
@@ -9581,7 +11036,7 @@ snapshots:
 
   '@typescript-eslint/utils@8.44.0(eslint@9.39.4(jiti@1.21.6))(typescript@5.9.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.4(jiti@1.21.6))
+      '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.6))
       '@typescript-eslint/scope-manager': 8.44.0
       '@typescript-eslint/types': 8.44.0
       '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.3)
@@ -9704,6 +11159,38 @@ snapshots:
   '@unrs/resolver-binding-win32-x64-msvc@1.12.2':
     optional: true
 
+  '@vitest/expect@2.0.5':
+    dependencies:
+      '@vitest/spy': 2.0.5
+      '@vitest/utils': 2.0.5
+      chai: 5.3.3
+      tinyrainbow: 1.2.0
+
+  '@vitest/pretty-format@2.0.5':
+    dependencies:
+      tinyrainbow: 1.2.0
+
+  '@vitest/pretty-format@2.1.9':
+    dependencies:
+      tinyrainbow: 1.2.0
+
+  '@vitest/spy@2.0.5':
+    dependencies:
+      tinyspy: 3.0.2
+
+  '@vitest/utils@2.0.5':
+    dependencies:
+      '@vitest/pretty-format': 2.0.5
+      estree-walker: 3.0.3
+      loupe: 3.2.1
+      tinyrainbow: 1.2.0
+
+  '@vitest/utils@2.1.9':
+    dependencies:
+      '@vitest/pretty-format': 2.1.9
+      loupe: 3.2.1
+      tinyrainbow: 1.2.0
+
   '@webassemblyjs/ast@1.14.1':
     dependencies:
       '@webassemblyjs/helper-numbers': 1.13.2
@@ -9801,11 +11288,6 @@ snapshots:
 
   abbrev@4.0.0: {}
 
-  accepts@2.0.0:
-    dependencies:
-      mime-types: 3.0.1
-      negotiator: 1.0.0
-
   acorn-import-phases@1.0.4(acorn@8.16.0):
     dependencies:
       acorn: 8.16.0
@@ -9856,6 +11338,8 @@ snapshots:
       json-schema-traverse: 1.0.0
       require-from-string: 2.0.2
 
+  ansi-html-community@0.0.8: {}
+
   ansi-regex@5.0.1: {}
 
   ansi-regex@6.2.2: {}
@@ -9868,6 +11352,11 @@ snapshots:
 
   ansi-styles@6.2.3: {}
 
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.2
+
   are-docs-informative@0.0.2: {}
 
   arg@4.1.3: {}
@@ -9930,6 +11419,12 @@ snapshots:
       get-intrinsic: 1.3.0
       is-array-buffer: 3.0.5
 
+  assertion-error@2.0.1: {}
+
+  ast-types@0.16.1:
+    dependencies:
+      tslib: 2.8.1
+
   async-function@1.0.0: {}
 
   async@2.6.4:
@@ -9947,6 +11442,15 @@ snapshots:
     optionalDependencies:
       webpack: 5.107.1(postcss@8.5.15)(webpack-cli@6.0.1)
 
+  babel-loader@8.4.1(@babel/core@7.29.7)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      '@babel/core': 7.29.7
+      find-cache-dir: 3.3.2
+      loader-utils: 2.0.4
+      make-dir: 3.1.0
+      schema-utils: 2.7.1
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
   babel-loader@8.4.1(@babel/core@7.29.7)(webpack@5.107.1(postcss@8.5.15)):
     dependencies:
       '@babel/core': 7.29.7
@@ -9998,27 +11502,21 @@ snapshots:
     dependencies:
       safe-buffer: 5.1.2
 
+  better-opn@3.0.2:
+    dependencies:
+      open: 8.4.2
+
   bidi-js@1.0.3:
     dependencies:
       require-from-string: 2.0.2
 
   big.js@5.2.2: {}
 
+  binary-extensions@2.3.0: {}
+
   blurhash@2.0.5: {}
 
-  body-parser@2.2.2:
-    dependencies:
-      bytes: 3.1.2
-      content-type: 1.0.5
-      debug: 4.4.3
-      http-errors: 2.0.1
-      iconv-lite: 0.7.2
-      on-finished: 2.4.1
-      qs: 6.15.2
-      raw-body: 3.0.2
-      type-is: 2.0.1
-    transitivePeerDependencies:
-      - supports-color
+  boolbase@1.0.0: {}
 
   brace-expansion@1.1.15:
     dependencies:
@@ -10037,6 +11535,8 @@ snapshots:
     dependencies:
       fill-range: 7.1.1
 
+  browser-assert@1.2.1: {}
+
   browserslist@4.28.2:
     dependencies:
       baseline-browser-mapping: 2.10.31
@@ -10047,8 +11547,6 @@ snapshots:
 
   buffer-from@1.1.2: {}
 
-  bytes@3.1.2: {}
-
   cacache@20.0.4:
     dependencies:
       '@npmcli/fs': 5.0.0
@@ -10081,10 +11579,30 @@ snapshots:
 
   callsites@3.1.0: {}
 
+  camel-case@4.1.2:
+    dependencies:
+      pascal-case: 3.1.2
+      tslib: 2.8.1
+
   caniuse-lite@1.0.30001793: {}
 
+  case-sensitive-paths-webpack-plugin@2.4.0: {}
+
   ccount@2.0.1: {}
 
+  chai@5.3.3:
+    dependencies:
+      assertion-error: 2.0.1
+      check-error: 2.1.3
+      deep-eql: 5.0.2
+      loupe: 3.2.1
+      pathval: 2.0.1
+
+  chalk@3.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
   chalk@4.1.2:
     dependencies:
       ansi-styles: 4.3.0
@@ -10096,6 +11614,20 @@ snapshots:
 
   character-entities@2.0.2: {}
 
+  check-error@2.1.3: {}
+
+  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
+
   chownr@3.0.0: {}
 
   chrome-trace-event@1.0.4: {}
@@ -10108,6 +11640,8 @@ snapshots:
     dependencies:
       webpack: 5.107.1(postcss@8.5.15)(webpack-cli@6.0.1)
 
+  cjs-module-lexer@1.4.3: {}
+
   ckeditor5@47.6.2:
     dependencies:
       '@ckeditor/ckeditor5-adapter-ckfinder': 47.6.2
@@ -10239,6 +11773,10 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  clean-css@5.3.3:
+    dependencies:
+      source-map: 0.6.1
+
   cli-cursor@5.0.0:
     dependencies:
       restore-cursor: 5.1.0
@@ -10293,24 +11831,18 @@ snapshots:
 
   commander@2.20.3: {}
 
+  commander@8.3.0: {}
+
   comment-parser@1.4.1: {}
 
   commondir@1.0.1: {}
 
   concat-map@0.0.1: {}
 
-  content-disposition@1.0.0:
-    dependencies:
-      safe-buffer: 5.2.1
-
-  content-type@1.0.5: {}
+  constants-browserify@1.0.0: {}
 
   convert-source-map@2.0.0: {}
 
-  cookie-signature@1.2.2: {}
-
-  cookie@0.7.2: {}
-
   copyfiles@2.4.1:
     dependencies:
       glob: 7.2.3
@@ -10329,6 +11861,14 @@ snapshots:
 
   corser@2.0.1: {}
 
+  cosmiconfig@7.1.0:
+    dependencies:
+      '@types/parse-json': 4.0.2
+      import-fresh: 3.3.0
+      parse-json: 5.2.0
+      path-type: 4.0.0
+      yaml: 1.10.3
+
   cosmiconfig@9.0.0(typescript@5.9.3):
     dependencies:
       env-paths: 2.2.1
@@ -10346,6 +11886,32 @@ snapshots:
       shebang-command: 2.0.0
       which: 2.0.2
 
+  css-loader@6.11.0(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.5.15)
+      postcss: 8.5.15
+      postcss-modules-extract-imports: 3.1.0(postcss@8.5.15)
+      postcss-modules-local-by-default: 4.0.5(postcss@8.5.15)
+      postcss-modules-scope: 3.2.0(postcss@8.5.15)
+      postcss-modules-values: 4.0.0(postcss@8.5.15)
+      postcss-value-parser: 4.2.0
+      semver: 7.8.1
+    optionalDependencies:
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
+  css-loader@7.1.4(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.5.15)
+      postcss: 8.5.15
+      postcss-modules-extract-imports: 3.1.0(postcss@8.5.15)
+      postcss-modules-local-by-default: 4.0.5(postcss@8.5.15)
+      postcss-modules-scope: 3.2.0(postcss@8.5.15)
+      postcss-modules-values: 4.0.0(postcss@8.5.15)
+      postcss-value-parser: 4.2.0
+      semver: 7.8.1
+    optionalDependencies:
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
   css-loader@7.1.4(webpack@5.107.1(postcss@8.5.15)):
     dependencies:
       icss-utils: 5.1.0(postcss@8.5.15)
@@ -10372,11 +11938,21 @@ snapshots:
     optionalDependencies:
       webpack: 5.107.1(postcss@8.5.15)(webpack-cli@6.0.1)
 
+  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-tree@3.1.0:
     dependencies:
       mdn-data: 2.12.2
       source-map-js: 1.2.1
 
+  css-what@6.2.2: {}
+
   css.escape@1.5.1: {}
 
   cssesc@3.0.0: {}
@@ -10389,6 +11965,8 @@ snapshots:
     transitivePeerDependencies:
       - postcss
 
+  csstype@3.2.3: {}
+
   data-urls@6.0.0:
     dependencies:
       whatwg-mimetype: 4.0.0
@@ -10426,22 +12004,26 @@ snapshots:
     dependencies:
       character-entities: 2.0.2
 
+  deep-eql@5.0.2: {}
+
   deep-is@0.1.4: {}
 
+  deepmerge@4.3.1: {}
+
   define-data-property@1.1.4:
     dependencies:
       es-define-property: 1.0.1
       es-errors: 1.3.0
       gopd: 1.2.0
 
+  define-lazy-prop@2.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
 
-  depd@2.0.0: {}
-
   dequal@2.0.3: {}
 
   detect-libc@2.1.2: {}
@@ -10460,6 +12042,33 @@ snapshots:
 
   dom-accessibility-api@0.6.3: {}
 
+  dom-converter@0.2.0:
+    dependencies:
+      utila: 0.4.0
+
+  dom-serializer@1.4.1:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+      entities: 2.2.0
+
+  domelementtype@2.3.0: {}
+
+  domhandler@4.3.1:
+    dependencies:
+      domelementtype: 2.3.0
+
+  domutils@2.8.0:
+    dependencies:
+      dom-serializer: 1.4.1
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+
+  dot-case@3.0.4:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+
   dotenv@16.4.7: {}
 
   dunder-proto@1.0.1:
@@ -10468,8 +12077,6 @@ snapshots:
       es-errors: 1.3.0
       gopd: 1.2.0
 
-  ee-first@1.1.1: {}
-
   electron-to-chromium@1.5.361: {}
 
   emoji-regex@10.6.0: {}
@@ -10478,13 +12085,13 @@ snapshots:
 
   emojis-list@3.0.0: {}
 
-  encodeurl@2.0.0: {}
-
   enhanced-resolve@5.21.6:
     dependencies:
       graceful-fs: 4.2.11
       tapable: 2.3.3
 
+  entities@2.2.0: {}
+
   entities@4.5.0: {}
 
   entities@6.0.1: {}
@@ -10558,6 +12165,8 @@ snapshots:
 
   es-errors@1.3.0: {}
 
+  es-module-lexer@1.7.0: {}
+
   es-module-lexer@2.1.0: {}
 
   es-object-atoms@1.1.1:
@@ -10593,6 +12202,42 @@ snapshots:
       webpack: 5.107.1(postcss@8.5.15)(webpack-cli@6.0.1)
       webpack-sources: 3.4.1
 
+  esbuild-register@3.6.0(esbuild@0.25.12):
+    dependencies:
+      debug: 4.4.3
+      esbuild: 0.25.12
+    transitivePeerDependencies:
+      - supports-color
+
+  esbuild@0.25.12:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.25.12
+      '@esbuild/android-arm': 0.25.12
+      '@esbuild/android-arm64': 0.25.12
+      '@esbuild/android-x64': 0.25.12
+      '@esbuild/darwin-arm64': 0.25.12
+      '@esbuild/darwin-x64': 0.25.12
+      '@esbuild/freebsd-arm64': 0.25.12
+      '@esbuild/freebsd-x64': 0.25.12
+      '@esbuild/linux-arm': 0.25.12
+      '@esbuild/linux-arm64': 0.25.12
+      '@esbuild/linux-ia32': 0.25.12
+      '@esbuild/linux-loong64': 0.25.12
+      '@esbuild/linux-mips64el': 0.25.12
+      '@esbuild/linux-ppc64': 0.25.12
+      '@esbuild/linux-riscv64': 0.25.12
+      '@esbuild/linux-s390x': 0.25.12
+      '@esbuild/linux-x64': 0.25.12
+      '@esbuild/netbsd-arm64': 0.25.12
+      '@esbuild/netbsd-x64': 0.25.12
+      '@esbuild/openbsd-arm64': 0.25.12
+      '@esbuild/openbsd-x64': 0.25.12
+      '@esbuild/openharmony-arm64': 0.25.12
+      '@esbuild/sunos-x64': 0.25.12
+      '@esbuild/win32-arm64': 0.25.12
+      '@esbuild/win32-ia32': 0.25.12
+      '@esbuild/win32-x64': 0.25.12
+
   esbuild@0.27.7:
     optionalDependencies:
       '@esbuild/aix-ppc64': 0.27.7
@@ -10653,8 +12298,6 @@ snapshots:
 
   escalade@3.2.0: {}
 
-  escape-html@1.0.3: {}
-
   escape-string-regexp@2.0.0: {}
 
   escape-string-regexp@4.0.0: {}
@@ -10828,7 +12471,7 @@ snapshots:
 
   eslint@9.39.4(jiti@1.21.6):
     dependencies:
-      '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.4(jiti@1.21.6))
+      '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.6))
       '@eslint-community/regexpp': 4.12.1
       '@eslint/config-array': 0.21.2
       '@eslint/config-helpers': 0.4.2
@@ -10873,6 +12516,8 @@ snapshots:
       acorn-jsx: 5.3.2(acorn@8.16.0)
       eslint-visitor-keys: 4.2.1
 
+  esprima@4.0.1: {}
+
   esquery@1.6.0:
     dependencies:
       estraverse: 5.3.0
@@ -10885,9 +12530,11 @@ snapshots:
 
   estraverse@5.3.0: {}
 
-  esutils@2.0.3: {}
+  estree-walker@3.0.3:
+    dependencies:
+      '@types/estree': 1.0.8
 
-  etag@1.8.1: {}
+  esutils@2.0.3: {}
 
   eventemitter3@4.0.7: {}
 
@@ -10916,38 +12563,6 @@ snapshots:
 
   exponential-backoff@3.1.3: {}
 
-  express@5.1.0:
-    dependencies:
-      accepts: 2.0.0
-      body-parser: 2.2.2
-      content-disposition: 1.0.0
-      content-type: 1.0.5
-      cookie: 0.7.2
-      cookie-signature: 1.2.2
-      debug: 4.4.3
-      encodeurl: 2.0.0
-      escape-html: 1.0.3
-      etag: 1.8.1
-      finalhandler: 2.1.0
-      fresh: 2.0.0
-      http-errors: 2.0.1
-      merge-descriptors: 2.0.0
-      mime-types: 3.0.1
-      on-finished: 2.4.1
-      once: 1.4.0
-      parseurl: 1.3.3
-      proxy-addr: 2.0.7
-      qs: 6.15.2
-      range-parser: 1.2.1
-      router: 2.2.0
-      send: 1.2.0
-      serve-static: 2.2.0
-      statuses: 2.0.2
-      type-is: 2.0.1
-      vary: 1.1.2
-    transitivePeerDependencies:
-      - supports-color
-
   extend@3.0.2: {}
 
   fast-deep-equal@3.1.3: {}
@@ -10983,19 +12598,8 @@ snapshots:
       flat-cache: 4.0.1
 
   fill-range@7.1.1:
-    dependencies:
-      to-regex-range: 5.0.1
-
-  finalhandler@2.1.0:
-    dependencies:
-      debug: 4.4.3
-      encodeurl: 2.0.0
-      escape-html: 1.0.3
-      on-finished: 2.4.1
-      parseurl: 1.3.3
-      statuses: 2.0.2
-    transitivePeerDependencies:
-      - supports-color
+    dependencies:
+      to-regex-range: 5.0.1
 
   find-cache-dir@3.3.2:
     dependencies:
@@ -11030,14 +12634,35 @@ snapshots:
     dependencies:
       is-callable: 1.2.7
 
-  forwarded@0.2.0: {}
+  fork-ts-checker-webpack-plugin@8.0.0(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      '@babel/code-frame': 7.29.7
+      chalk: 4.1.2
+      chokidar: 3.6.0
+      cosmiconfig: 7.1.0
+      deepmerge: 4.3.1
+      fs-extra: 10.1.0
+      memfs: 3.5.3
+      minimatch: 3.1.5
+      node-abort-controller: 3.1.1
+      schema-utils: 3.3.0
+      semver: 7.8.1
+      tapable: 2.3.3
+      typescript: 5.9.3
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
 
-  fresh@2.0.0: {}
+  fs-extra@10.1.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.2.1
+      universalify: 2.0.1
 
   fs-minipass@3.0.3:
     dependencies:
       minipass: 7.1.3
 
+  fs-monkey@1.1.0: {}
+
   fs.realpath@1.0.0: {}
 
   fsevents@2.3.2:
@@ -11276,17 +12901,44 @@ snapshots:
     dependencies:
       whatwg-encoding: 3.1.1
 
+  html-entities@2.6.0: {}
+
+  html-loader@3.1.2(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      html-minifier-terser: 6.1.0
+      parse5: 6.0.1
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
+  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.48.0
+
   html-void-elements@3.0.0: {}
 
-  http-cache-semantics@4.2.0: {}
+  html-webpack-plugin@5.6.7(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    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:
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
 
-  http-errors@2.0.1:
+  htmlparser2@6.1.0:
     dependencies:
-      depd: 2.0.0
-      inherits: 2.0.4
-      setprototypeof: 1.2.0
-      statuses: 2.0.2
-      toidentifier: 1.0.1
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+      domutils: 2.8.0
+      entities: 2.2.0
+
+  http-cache-semantics@4.2.0: {}
 
   http-proxy-agent@7.0.2:
     dependencies:
@@ -11338,6 +12990,7 @@ snapshots:
   iconv-lite@0.7.2:
     dependencies:
       safer-buffer: 2.1.2
+    optional: true
 
   icss-utils@5.1.0(postcss@8.5.15):
     dependencies:
@@ -11384,7 +13037,10 @@ snapshots:
 
   ip-address@10.2.0: {}
 
-  ipaddr.js@1.9.1: {}
+  is-arguments@1.2.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
 
   is-array-buffer@3.0.5:
     dependencies:
@@ -11406,6 +13062,10 @@ snapshots:
     dependencies:
       has-bigints: 1.0.2
 
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
   is-boolean-object@1.2.2:
     dependencies:
       call-bound: 1.0.4
@@ -11432,6 +13092,8 @@ snapshots:
       call-bound: 1.0.4
       has-tostringtag: 1.0.2
 
+  is-docker@2.2.1: {}
+
   is-extglob@2.1.1: {}
 
   is-finalizationregistry@1.1.1:
@@ -11473,8 +13135,6 @@ snapshots:
 
   is-potential-custom-element-name@1.0.1: {}
 
-  is-promise@4.0.0: {}
-
   is-regex@1.2.1:
     dependencies:
       call-bound: 1.0.4
@@ -11516,6 +13176,10 @@ snapshots:
       call-bound: 1.0.4
       get-intrinsic: 1.3.0
 
+  is-wsl@2.2.0:
+    dependencies:
+      is-docker: 2.2.1
+
   isarray@0.0.1: {}
 
   isarray@1.0.0: {}
@@ -11588,6 +13252,8 @@ snapshots:
     dependencies:
       argparse: 2.0.1
 
+  jsdoc-type-pratt-parser@4.8.0: {}
+
   jsdoc-type-pratt-parser@5.1.1: {}
 
   jsdom@27.0.0(postcss@8.5.15):
@@ -11638,6 +13304,12 @@ snapshots:
 
   json5@2.2.3: {}
 
+  jsonfile@6.2.1:
+    dependencies:
+      universalify: 2.0.1
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
   jsonparse@1.3.1: {}
 
   keyv@4.5.4:
@@ -11730,6 +13402,12 @@ snapshots:
 
   longest-streak@3.1.0: {}
 
+  loupe@3.2.1: {}
+
+  lower-case@2.0.2:
+    dependencies:
+      tslib: 2.8.1
+
   lru-cache@11.2.2: {}
 
   lru-cache@5.1.1:
@@ -11740,6 +13418,10 @@ snapshots:
 
   lz-string@1.5.0: {}
 
+  magic-string@0.30.21:
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.5
+
   make-dir@3.1.0:
     dependencies:
       semver: 6.3.1
@@ -11763,6 +13445,8 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  map-or-similar@1.5.0: {}
+
   markdown-it@14.1.1:
     dependencies:
       argparse: 2.0.1
@@ -11899,9 +13583,13 @@ snapshots:
 
   mdurl@2.0.0: {}
 
-  media-typer@1.1.0: {}
+  memfs@3.5.3:
+    dependencies:
+      fs-monkey: 1.1.0
 
-  merge-descriptors@2.0.0: {}
+  memoizerific@1.11.3:
+    dependencies:
+      map-or-similar: 1.5.0
 
   merge-stream@2.0.0: {}
 
@@ -12103,11 +13791,13 @@ snapshots:
       braces: 3.0.3
       picomatch: 2.3.2
 
+  mime-db@1.52.0: {}
+
   mime-db@1.54.0: {}
 
-  mime-types@3.0.1:
+  mime-types@2.1.35:
     dependencies:
-      mime-db: 1.54.0
+      mime-db: 1.52.0
 
   mime@1.6.0: {}
 
@@ -12189,6 +13879,13 @@ snapshots:
 
   neo-async@2.6.2: {}
 
+  no-case@3.0.4:
+    dependencies:
+      lower-case: 2.0.2
+      tslib: 2.8.1
+
+  node-abort-controller@3.1.1: {}
+
   node-esapi@0.0.1: {}
 
   node-gyp@12.3.0:
@@ -12215,6 +13912,8 @@ snapshots:
     dependencies:
       abbrev: 4.0.0
 
+  normalize-path@3.0.0: {}
+
   npm-bundled@5.0.0:
     dependencies:
       npm-normalize-package-bin: 5.0.0
@@ -12261,6 +13960,10 @@ snapshots:
     dependencies:
       path-key: 3.1.1
 
+  nth-check@2.1.1:
+    dependencies:
+      boolbase: 1.0.0
+
   object-inspect@1.13.4: {}
 
   object-keys@1.1.1: {}
@@ -12294,10 +13997,6 @@ snapshots:
       define-properties: 1.2.1
       es-object-atoms: 1.1.1
 
-  on-finished@2.4.1:
-    dependencies:
-      ee-first: 1.1.1
-
   once@1.4.0:
     dependencies:
       wrappy: 1.0.2
@@ -12310,6 +14009,12 @@ snapshots:
     dependencies:
       mimic-function: 5.0.1
 
+  open@8.4.2:
+    dependencies:
+      define-lazy-prop: 2.0.0
+      is-docker: 2.2.1
+      is-wsl: 2.2.0
+
   opener@1.5.2: {}
 
   optionator@0.9.4:
@@ -12375,6 +14080,11 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  param-case@3.0.4:
+    dependencies:
+      dot-case: 3.0.4
+      tslib: 2.8.1
+
   parent-module@1.0.1:
     dependencies:
       callsites: 3.1.0
@@ -12392,11 +14102,18 @@ snapshots:
 
   parse-statements@1.0.11: {}
 
+  parse5@6.0.1: {}
+
   parse5@7.3.0:
     dependencies:
       entities: 6.0.1
 
-  parseurl@1.3.3: {}
+  pascal-case@3.1.2:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+
+  path-browserify@1.0.1: {}
 
   path-exists@4.0.0: {}
 
@@ -12417,7 +14134,9 @@ snapshots:
       lru-cache: 11.2.2
       minipass: 7.1.3
 
-  path-to-regexp@8.4.2: {}
+  path-type@4.0.0: {}
+
+  pathval@2.0.1: {}
 
   picocolors@1.1.1: {}
 
@@ -12445,6 +14164,10 @@ snapshots:
 
   pofile@1.1.4: {}
 
+  polished@4.3.1:
+    dependencies:
+      '@babel/runtime': 7.29.2
+
   portfinder@1.0.32:
     dependencies:
       async: 2.6.4
@@ -12508,6 +14231,11 @@ snapshots:
 
   prettier@3.8.3: {}
 
+  pretty-error@4.0.0:
+    dependencies:
+      lodash: 4.18.1
+      renderkid: 3.0.0
+
   pretty-format@27.5.1:
     dependencies:
       ansi-regex: 5.0.1
@@ -12525,15 +14253,14 @@ snapshots:
 
   process-nextick-args@2.0.1: {}
 
-  property-information@7.1.0: {}
+  process@0.11.10: {}
 
-  proxy-addr@2.0.7:
-    dependencies:
-      forwarded: 0.2.0
-      ipaddr.js: 1.9.1
+  property-information@7.1.0: {}
 
   punycode.js@2.3.1: {}
 
+  punycode@1.4.1: {}
+
   punycode@2.3.1: {}
 
   qs@6.15.2:
@@ -12544,13 +14271,6 @@ snapshots:
 
   range-parser@1.2.1: {}
 
-  raw-body@3.0.2:
-    dependencies:
-      bytes: 3.1.2
-      http-errors: 2.0.1
-      iconv-lite: 0.7.2
-      unpipe: 1.0.0
-
   raw-loader@4.0.2(webpack@5.107.1):
     dependencies:
       loader-utils: 2.0.4
@@ -12599,6 +14319,18 @@ snapshots:
       string_decoder: 1.3.0
       util-deprecate: 1.0.2
 
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.2
+
+  recast@0.23.11:
+    dependencies:
+      ast-types: 0.16.1
+      esprima: 4.0.1
+      source-map: 0.6.1
+      tiny-invariant: 1.3.3
+      tslib: 2.8.1
+
   rechoir@0.8.0:
     dependencies:
       resolve: 1.22.12
@@ -12674,6 +14406,8 @@ snapshots:
       unified: 11.0.5
       vfile: 6.0.3
 
+  relateurl@0.2.7: {}
+
   remark-breaks@4.0.0:
     dependencies:
       '@types/mdast': 4.0.4
@@ -12714,6 +14448,14 @@ snapshots:
       mdast-util-to-markdown: 2.1.2
       unified: 11.0.5
 
+  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: {}
@@ -12753,16 +14495,6 @@ snapshots:
       glob: 13.0.6
       package-json-from-dist: 1.0.1
 
-  router@2.2.0:
-    dependencies:
-      debug: 4.4.3
-      depd: 2.0.0
-      is-promise: 4.0.0
-      parseurl: 1.3.3
-      path-to-regexp: 8.4.2
-    transitivePeerDependencies:
-      - supports-color
-
   rrweb-cssom@0.8.0: {}
 
   run-parallel@1.2.0:
@@ -12829,31 +14561,6 @@ snapshots:
 
   semver@7.8.1: {}
 
-  send@1.2.0:
-    dependencies:
-      debug: 4.4.3
-      encodeurl: 2.0.0
-      escape-html: 1.0.3
-      etag: 1.8.1
-      fresh: 2.0.0
-      http-errors: 2.0.1
-      mime-types: 3.0.1
-      ms: 2.1.3
-      on-finished: 2.4.1
-      range-parser: 1.2.1
-      statuses: 2.0.2
-    transitivePeerDependencies:
-      - supports-color
-
-  serve-static@2.2.0:
-    dependencies:
-      encodeurl: 2.0.0
-      escape-html: 1.0.3
-      parseurl: 1.3.3
-      send: 1.2.0
-    transitivePeerDependencies:
-      - supports-color
-
   set-function-length@1.2.2:
     dependencies:
       define-data-property: 1.1.4
@@ -12876,8 +14583,6 @@ snapshots:
       es-errors: 1.3.0
       es-object-atoms: 1.1.1
 
-  setprototypeof@1.2.0: {}
-
   shallow-clone@3.0.1:
     dependencies:
       kind-of: 6.0.3
@@ -12965,6 +14670,12 @@ snapshots:
 
   source-map-js@1.2.1: {}
 
+  source-map-loader@4.0.2(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      iconv-lite: 0.6.3
+      source-map-js: 1.2.1
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
   source-map-loader@4.0.2(webpack@5.107.1(postcss@8.5.15)):
     dependencies:
       iconv-lite: 0.6.3
@@ -13005,13 +14716,21 @@ snapshots:
     dependencies:
       escape-string-regexp: 2.0.0
 
-  statuses@2.0.2: {}
-
   stop-iteration-iterator@1.1.0:
     dependencies:
       es-errors: 1.3.0
       internal-slot: 1.1.0
 
+  storybook@8.6.18(prettier@3.8.3):
+    dependencies:
+      '@storybook/core': 8.6.18(prettier@3.8.3)(storybook@8.6.18(prettier@3.8.3))
+    optionalDependencies:
+      prettier: 3.8.3
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
   string-width@4.2.3:
     dependencies:
       emoji-regex: 8.0.0
@@ -13080,6 +14799,10 @@ snapshots:
 
   strip-json-comments@3.1.1: {}
 
+  style-loader@3.3.4(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
   style-loader@4.0.0(webpack@5.107.1):
     dependencies:
       webpack: 5.107.1(postcss@8.5.15)(webpack-cli@6.0.1)
@@ -13094,6 +14817,12 @@ snapshots:
 
   supports-preserve-symlinks-flag@1.0.0: {}
 
+  swc-loader@0.2.7(@swc/core@1.15.41)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      '@swc/core': 1.15.41
+      '@swc/counter': 0.1.3
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
   symbol-tree@3.2.4: {}
 
   synckit@0.11.13:
@@ -13110,6 +14839,29 @@ snapshots:
       minizlib: 3.1.0
       yallist: 5.0.0
 
+  terser-webpack-plugin@5.6.0(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.31
+      jest-worker: 27.5.1
+      schema-utils: 4.3.3
+      terser: 5.48.0
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+    optionalDependencies:
+      '@swc/core': 1.15.41
+      esbuild: 0.25.12
+      postcss: 8.5.15
+
+  terser-webpack-plugin@5.6.0(@swc/core@1.15.41)(postcss@8.5.15)(webpack@5.107.1(@swc/core@1.15.41)(postcss@8.5.15)):
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.31
+      jest-worker: 27.5.1
+      schema-utils: 4.3.3
+      terser: 5.48.0
+      webpack: 5.107.1(@swc/core@1.15.41)(postcss@8.5.15)
+    optionalDependencies:
+      '@swc/core': 1.15.41
+      postcss: 8.5.15
+
   terser-webpack-plugin@5.6.0(postcss@8.5.15)(webpack@5.107.1(postcss@8.5.15)):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.31
@@ -13146,11 +14898,17 @@ snapshots:
     dependencies:
       readable-stream: 3.6.2
 
+  tiny-invariant@1.3.3: {}
+
   tinyglobby@0.2.16:
     dependencies:
       fdir: 6.5.0(picomatch@4.0.4)
       picomatch: 4.0.4
 
+  tinyrainbow@1.2.0: {}
+
+  tinyspy@3.0.2: {}
+
   tldts-core@7.0.17: {}
 
   tldts@7.0.17:
@@ -13161,8 +14919,6 @@ snapshots:
     dependencies:
       is-number: 7.0.0
 
-  toidentifier@1.0.1: {}
-
   tough-cookie@6.0.0:
     dependencies:
       tldts: 7.0.17
@@ -13181,7 +14937,9 @@ snapshots:
     dependencies:
       typescript: 5.9.3
 
-  ts-node@10.9.2(@types/node@24.12.4)(typescript@5.9.3):
+  ts-dedent@2.3.0: {}
+
+  ts-node@10.9.2(@swc/core@1.15.41)(@types/node@24.12.4)(typescript@5.9.3):
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.11
@@ -13198,6 +14956,8 @@ snapshots:
       typescript: 5.9.3
       v8-compile-cache-lib: 3.0.1
       yn: 3.1.1
+    optionalDependencies:
+      '@swc/core': 1.15.41
 
   tsconfig-paths@3.15.0:
     dependencies:
@@ -13226,12 +14986,6 @@ snapshots:
     dependencies:
       prelude-ls: 1.2.1
 
-  type-is@2.0.1:
-    dependencies:
-      content-type: 1.0.5
-      media-typer: 1.1.0
-      mime-types: 3.0.1
-
   typed-array-buffer@1.0.3:
     dependencies:
       call-bound: 1.0.4
@@ -13355,7 +15109,12 @@ snapshots:
       unist-util-is: 6.0.0
       unist-util-visit-parents: 6.0.1
 
-  unpipe@1.0.0: {}
+  universalify@2.0.1: {}
+
+  unplugin@1.16.1:
+    dependencies:
+      acorn: 8.16.0
+      webpack-virtual-modules: 0.6.2
 
   unrs-resolver@1.12.2:
     dependencies:
@@ -13400,8 +15159,25 @@ snapshots:
 
   url-join@4.0.1: {}
 
+  url@0.11.4:
+    dependencies:
+      punycode: 1.4.1
+      qs: 6.15.2
+
   util-deprecate@1.0.2: {}
 
+  util@0.12.5:
+    dependencies:
+      inherits: 2.0.4
+      is-arguments: 1.2.0
+      is-generator-function: 1.1.2
+      is-typed-array: 1.1.15
+      which-typed-array: 1.1.19
+
+  utila@0.4.0: {}
+
+  uuid@9.0.1: {}
+
   v8-compile-cache-lib@3.0.1: {}
 
   validate-npm-package-name@7.0.2: {}
@@ -13413,8 +15189,6 @@ snapshots:
 
   vanilla-colorful@0.7.2: {}
 
-  vary@1.1.2: {}
-
   vfile-message@4.0.3:
     dependencies:
       '@types/unist': 3.0.3
@@ -13455,6 +15229,22 @@ snapshots:
       webpack: 5.107.1(postcss@8.5.15)(webpack-cli@6.0.1)
       webpack-merge: 6.0.1
 
+  webpack-dev-middleware@6.1.3(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)):
+    dependencies:
+      colorette: 2.0.20
+      memfs: 3.5.3
+      mime-types: 2.1.35
+      range-parser: 1.2.1
+      schema-utils: 4.3.3
+    optionalDependencies:
+      webpack: 5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15)
+
+  webpack-hot-middleware@2.26.1:
+    dependencies:
+      ansi-html-community: 0.0.8
+      html-entities: 2.6.0
+      strip-ansi: 6.0.1
+
   webpack-merge@6.0.1:
     dependencies:
       clone-deep: 4.0.1
@@ -13463,6 +15253,86 @@ snapshots:
 
   webpack-sources@3.4.1: {}
 
+  webpack-virtual-modules@0.6.2: {}
+
+  webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(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.21.6
+      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.41)(esbuild@0.25.12)(postcss@8.5.15)(webpack@5.107.1(@swc/core@1.15.41)(esbuild@0.25.12)(postcss@8.5.15))
+      watchpack: 2.5.1
+      webpack-sources: 3.4.1
+    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(@swc/core@1.15.41)(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.21.6
+      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.41)(postcss@8.5.15)(webpack@5.107.1(@swc/core@1.15.41)(postcss@8.5.15))
+      watchpack: 2.5.1
+      webpack-sources: 3.4.1
+    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(postcss@8.5.15):
     dependencies:
       '@types/estree': 1.0.8
@@ -13647,6 +15517,8 @@ snapshots:
 
   yallist@5.0.0: {}
 
+  yaml@1.10.3: {}
+
   yaml@2.9.0: {}
 
   yargs-parser@20.2.9: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index aa672f6477..fab453f6be 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -26,6 +26,12 @@ catalog:
   '@eslint/eslintrc': ^3.3.1
   '@eslint/js': ^9.33.0
   '@playwright/test': ^1.59.1
+  '@storybook/addon-essentials': ^8.6.14
+  '@storybook/addon-interactions': ^8.6.14
+  '@storybook/addon-webpack5-compiler-swc': ^2.1.0
+  '@storybook/html': ^8.6.14
+  '@storybook/html-webpack5': ^8.6.14
+  '@storybook/test': ^8.6.14
   '@stylistic/eslint-plugin': ^5.2.3
   '@types/eslint': ^9.6.1
   '@types/node': ^24.12.4
@@ -62,6 +68,7 @@ catalog:
   semver: ^7.6.2
   source-map-loader: ^5.0.0
   style-loader: ^4.0.0
+  storybook: ^8.6.14
   terser-webpack-plugin: ^5.3.10
   ts-node: ^10.9.2
   tsx: ^4.20.6
diff --git a/tests/constants/README.md b/tests/constants/README.md
new file mode 100644
index 0000000000..6dd22b01bd
--- /dev/null
+++ b/tests/constants/README.md
@@ -0,0 +1,29 @@
+# @coremedia/ckeditor5-itest-constants
+
+Constants shared between the two integration-test packages:
+
+- `@coremedia/ckeditor5-storybook-itest` (`tests/storybook`) — renders the
+  prepared stories and the observable outputs harness.
+- `@coremedia/ckeditor5-playwright-itest` (`tests/playwright`) — drives those
+  stories through Playwright locators.
+
+Both packages previously kept independent, hand-synced copies of these literals
+(the comment "kept in sync by value to avoid a build-time dependency"). This
+package removes that duplication: it is consumed as TypeScript source (`main`
+points at `src/index.ts`), so there is no build step and no risk of drift.
+
+## What lives here
+
+- `scenarioContract.ts` — the scenario container contract
+  (`EDITOR_ELEMENT_ID`, `SCENARIO_CONTAINER_CLASS`, `EDITOR_READY_ATTRIBUTE`).
+- `outputs.ts` — the observable outputs harness ids (`OUTPUT_TEST_IDS`,
+  `OUTPUTS_CONTAINER_CLASS`) and the derived `ScenarioOutput` union.
+- `mockFixtures.ts` — shared blob/content fixtures (e.g. the `PNG_*` image
+  blobs) baked into prepared stories and asserted by their tests.
+- `stories/*` — per-story fixtures shared by a prepared story and its test
+  (for example `helloEditorScenario`). Story files are CSF, so per-story
+  fixtures cannot be exported from the story module itself and live here
+  instead. Most of these keep no heavy dependencies; the sole exception is
+  `stories/differencing.ts`, which depends on the example-data package because
+  the augmented `` markup it generates _is_ the value under test and
+  must be byte-identical in both the story data and the test assertions.
diff --git a/tests/constants/eslint.config.mjs b/tests/constants/eslint.config.mjs
new file mode 100644
index 0000000000..d0a471913c
--- /dev/null
+++ b/tests/constants/eslint.config.mjs
@@ -0,0 +1,3 @@
+import { createEslintConfig } from "@coremedia/studio-client.eslint-config";
+
+export default createEslintConfig();
diff --git a/tests/constants/package.json b/tests/constants/package.json
new file mode 100644
index 0000000000..a562d508b2
--- /dev/null
+++ b/tests/constants/package.json
@@ -0,0 +1,27 @@
+{
+  "name": "@coremedia/ckeditor5-itest-constants",
+  "version": "27.0.0",
+  "author": "CoreMedia GmbH",
+  "license": "Apache-2.0",
+  "type": "module",
+  "private": true,
+  "description": "Constants shared between the Storybook and Playwright integration-test packages.",
+  "main": "./src/index.ts",
+  "files": [
+    "/src"
+  ],
+  "dependencies": {
+    "@coremedia-internal/ckeditor5-coremedia-example-data": "workspace:^1.0.0-SNAPSHOT"
+  },
+  "devDependencies": {
+    "@coremedia/studio-client.build-config": "catalog:",
+    "@coremedia/studio-client.eslint-config": "catalog:",
+    "@types/node": "catalog:",
+    "eslint": "catalog:",
+    "typescript": "catalog:"
+  },
+  "scripts": {
+    "typecheck": "tsc --noEmit",
+    "lint": "eslint"
+  }
+}
diff --git a/tests/constants/src/index.ts b/tests/constants/src/index.ts
new file mode 100644
index 0000000000..83f638508c
--- /dev/null
+++ b/tests/constants/src/index.ts
@@ -0,0 +1,21 @@
+/**
+ * Constants shared between the Storybook (`@coremedia/ckeditor5-storybook-itest`)
+ * and Playwright (`@coremedia/ckeditor5-playwright-itest`) integration-test
+ * packages. Centralizing them here replaces the former "kept in sync by value"
+ * copies that lived independently in each package.
+ */
+export * from "./scenarioContract";
+export * from "./outputs";
+export * from "./mockFixtures";
+export * from "./stories/bbCode";
+export * from "./stories/blocklist";
+export * from "./stories/blocklistWords";
+export * from "./stories/contentLink";
+export * from "./stories/differencing";
+export * from "./stories/documentLists";
+export * from "./stories/dragDrop";
+export * from "./stories/helloEditor";
+export * from "./stories/images";
+export * from "./stories/linkBalloon";
+export * from "./stories/linkUserInteraction";
+export * from "./stories/pasteButton";
diff --git a/tests/constants/src/mockFixtures.ts b/tests/constants/src/mockFixtures.ts
new file mode 100644
index 0000000000..2f84b12a52
--- /dev/null
+++ b/tests/constants/src/mockFixtures.ts
@@ -0,0 +1,80 @@
+/* eslint @typescript-eslint/naming-convention: off */
+
+/**
+ * Blob and content-name fixtures shared between the Storybook
+ * (`@coremedia/ckeditor5-storybook-itest`) and Playwright
+ * (`@coremedia/ckeditor5-playwright-itest`) integration-test packages.
+ *
+ * Stories bake these into their prepared mock contents, while the Playwright
+ * tests reference the same values for their assertions, so neither package
+ * mirrors the base64 literals by hand.
+ */
+
+/**
+ * Example Blob Fixture for 10×10 Red PNG.
+ */
+export const PNG_RED_10x10 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAAA1BMVEX/AAAZ4gk3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQIHWPACwAAHgAB95hMXAAAAABJRU5ErkJggg==";
+/**
+ * Example Blob Fixture for 240×135 Red PNG.
+ */
+export const PNG_RED_240x135 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAACHCAIAAACnEEO8AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAACB0RVh0VGl0bGUAUmVkIEltYWdlIEZpeHR1cmUgMjQww5cxMzV/6oVFAAABEklEQVR42u3SAQkAAAgEMbV/5zeGIFuE4zoFf4wEGBoMDYYGQ2NoMDQYGgwNhsbQYGgwNBgaDI2hwdBgaDA0GBpDg6HB0GBoMDSGBkODocHQYGgMDYYGQ4OhwdAYGgwNhgZDY2gwNBgaDA2GxtBgaDA0GBoMjaHB0GBoMDQYGkODocHQYGgwNIYGQ4OhwdBgaAwNhgZDg6HB0BgaDA2GBkODoTE0GBoMDYYGQ2NoMDQYGgwNhsbQYGgwNBgaDI2hwdBgaDA0GBpDg6HB0GBoMDSGBkODocHQYGgMDYaGMwvY/gIN7U7I3gAAAABJRU5ErkJggg==";
+/**
+ * Example Blob Fixture for 10×10 Green PNG.
+ */
+export const PNG_GREEN_10x10 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAAA1BMVEUA/wA0XsCoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQIHWPACwAAHgAB95hMXAAAAABJRU5ErkJggg==";
+/**
+ * Example Blob Fixture for 240×135 Green PNG.
+ */
+export const PNG_GREEN_240x135 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAACHCAIAAACnEEO8AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAACJ0RVh0VGl0bGUAR3JlZW4gSW1hZ2UgRml4dHVyZSAyNDDDlzEzNeoCT9oAAAESSURBVHja7dIBCQAACASx1/6dNYYgW4TjKhN4oyXA0GBoMDQYGkODocHQYGgwNIYGQ4OhwdBgaAwNhgZDg6HB0BgaDA2GBkODoTE0GBoMDYYGQ2NoMDQYGgwNhsbQYGgwNBgaQ4OhwdBgaDA0hgZDg6HB0GBoDA2GBkODocHQGBoMDYYGQ4OhMTQYGgwNhgZDY2gwNBgaDA2GxtBgaDA0GBoMjaHB0GBoMDSGBkODocHQYGgMDYYGQ4OhwdAYGgwNhgZDg6ExNBgaDA2GBkNjaDA0GBoMDYbG0GBoMDQYGgyNocHQYGgwNIYGQ4OhwdBgaAwNhgZDg6HB0BgaDA2GBkODoTE0GBoMDYYGQ2NoMDScWdf/Ag1zS0U/AAAAAElFTkSuQmCC";
+/**
+ * Example Blob Fixture for 10×10 Blue PNG.
+ */
+export const PNG_BLUE_10x10 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAAA1BMVEUAAP+KeNJXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQIHWPACwAAHgAB95hMXAAAAABJRU5ErkJggg==";
+/**
+ * Example Blob Fixture for 240×135 Blue PNG.
+ */
+export const PNG_BLUE_240x135 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAACHCAIAAACnEEO8AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAACF0RVh0VGl0bGUAQmx1ZSBJbWFnZSBGaXh0dXJlIDI0MMOXMTM1kw6skwAAARNJREFUeNrt0gEJAAAIBLHX/p01hiBbhOMqmcAXLQGGBkODocHQGBoMDYYGQ4OhMTQYGgwNhgZDY2gwNBgaDA2GxtBgaDA0GBoMjaHB0GBoMDQYGkODocHQYGgwNIYGQ4OhwdAYGgwNhgZDg6ExNBgaDA2GBkNjaDA0GBoMDYbG0GBoMDQYGgyNocHQYGgwNBgaQ4OhwdBgaDA0hgZDg6HB0GBoDA2GBkODoTE0GBoMDYYGQ2NoMDQYGgwNhsbQYGgwNBgaDI2hwdBgaDA0GBpDg6HB0GBoMDSGBkODocHQYGgMDYYGQ4OhMTQYGgwNhgZDY2gwNBgaDA2GxtBgaDA0GBoMjaHB0GBoMDQYGkODoeHMAtcAAg2/P7w5AAAAAElFTkSuQmCC";
+/**
+ * Example Blob Fixture for 10×10 Gray PNG.
+ */
+export const PNG_GRAY_10x10 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKBAMAAAB/HNKOAAAAMFBMVEXIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgyCeFrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAC0lEQVQIHWOgAAAAADwAAZFvo9AAAAAASUVORK5CYII=";
+/**
+ * Example Blob Fixture for unreadable state as 24×24 lock-symbol PNG.
+ */
+export const PNG_LOCK_24x24 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAB90RVh0VGl0bGUATG9jayBJbWFnZSBGaXh0dXJlIDI0w5cyND+RntEAAAFYSURBVEiJ7ZUxq4JQGIYfL2kRBUK0tDZY0C9pcmlMpCIa+ymtTUKr0OCU/6ExCIuoxYZAcLMMvHe6LabhJYcLvdPhnPO+D+f7PjjCer3+Jkd95RkOUHh1IQxDlsslq9WKw+EAQLPZpNvtoqoqkiSl+oW0El0uF6bTKbvdDlmW6XQ6AGw2G3zfR1EUZrMZ9Xo9O+B+v6PrOvv9nslkQr/fRxTFx9lisWA+n6MoCoZhUCg8L0ZiDyzLwnEcxuMxg8HgEQ4giiLD4ZDRaMR2u8WyrMQXJAJs26ZaraJpWqJZ13UqlQq2bWcHnE4n2u12ahMlSaLVanE8HrMDgiCgVColGn9VLpcJgiA74F3KHRAb0zAM6fV6nM9nisUitVotNcDzPG63G41GA9M0Yz2LDW8URbiuC8D1en2sX8l1XaIoiu3//x58AB9ADgBBEP4c9syb+mW+Q7mX6AcWeH9EMzKhnwAAAABJRU5ErkJggg==";
+/**
+ * Example Blob Fixture for empty state as 24×24 symbol PNG.
+ */
+export const PNG_EMPTY_24x24 =
+  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAACB0RVh0VGl0bGUARW1wdHkgSW1hZ2UgRml4dHVyZSAyNMOXMjRSzyF5AAABjklEQVRIidWUsYrCQBRFz0osJIiViKCIFv5AwEZSpLRMo1jkEyyENGKjtWBj5Q+k9QOsRCSIWitioSgWgoKmd7dYtFkTE0mKvdUMb949M+/NzNd8Pv8mQIWCNAcQ7AKXywXTNJlOp+x2O06nE+fzmWg0Si6XQ1EUVFUlEok4Ar7sStTtdjEMwzE5nU7T6/VIpVLeT/CQJEkUi0UymQyCIHA8HhkMBqzXa/b7PfV6HcMwCIfD3k4wHo9JJBLk8/k/sfv9TrPZZDgcAtDpdFAU5SXAtsmyLL80BwiFQqiq+pyvVis7m89vUTwed7XuY8Bms3mOs9msvwDLsuj3+wDEYjFkWfYPcL1e0XWd7XYLgK7riKLoD8A0TarVKovFAkEQaDQalEolx5y37wDgdrvRbrcZjUYAJJNJWq0WkiS9zXUFOBwOT/NyuUytVnv7RTzkuQeVSsW1+UcAr3JVIlEUKRQKAJ52Dw5/kV8KvESuALPZDE3T0DSNyWTiCeCqB5ZlsVwugd+X7EWBl+j/N/kHBzKDUUt0TnMAAAAASUVORK5CYII=";
+
+/**
+ * A content name containing several entities.
+ */
+export const CONTENT_NAME_CHALLENGE_ENTITIES = "<br>&"Ɯ";
+/**
+ * A content name with various charsets.
+ */
+export const CONTENT_NAME_CHALLENGE_CHARSETS = "年Ϩ";
+/**
+ * A content name with RTL characters.
+ */
+export const CONTENT_NAME_CHALLENGE_RTL = "عامعام";
+/**
+ * A content name, which challenges possible Cross-Site-Scripting-Attacks.
+ */
+export const CONTENT_NAME_CHALLENGE_XSS = `